常见加密、解密算法实现(JS、python)
-
base64
-
Nodejs
const CryptoJS = require('crypto-js') // 加密 let pwd = '密码' let b64_pwd = Buffer.from(pwd).toString('base64') console.log(b64_pwd) // 5a+G56CB // 解密 console.log(Buffer.from(b64_pwd, 'base64').toString()) // 密码
-
python
import base64 # 加密 pwd = '密码' b64_pwd = base64.b64encode(pwd.encode('utf-8')) print(b64_pwd) # 解密 print(base64.b64decode(b64_pwd).decode('utf-8'))
-
-
MD5/SHA1
-
逆向关键词:md5 / sha1
-
Nodejs
const CryptoJS = require('crypto-js') let pwd = '密码' // md5加密 let md5_enc_pwd = CryptoJS.MD5(pwd).toString() // sha1加密 let sha1_enc_pwd = CryptoJS.SHA1(pwd).toString() console.log(md5_enc_pwd) // a8105204604a0b11e916f3879aae3b0b console.log(sha1_enc_pwd) // c839a8ff17885af0b098662ccc3ac5e3111b3b3b
-
python
from hashlib import md5, sha1 # 加密 pwd = '密码' print(md5(pwd.encode('utf-8')).hexdigest()) print(sha1(pwd.encode('utf-8')).hexdigest())
-
-
HMAC
-
Nodejs
const CryptoJS = require('crypto-js') let key = 'key' // 密钥 let pwd = '密码' // hmac中的sha256加密 let hash = CryptoJS.HmacSHA256(pwd, key) let hmac_sha256_pwd = CryptoJS.enc.Hex.stringify(hash) console.log(hmac_sha256_pwd) // 2c3a5556c71f76f1270ca87db60e1e91c69d812d748767468459a46912feed9c
-
python
import hashlib import hmac # 加密 key = 'key' pwd = '密码' enc_pwd = hmac.new(key.encode('utf-8'), pwd.encode('utf-8'), hashlib.sha256).hexdigest() print(enc_pwd)
-
-
DES
-
js逆向关键词:DES、mode、padding等
-
Nodejs
const CryptoJS = require('crypto-js') let key = '12345678' // 密钥 let pwd = '密码' let new_key = CryptoJS.enc.Utf8.parse(key) let new_pwd = CryptoJS.enc.Utf8.parse(pwd) let config = { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 } // 加密 let enc_pwd = CryptoJS.DES.encrypt(new_pwd, new_key, config).toString() console.log(enc_pwd) // 80lOPdkA6f4= // 解密 let dec_pwd = CryptoJS.DES.decrypt(enc_pwd, new_key, config).toString(CryptoJS.enc.Utf8) console.log(dec_pwd)
- python
import base64 from Crypto.Cipher import DES from Crypto.Util.Padding import pad def encrypt(key, text, mode): ''' DES加密 :param key: 密钥 :param text: 待加密文本 :param mode: 模式 :return: ''' key = key.encode('utf-8') text = text.encode('utf-8') pad_text = pad(text, DES.block_size, style='pkcs7') cipher = DES.new(key, mode) enc_data = cipher.encrypt(pad_text) return base64.b64encode(enc_data).decode('utf-8') def decrypt(key, text, mode): ''' DES解密 :param key: 密钥 :param text: 待解密文本 :param mode: 模式 :return: ''' new_key = key.encode('utf-8') new_text = base64.b64decode(text) # base64解码 cipher = DES.new(new_key, mode) dec_data = cipher.decrypt(new_text)return dec_data[:-dec_data[-1]].decode('utf-8') # 去除末尾填充的字符 if __name__ == "__main__": key = '12345678' pwd = '密码' enc_pwd = encrypt(key, pwd, DES.MODE_ECB) print(enc_pwd) dec_data = decrypt(key, enc_pwd, DES.MODE_ECB) print(dec_data)
ECB模式没有使用初始化向量(IV)
-
-
AES
-
逆向关键词:AES、mode、padding等
-
Nodejs
const CryptoJS = require('crypto-js') let pwd = "密码"; let key = "1234567890abcdef" let new_key = CryptoJS.enc.Utf8.parse(key) let new_pwd = CryptoJS.enc.Utf8.parse(pwd) let cfg = { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 } // AES加密 let enc_pwd = CryptoJS.AES.encrypt(new_pwd, new_key, cfg).toString() console.log(enc_pwd) // cdT+fh971Dgn3ji5v3+0AQ== // AES解密 let dec_pwd = CryptoJS.AES.decrypt(enc_pwd, new_key, cfg).toString(CryptoJS.enc.Utf8) // 指定解码方式 console.log(dec_pwd) // 密码
-
python
import base64 from Crypto.Cipher import AES from Crypto.Util.Padding import pad def encrypt(key, text, mode): ''' AES加密 :param key: 密钥 :param text: 待加密文本 :param mode: 模式 :return: ''' key = key.encode('utf-8') text = text.encode('utf-8') pad_text = pad(text, AES.block_size, style='pkcs7') cipher = AES.new(key, mode) enc_data = cipher.encrypt(pad_text) return base64.b64encode(enc_data).decode('utf-8') def decrypt(key, text, mode): ''' AES解密 :param key: 密钥 :param text: 待解密文本 :param mode: 模式 :return: ''' new_key = key.encode('utf-8') new_text = base64.b64decode(text) # base64解码 cipher = AES.new(new_key, mode) dec_data = cipher.decrypt(new_text) print(dec_data) return dec_data[:-dec_data[-1]].decode('utf-8') # 去除末尾填充的字符 if __name__ == "__main__": key = '1234567890abcdef' pwd = '密码' enc_pwd = encrypt(key, pwd, AES.MODE_ECB) print(enc_pwd) dec_data = decrypt(key, enc_pwd, AES.MODE_ECB) print(dec_data)
-
-
RSA
-
逆向关键词:setPublicKey
-
Nodejs
window = global; const JSEncrypt = require('jsencrypt'); // npm install [email protected] publickey = ` -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCdRivxDSsUknPXJ4iGLwmezwgc 1mue6d+Xyf67NWeHc6vC5vq2BfSmGgOz42dQ1JOwzWM+1TG6gocJbfSSsW1dFy3G sMLUblq1iIQ9/NZLjGRgF7+MUxCxTp+okPyhhUCeeg7u44B9F3OdDXIc3peAs4hV QI241AHnQqKJJVrEIwIDAQAB -----END PUBLIC KEY----- `; // 加密 let jse = new JSEncrypt(); jse.setPublicKey(publickey); var enc_pwd = jse.encrypt('密码'); console.log(enc_pwd) // dYxPVvIG/O2rHq0M6IG1H2yB0euqgL3pJ8jS+oFyGg7ZNHsWtLH/T6sYFRmVeMQwPJ4+c0ReEr/8wdzPcDg8NA== // 解密 privatekey = ` -----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQCdRivxDSsUknPXJ4iGLwmezwgc1mue6d+Xyf67NWeHc6vC5vq2 BfSmGgOz42dQ1JOwzWM+1TG6gocJbfSSsW1dFy3GsMLUblq1iIQ9/NZLjGRgF7+M UxCxTp+okPyhhUCeeg7u44B9F3OdDXIc3peAs4hVQI241AHnQqKJJVrEIwIDAQAB AoGAPW7dGDYUF1+Tlz3ugreZ8uoc2aLZ/AOP3ss80OSt8Yd51tKBqRtPcphjzN8t irHWlO/Nbgw59ggpdkH4kFp1BJRyqTIxNibZaBK4vrvP6nnta6Us3zsdmYvql6v8 zpa7mIiXkchftj2M2bZEsJib3Xor9idzg805H2pyYWSsd2ECQQDAG/7tIHJ5hsAa dyqjbHDpFoVa1t6JpNVlttj+NLIuQKi8Atd5xXF5SPGFwVjeYfyvFbPp0rAoFje1 ldfUNB5DAkEA0ZRWIOHOMV+h2NMx5PCRnPClmx450I2bqdOo14CnG6gmipw15Oh5 oeLGqM1XsNKobDclU8YbR5B/YRxaw8eUoQJAEnYeR3doyNj0ORbemBnht+ScKCCh /iRDBaVOsQ8rWFqKXJcBUghxYTBrVWlBOw27lK/HPF8s4o1QCTk/JntjtQJAQKk/ mY2RjHIxATDH6BbBFma48Y71z36hVFhVc4fiBwpuOb3Qcvu261eIa3RPZeLYy+qH vb0VlZLjehbBej4NgQJAF9RKBmh7VtqrzhBU53KzVzpwSUdpiuNGnb563xNt4FtS Ybwh5wrMDHf6y8GNUgI2ICKZA+0LCWDs/PxekA8URg== -----END RSA PRIVATE KEY----- ` jse.setPrivateKey(privatekey); var dec_pwd = jse.decrypt(enc_pwd); console.log(dec_pwd) // 加密
每次加密的结果都会不同,密钥对可通过在线工具生成
-
python
import base64 from Crypto.Cipher import PKCS1_v1_5 from Crypto import Random from Crypto.PublicKey import RSA # ------------------------生成密钥对------------------------ def create_rsa_pair(is_save=False): ''' 创建rsa公钥私钥对 :param is_save: default:False :return: public_key, private_key ''' f = RSA.generate(1024) private_key = f.exportKey("PEM") # 生成私钥 public_key = f.publickey().exportKey() # 生成公钥 if is_save: with open("crypto_private_key.pem", "wb") as f: f.write(private_key) with open("crypto_public_key.pem", "wb") as f: f.write(public_key) return public_key, private_key def read_public_key(file_path="crypto_public_key.pem") -> bytes: with open(file_path, "rb") as x: b = x.read() return b def read_private_key(file_path="crypto_private_key.pem") -> bytes: with open(file_path, "rb") as x: b = x.read() return b # ------------------------加密------------------------ def encryption(text: str, public_key: bytes): # 字符串指定编码(转为bytes) text = text.encode('utf-8') # 构建公钥对象 cipher_public = PKCS1_v1_5.new(RSA.importKey(public_key)) # 加密(bytes) text_encrypted = cipher_public.encrypt(text) # base64编码,并转为字符串 text_encrypted_base64 = base64.b64encode(text_encrypted).decode() return text_encrypted_base64 # ------------------------解密------------------------ def decryption(text_encrypted_base64: str, private_key: bytes): # 字符串指定编码(转为bytes) text_encrypted_base64 = text_encrypted_base64.encode('utf-8') # base64解码 text_encrypted = base64.b64decode(text_encrypted_base64) # 构建私钥对象 cipher_private = PKCS1_v1_5.new(RSA.importKey(private_key)) # 解密(bytes) text_decrypted = cipher_private.decrypt(text_encrypted, Random.new().read) # 解码为字符串 text_decrypted = text_decrypted.decode() return text_decrypted if __name__ == '__main__': # 生成密钥对 public_key, private_key = create_rsa_pair(is_save=False) # create_rsa_pair(is_save=True) # public_key = read_public_key() # private_key = read_private_key() # 加密 pwd = '密码' enc_pwd = encryption(pwd, public_key) print('密文:', enc_pwd) # 解密 dec_pwd = decryption(enc_pwd, private_key) print('明文:', dec_pwd)
-