目录
一、crypto-js
- CryptoJS (crypto.js) 是谷歌开发的一个纯JavaScript的加密算法类库,可以非常方便的在前端进行其所支持的加解密操作
- 目前crypto-js已支持的算法有:
MD5
、AES
、DES
、DES3
等加密 - 本地需安装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版权协议,转载请附上原文出处链接和本声明。