JS逆向加密-Cryptojs库AES/DES/RSA等代码

一、crypto-js

  • CryptoJS (crypto.js) 是谷歌开发的一个纯JavaScript的加密算法类库,可以非常方便的在前端进行其所支持的加解密操作
  • 目前crypto-js已支持的算法有:MD5AESDESDES3等加密
  • 本地需安装node环境,然后再安装crypto-js库: npm install crypto-js -g

二、nodejs之md5、sha1、sha256、base64

  • 安装:npm install crypto-js -g
  • md5、sha1、sha256加密
    var CryptoJS = require("crypto-js");
    // var md5 = function(a){
    //     return CryptoJS.MD5(a).toString()
    // };
    var md5 = require("md5");
    var sha1 = function(a){
        return CryptoJS.SHA1(a).toString();
    };
    var sha256 = function(a){
        return CryptoJS.SHA256(a).toString();
    };
    var sha512 = function(a){
        return CryptoJS.SHA512(a).toString();
    };
    var sha3 = function(a){
        return CryptoJS.SHA3(a).toString();
    };
    console.log(md5("123456"))     // e10adc3949ba59abbe56e057f20f883e
    console.log(sha1("123456"))    // 7c4a8d09ca3762af61e59520943dc26494f8941b
    console.log(sha256("123456"))  // 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92
    console.log(sha512("123456"))  // ba3253876aed6bc22d4a6ff53d8406c6ad864195ed144ab5c87621b6c233b548baeae6956df346ec8c17f5ea10f35ee3cbc514797ed7ddd3145464e2a0bab413
    console.log(sha3("123456"))    // 808d63ba47fcef6a7c52ec47cb63eb1b747a9d527a77385fc05c8a5ce8007586265d003b4130f6b0c8f3bb2ad89965a5da07289ba5d1e35321e160bea4f766f8
    
  • 安装:npm install btoa -g , npm install atob -g
  • base64或者window.btoa()或者window.atob()加密解密
    var btoa = require('btoa')
    var base64_encode = function(a){
    	return btoa(a)
    }
    console.log(base64_encode(12345))  // MTIzNDU=
    
    var atob = require('atob')
    var base64_decode = function(a){
    	return atob(a)
    }
    console.log(base64_decode('MTIzNDU='))  // 12345
    

