zoukankan      html  css  js  c++  java
  • 常见加密算法的 JS 实现

    前言

    为破解前端加密做准备,先了解一些常见的加密算法

    分类

    • 对称加密
      采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

    DES

    DES 算法把 64 位(8 字节)的明文输入块变为 64 位的密文输出块(分组加密),它所使用的密钥也是 64 位(不足 64 位会自动补齐)
    弊端:只能加密最大 64 位数据

    关键参数:密钥 key
    JS 实现

    <script src="https://cdn.bootcss.com/crypto-js/3.1.9-1/crypto-js.min.js"></script>
    <script>
    //DES 加密
    function encryptByDES(message, key){
        var keyHex = CryptoJS.enc.Utf8.parse(key);
        var encrypted = CryptoJS.DES.encrypt(message, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        return encrypted.ciphertext.toString();
    }
    //DES 解密
    function decryptByDES(ciphertext, key){
        var keyHex = CryptoJS.enc.Utf8.parse(key);
        var decrypted = CryptoJS.DES.decrypt({
            ciphertext: CryptoJS.enc.Hex.parse(ciphertext)
        }, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        var result_value = decrypted.toString(CryptoJS.enc.Utf8);
        return result_value;
    }
    </script>
    
    //调用
    <script>
    var message = '111111';//需要加密的数据
    var key = '12345678';//加密密钥 key
    var desMessage = 'xxxxxxxxxx';
    //加密
    desMessage = encryptByDES(message, key);
    console.log(desMessage);
    //解密
    message = decryptByDES(desMessage,key)
    console.log(message);
    </script>
    

    可以看到,加解密时最重要的一个东西便是密钥 key

    AES

    DES 的升级替代品,AES 为分组密码,分组密码也就是把明文分成一组一组的,每组长度相等,每次加密一组数据,直到加密完整个明文。
    在 AES 标准规范中,分组长度只能是 128 位,也就是说,每个分组为 16 个字节(每个字节 8 位)。密钥的长度可以使用 128 位、192 位或 256 位。密钥的长度不同,推荐加密轮数也不同

    关键参数:密钥 key,偏移量 iv
    JS 实现:

    //首先要引入 https://github.com/sytelus/CryptoJS 中的两个文件
    <script src="./rollups/aes.js"></script>
    <script src="./components/pad-zeropadding.js"></script>//这个文件不是固定的,需要根据不同的填充方式而更改
    <script>
    function encryptByAES(data, key, iv){
        var key  = CryptoJS.enc.Latin1.parse(key);
        var iv   = CryptoJS.enc.Latin1.parse(iv);
        var encrypted = CryptoJS.AES.encrypt(data,key,{iv:iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});
        return encrypted.ciphertext.toString();
    }
    function decryptByAES(data, key, iv){
        var key  = CryptoJS.enc.Latin1.parse(key);
        var iv   = CryptoJS.enc.Latin1.parse(iv);
        var decrypted = CryptoJS.AES.decrypt(data,key,{iv:iv,padding:CryptoJS.pad.ZeroPadding});
        return decrypted.ciphertext.toString();
    }
    </script>
    
    • 非对称加密
      非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。
      在公开密钥密码体制中,加密密钥(即公开密钥)PK 是公开信息,而解密密钥(即秘密密钥)SK是需要保密的。加密算法E和解密算法D也都是公开的。虽然解密密钥 SK 是由公开密钥 PK 决定的,但却不能根据 PK 计算出 SK。

    RSA

    RSA 公开密钥密码体制的原理是:根据数论,寻求两个大素数比较简单,而将它们的乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥

    关键参数:公钥 PUBLIC_KEY,私钥 PRIVATE_KEY
    JS 实现:

    <script src="https://cdn.bootcss.com/jsencrypt/3.0.0-beta.1/jsencrypt.js"></script>
    <script>
    var PUBLIC_KEY = '公钥';
    var PRIVATE_KEY = '私钥';
    var message = 'xxxxxxx';
    var encryptmsg = 'testtest';
    //使用公钥加密
    function encryptByRSA(data, pub_key){
        var encrypt = new JSEncrypt();
        encrypt.setPublicKey('-----BEGIN PUBLIC KEY-----' + pub_key + '-----END PUBLIC KEY-----');
        var encrypted = encrypt.encrypt(data);
        return encrypted;
    }
    
    //使用私钥解密
    function decryptByRSA(data, pri_key){
        var decrypt = new JSEncrypt();
        decrypt.setPrivateKey('-----BEGIN RSA PRIVATE KEY-----'+ pri_key +'-----END RSA PRIVATE KEY-----');
        var decrypted = decrypt.decrypt(encrypted);
        return decrypted;
    }
    </script>
    
  • 相关阅读:
    ini_set /ini_get函数功能-----PHP
    【转】那个什么都懂的家伙
    word 2007为不同页插入不同页眉页脚
    August 26th 2017 Week 34th Saturday
    【2017-11-08】Linux与openCV:opencv版本查看及库文件位置等
    August 25th 2017 Week 34th Friday
    August 24th 2017 Week 34th Thursday
    August 23rd 2017 Week 34th Wednesday
    August 22nd 2017 Week 34th Tuesday
    August 21st 2017 Week 34th Monday
  • 原文地址:https://www.cnblogs.com/wjrblogs/p/13730128.html
Copyright © 2011-2022 走看看