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>
    
  • 相关阅读:
    Linux外部设备的使用
    Linux硬件信息查询
    Linux中swap分区设置
    状态检测型防火墙
    CentOS更换源,亲测可用
    Linux文件权限序列简述
    Linux终端打印文本色彩
    Linux 系统命令之netstat
    Linux配置DNS服务器
    水题一枚
  • 原文地址:https://www.cnblogs.com/wjrblogs/p/13730128.html
Copyright © 2011-2022 走看看