三、crypto-js之AES

  • 此脚本默认CryptoJS.enc.Utf8.parse,实际有CryptoJS.enc.Latin1.parse 以及CryptoJS.enc.Hex.parse可自行替换
  • 安装:npm install crypto-js -g
  • AES之CBC模式加密:需要key,iv和文本
    var CryptoJS = require("crypto-js");
    var encrypt_req = function(key, iv, text) {
        var l = CryptoJS.enc.Utf8.parse(text);
        var e = CryptoJS.enc.Utf8.parse(key);
        var a = CryptoJS.AES.encrypt(l, e, {
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7,
            iv: CryptoJS.enc.Utf8.parse(iv)
        })
        // return a.toString()   // 此方式返回base64  7zHGSW218ARpzbHHsA90NuWHufnCLJo94vGad3zzkANQ3sFIWhHY6pDLzelv9XUO
        return a.ciphertext.toString()   // 返回hex格式的密文  ef31c6496db5f00469cdb1c7b00f7436e587b9f9c22c9a3de2f19a777cf3900350dec1485a11d8ea90cbcde96ff5750e
    }
    
    var decrypt_req = function(key, iv, text) {
        var e = CryptoJS.enc.Utf8.parse(key);
        var WordArray = CryptoJS.enc.Hex.parse(text);  // 如果text是base64形式,该行注释掉
        var text = CryptoJS.enc.Base64.stringify(WordArray);  // 如果text是base64形式,该行注释掉
        var a = CryptoJS.AES.decrypt(text, e, {
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7,
            iv: CryptoJS.enc.Utf8.parse(iv)
        });
        return CryptoJS.enc.Utf8.stringify(a).toString()
    }
    // CBC模式加密hex
    console.log(encrypt_req("8c18266c4e8fa5de", "8c18266c4e8fa5de", '{"Type":0,"page":3,"expire":1596461032894}'));
    // CBC模式解密hex
    console.log(decrypt_req("8c18266c4e8fa5de", "8c18266c4e8fa5de", 'ef31c6496db5f00469cdb1c7b00f7436e587b9f9c22c9a3de2f19a777cf3900350dec1485a11d8ea90cbcde96ff5750e'));
    
  • AES之ECB模式加密:只需要key和文本
    var CryptoJS = require("crypto-js");
    var encrypt_req = function(key,text) {
        var l = CryptoJS.enc.Utf8.parse(text);
        var e = CryptoJS.enc.Utf8.parse(key);
        var a = CryptoJS.AES.encrypt(l, e, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        })
        return a.toString()  // 此方式返回base64  
        // return a.ciphertext.toString() // 返回hex格式的密文  
    }
    
    var decrypt_req = function(key, text) {
        var e = CryptoJS.enc.Utf8.parse(key);
        // var WordArray = CryptoJS.enc.Hex.parse(text);  // 如果text是base64形式,该行注释掉
    	// var text = CryptoJS.enc.Base64.stringify(WordArray);  // 如果text是base64形式,该行注释掉
        var a = CryptoJS.AES.decrypt(text, e, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        return CryptoJS.enc.Utf8.stringify(a).toString()
    }
    // ECB模式加密base64
    console.log(encrypt_req("8c18266c4e8fa5de", '{"Type":0,"page":3,"expire":1596461032894}'));
    // ECB模式解密base64
    console.log(decrypt_req("8c18266c4e8fa5de", 'We042pqpHGij/bmRO0iRymfnidiNft6yO04+qqyeGHJYX6aPgXVamram1FKxfBpm'));
    
    

四、crypto-js之DES

  • 此脚本默认CryptoJS.enc.Utf8.parse,实际有CryptoJS.enc.Latin1.parse以及CryptoJS.enc.Hex.parse可自行替换
  • 安装:npm install crypto-js -g
  • DES之CBC模式加密:需要key,iv和文本
    var CryptoJS = require("crypto-js");
    var encrypt_req = function(key, iv, text) {
        var l = CryptoJS.enc.Utf8.parse(text);
        var e = CryptoJS.enc.Utf8.parse(key);
        var a = CryptoJS.DES.encrypt(l, e, {
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7,
            iv: CryptoJS.enc.Utf8.parse(iv)
        })
        return a.toString()   // 此方式返回base64  nGzKZlCA7AhB7tnRNHxwcGvplRh05W+uhAi3i1c9mV3Qi4Gq+NrHeIO1P/ezY38S
        // return a.ciphertext.toString()   // 返回hex格式的密文  9c6cca665080ec0841eed9d1347c70706be9951874e56fae8408b78b573d995dd08b81aaf8dac77883b53ff7b3637f12
    }
    
    var decrypt_req = function(key, iv, text) {
        var e = CryptoJS.enc.Utf8.parse(key);
        // var WordArray = CryptoJS.enc.Hex.parse(text);  // 如果text是base64形式,该行注释掉
        // var text = CryptoJS.enc.Base64.stringify(WordArray);  // 如果text是base64形式,该行注释掉
        var a = CryptoJS.DES.decrypt(text, e, {
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7,
            iv: CryptoJS.enc.Utf8.parse(iv)
        });
        return CryptoJS.enc.Utf8.stringify(a).toString()
    }
    
    // CBC模式加密
    console.log(encrypt_req("8c18266c4e8fa5de", "8c18266c4e8fa5de", '{"Type":0,"page":3,"expire":1596461032894}'));
    // CBC模式解密
    console.log(decrypt_req("8c18266c4e8fa5de", "8c18266c4e8fa5de", 'nGzKZlCA7AhB7tnRNHxwcGvplRh05W+uhAi3i1c9mV3Qi4Gq+NrHeIO1P/ezY38S'));
    
  • DES之ECB模式加密:需要key和文本
    var CryptoJS = require("crypto-js");
    var encrypt_req = function(key,text) {
        var l = CryptoJS.enc.Utf8.parse(text);
        var e = CryptoJS.enc.Utf8.parse(key);
        var a = CryptoJS.DES.encrypt(l, e, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        })
        return a.toString()  // 此方式返回base64  
        // return a.ciphertext.toString() // 返回hex格式的密文  
    }
    
    var decrypt_req = function(key, text) {
        var e = CryptoJS.enc.Utf8.parse(key);
        // var WordArray = CryptoJS.enc.Hex.parse(text);  // 如果text是base64形式,该行注释掉
    	// var text = CryptoJS.enc.Base64.stringify(WordArray);  // 如果text是base64形式,该行注释掉
        var a = CryptoJS.DES.decrypt(text, e, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        return CryptoJS.enc.Utf8.stringify(a).toString()
    }
    // ECB模式加密base64
    console.log(encrypt_req("8c18266c4e8fa5de", '{"Type":0,"page":3,"expire":1596461032894}'));
    // ECB模式解密base64
    console.log(decrypt_req("8c18266c4e8fa5de", 'gz4LRzOMhl4hROqy/QjLrqgVqJa5tfwjmkFyMwvVDsZP1eh0KnkOWOZh8gI5rVzs'));
    
    

五、crypto-js之3DES

  • 此脚本默认CryptoJS.enc.Utf8.parse,实际有CryptoJS.enc.Latin1.parse以及CryptoJS.enc.Hex.parse可自行替换
  • 安装:npm install crypto-js -g
  • 3DES之CBC模式加密:需要key,iv和文本
    var CryptoJS = require("crypto-js");
    var encrypt_req = function(key, iv, text) {
        var l = CryptoJS.enc.Utf8.parse(text);
        var e = CryptoJS.enc.Utf8.parse(key);
        var a = CryptoJS.TripleDES.encrypt(l, e, {
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7,
            iv: CryptoJS.enc.Utf8.parse(iv)
        })
        return a.toString()   // 此方式返回base64  l8KqKSJHOBJr2W+T99S++XdV8MTy5Yvw7eXIi35j8KoEbuJqiu2JBumzz6QUbF+S
        // return a.ciphertext.toString()   // 返回hex格式的密文  97c2aa29224738126bd96f93f7d4bef97755f0c4f2e58bf0ede5c88b7e63f0aa046ee26a8aed8906e9b3cfa4146c5f92
    }
    
    var decrypt_req = function(key, iv, text) {
        var e = CryptoJS.enc.Utf8.parse(key);
        // var WordArray = CryptoJS.enc.Hex.parse(text);  // 如果text是base64形式,该行注释掉
        // var text = CryptoJS.enc.Base64.stringify(WordArray);  // 如果text是base64形式,该行注释掉
        var a = CryptoJS.TripleDES.decrypt(text, e, {
            mode: CryptoJS.mode.CBC,
            padding: CryptoJS.pad.Pkcs7,
            iv: CryptoJS.enc.Utf8.parse(iv)
        });
        return CryptoJS.enc.Utf8.stringify(a).toString()
    }
    // CBC模式加密
    console.log(encrypt_req("8c18266c4e8fa5de", "8c18266c4e8fa5de", '{"Type":0,"page":3,"expire":1596461032894}'));
    // CBC模式解密
    console.log(decrypt_req("8c18266c4e8fa5de", "8c18266c4e8fa5de", 'l8KqKSJHOBJr2W+T99S++XdV8MTy5Yvw7eXIi35j8KoEbuJqiu2JBumzz6QUbF+S'));
    
  • 3DES之ECB模式加密:需要key和文本
    var CryptoJS = require("crypto-js");
    var encrypt_req = function(key,text) {
        var l = CryptoJS.enc.Utf8.parse(text);
        var e = CryptoJS.enc.Utf8.parse(key);
        var a = CryptoJS.TripleDES.encrypt(l, e, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        })
        return a.toString()  // 此方式返回base64  
        // return a.ciphertext.toString() // 返回hex格式的密文  
    }
    
    var decrypt_req = function(key, text) {
        var e = CryptoJS.enc.Utf8.parse(key);
        // var WordArray = CryptoJS.enc.Hex.parse(text);  // 如果text是base64形式,该行注释掉
    	// var text = CryptoJS.enc.Base64.stringify(WordArray);  // 如果text是base64形式,该行注释掉
        var a = CryptoJS.TripleDES.decrypt(text, e, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        return CryptoJS.enc.Utf8.stringify(a).toString()
    }
    // ECB模式加密
    console.log(encrypt_req("8c18266c4e8fa5de", '{"Type":0,"page":3,"expire":1596461032894}'));
    // ECB模式解密
    console.log(decrypt_req("8c18266c4e8fa5de", 'DF+VlwKig/wjEc0pEim1iuloKNBMCYW7073IWveBDgE0CCFprCEVqG2X5LBEpILq'));
    

六、Python类比Crypto-js的加密

1、md5、base64、sha

from hashlib import md5
from hashlib import sha1
import hmac
import base64


class Base64Md5Sha1HmacUtil:

    @staticmethod
    def base64_encrypt_text(decrypt_text: str) -> str:
        """
        Bse64加密
        :param decrypt_text: 明文
        :return: 密文
        """
        return base64.b64encode(decrypt_text.encode("utf-8")).decode()

    @staticmethod
    def base64_decrypt_text(encrypt_text: str) -> str:
        """
        Bse64解密
        :param encrypt_text: 密文
        :return: 明文
        """
        return base64.b64decode(encrypt_text).decode("utf-8")

    @staticmethod
    def md5_encrypt_text(decrypt_text: str) -> str:
        """
        md5加密
        :param decrypt_text: 明文
        :return: 密文
        """
        return md5(decrypt_text.encode('utf8')).hexdigest()

    @staticmethod
    def sha1_encrypt_text(decrypt_text: str) -> str:
        """
        SHA1加密
        :param decrypt_text: 明文
        :return: 密文
        """
        return sha1(decrypt_text.encode('utf8')).hexdigest()

    @staticmethod
    def hmac_encrypt_text(decrypt_text: str, key: str) -> str:
        """
        SHA1加密
        :param decrypt_text: 明文
        :param key: 密钥
        :return: 密文
        """
        mac = hmac.new(key.encode('utf-8'), decrypt_text.encode('utf-8'), md5)
        return mac.hexdigest()

2、AES

  • python安装Cryptojs的库:pip install pycryptodome
import base64
from Crypto.Util.Padding import pad
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex


class AesUtil:

    @staticmethod
    def aes_encrypt_text(decrypt_text: str, key: str, iv="", model="CBC", method="base64") -> str:
        """
        AES加密
        :param decrypt_text: 明文
        :param key: 密钥
        :param model: 加密模式: CBC, ECB
        :param iv: 密钥偏移量,只有CBC模式有
        :param method: 用base64加密还是16进制字符串
        :return: 密文
        """
        if model == 'CBC':
            aes = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
        else:
            aes = AES.new(key.encode('utf-8'), AES.MODE_ECB)
        encrypt_text = aes.encrypt(pad(decrypt_text.encode('utf-8'), AES.block_size, style='pkcs7'))
        if method == "base64":
            return base64.b64encode(encrypt_text).decode()
        else:
            return b2a_hex(encrypt_text).decode()

    @staticmethod
    def aes_decrypt_text(encrypt_text: str, key: str, iv="", model="CBC", method="base64") -> str:
        """
        AES解密
        :param encrypt_text: 密文
        :param key: 密钥
        :param model: 解密模式: CBC, ECB
        :param iv: 密钥偏移量,只有CBC模式有
        :param method: 用base64解密还是16进制字符串
        :return:解密后的数据
        """
        if model == 'CBC':
            aes = AES.new(key.encode('utf-8'), AES.MODE_CBC, iv.encode('utf-8'))
        else:
            aes = AES.new(key.encode('utf-8'), AES.MODE_ECB)
        if method == "base64":
            decrypt_text = aes.decrypt(base64.b64decode(encrypt_text)).decode('utf8')
        else:
            decrypt_text = aes.decrypt(a2b_hex(encrypt_text)).decode('utf8')
        return decrypt_text

3、DES

  • python安装Cryptojs的库:pip install pycryptodome
import base64
from Crypto.Util.Padding import pad
from Crypto.Cipher import DES3
from Crypto.Cipher import DES
from binascii import b2a_hex, a2b_hex


class DesUtil:

    @staticmethod
    def des_encrypt_text(decrypt_text: str, key: str, iv="", model="CBC", method="base64") -> str:
        """
        DES加密
        :param decrypt_text: 明文
        :param key: 密钥
        :param model: 加密模式: CBC, ECB
        :param iv: 密钥偏移量
        :param method: 用base64加密还是16进制字符串
        :return: 加密后的数据
        """
        if model == 'CBC':
            des_obj = DES.new(key[:8].encode('utf-8'), DES.MODE_CBC, iv.encode('utf-8'))
        else:
            des_obj = DES.new(key[:8].encode('utf-8'), DES.MODE_ECB)
        encrypt_text = des_obj.encrypt(pad(decrypt_text.encode('utf-8'), DES3.block_size, style='pkcs7'))
        if method == "base64":
            return base64.b64encode(encrypt_text).decode()
        else:
            return b2a_hex(encrypt_text).decode()

    @staticmethod
    def des_decrypt_text(encrypt_text: str, key: str, iv="", model="CBC", method="base64") -> str:
        """
        DES解密
        :param encrypt_text: 密文
        :param key: 秘钥
        :param model: 解密模式: CBC, ECB
        :param iv:秘钥偏移量
        :param method: 用base64解密还是16进制字符串
        :return:解密后的数据
        """
        if model == 'CBC':
            des_obj = DES.new(key[:8].encode('utf-8'), DES.MODE_CBC, iv.encode('utf-8'))
        else:
            des_obj = DES.new(key[:8].encode('utf-8'), DES.MODE_ECB)
        if method == "base64":
            decrypt_text = des_obj.decrypt(base64.b64decode(encrypt_text)).decode('utf8')
        else:
            decrypt_text = des_obj.decrypt(a2b_hex(encrypt_text)).decode('utf8')
        return decrypt_text

4、3DES

  • python安装Cryptojs的库:pip install pycryptodome
import base64
from Crypto.Util.Padding import pad
from Crypto.Cipher import DES3
from binascii import b2a_hex, a2b_hex


class Des3Util:

    @staticmethod
    def des3_encrypt_text(decrypt_text: str, key: str, iv="", model="CBC", method="base64") -> str:
        """
        DES3加密
        :param decrypt_text: 明文
        :param key: 密钥
        :param model: 加密模式: CBC, ECB
        :param iv: 密钥偏移量
        :param method: 用base64加密还是16进制字符串
        :return: 加密后的数据
        """
        if model == 'CBC':
            des3 = DES3.new(key.encode('utf-8'), DES3.MODE_CBC, iv[:8].encode('utf-8'))
        else:
            des3 = DES3.new(key.encode('utf-8'), DES3.MODE_ECB)
        encrypt_text = des3.encrypt(pad(decrypt_text.encode('utf-8'), DES3.block_size, style='pkcs7'))
        if method == "base64":
            return base64.b64encode(encrypt_text).decode()
        else:
            return b2a_hex(encrypt_text).decode()

    @staticmethod
    def des3_decrypt_text(encrypt_text: str, key: str, iv="", model="CBC", method="base64") -> str:
        """
        DES3解密
        :param encrypt_text: 密文
        :param key: 秘钥
        :param model: 解密模式: CBC, ECB
        :param iv:秘钥偏移量
        :param method: 用base64解密还是16进制字符串
        :return:解密后的数据
        """
        if model == 'CBC':
            des3 = DES3.new(key.encode('utf-8'), DES3.MODE_CBC, iv[:8].encode('utf-8'))
        else:
            des3 = DES3.new(key.encode('utf-8'), DES3.MODE_ECB)
        if method == "base64":
            decrypt_text = des3.decrypt(base64.b64decode(encrypt_text)).decode('utf8')
        else:
            decrypt_text = des3.decrypt(a2b_hex(encrypt_text)).decode('utf8')
        return decrypt_text

5、Rsa

  • python安装Cryptojs的库:pip install rsa

import base64
import rsa
from binascii import b2a_hex, a2b_hex


class RsaUtil:

    @staticmethod
    def rsa_encrypt_text1(public_key, decrypt_text: str, method="base64") -> str:
        """
        RSA加密
        :param public_key:  公钥
        :param decrypt_text: 明文
        :param method: 用base64加密还是16进制字符串
        :return: 加密后的数据
        """
        encrypt_text = rsa.encrypt(decrypt_text.encode('utf-8'), rsa.PublicKey.load_pkcs1(public_key))
        if method == "base64":
            return base64.b64encode(encrypt_text).decode()
        else:
            return b2a_hex(encrypt_text).decode()

    @staticmethod
    def rsa_encrypt_text2(public_key, _text: str, method="base64") -> str:
        """
        RSA加密,针对setPublicKey
        :param public_key:  公钥
        :param _text: 明文
        :param method: 用base64加密还是16进制字符串
        :return: 加密后的数据
        """
        encrypt_text = rsa.encrypt(_text.encode('utf-8'), rsa.PublicKey.load_pkcs1_openssl_pem(public_key))
        if method == "base64":
            return base64.b64encode(encrypt_text).decode()
        else:
            return b2a_hex(encrypt_text).decode()

    @staticmethod
    def rsa_encrypt_text3(key, _text: str, method="base64"):
        """
        RSA加密,针对new RSAKeyPair
        import rsa
        from binascii import b2a_hex
        :param key: 公钥的参数
        :param _text: 待加密的明文
        :param method: 用base64加密还是16进制字符串
        :return: 加密后的数据
        """
        e = int('010001', 16)
        n = int(key, 16)
        pub_key = rsa.PublicKey(e=e, n=n)
        encrypt_text = rsa.encrypt(_text.encode(), pub_key)
        if method == "base64":
            return base64.b64encode(encrypt_text).decode()
        else:
            return b2a_hex(encrypt_text).decode()

    @staticmethod
    def rsa_decrypt_text(private_key, encrypt_text: str, method="base64") -> str:
        """
        RSA解密
        :param private_key: 私钥
        :param encrypt_text: 密文
        :return: 明文
        """
        if method == "base64":
            decrypt_text = rsa.decrypt(base64.b64decode(encrypt_text), rsa.PrivateKey.load_pkcs1(private_key)).decode('utf8')
        else:
            decrypt_text = rsa.decrypt(a2b_hex(encrypt_text), rsa.PrivateKey.load_pkcs1(private_key)).decode('utf8')
        return decrypt_text

    @staticmethod
    def rsa_sign(private_key, decrypt_text, method="MD5"):
        """
        rsa签名
        :param private_key: 私钥
        :param decrypt_text: 明文
        :param method: 'MD5', 'SHA-1','SHA-224', SHA-256', 'SHA-384' or 'SHA-512'
        :return:
        """
        sign_text = rsa.sign(decrypt_text.encode('utf-8'), rsa.PrivateKey.load_pkcs1(private_key), method)
        sign_text = base64.b64encode(sign_text).decode()
        return sign_text

    @staticmethod
    def rsa_verify(signature, public_key, decrypt_text):
        """
        rsa验签
        :param signature: rsa签名
        :param public_key: 公钥
        :param decrypt_text: 明文
        :return:
        """
        return rsa.verify(decrypt_text.encode('utf-8'), base64.b64decode(signature), rsa.PublicKey.load_pkcs1(public_key))

版权声明:本文为weixin_43411585原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。