1.利用 Crypto 实现DES加密
from Crypto.Cipher import DES # pip install pycryptodome
from Crypto.Util.Padding import pad
from binascii import b2a_hex
# 加密函数
def des_encode_hex(key , text , iv=''):
des = DES.new(key=key.encode('utf-8') , mode=DES.MODE_CBC ,
iv=iv.encode('utf-8')) # 参数 key:密钥 mode:模式一般是DES.MODE_ECB
pad_pkcs7 = pad(text.encode('utf-8') , DES.block_size , style='pkcs7') # 选择pkcs7补全
encrypt_aes = des.encrypt(pad_pkcs7) # 把bytes转成16进制
return b2a_hex(encrypt_aes).decode('UTF-8')
if __name__ == '__main__':
key = '12345678'
text = '1'
iv = '87654321'
print(des_encode_hex(key=key , text=text , iv=iv)) # bbf9ad296aa381d6
2.使用pyDes 实现DES
最近遇到另一种结果 与之对应的Js代码也不太一样
import binascii # 加密模式 CBC,填充方式 PAD_PKCS5 from pyDes import des, CBC, PAD_PKCS5 def des_encrypt(key, text, iv): k = des(key, CBC, iv, pad=None, padmode=PAD_PKCS5) en = k.encrypt(text, padmode=PAD_PKCS5) # return binascii.b2a_hex(en) return en def des_decrypt(key, text, iv): k = des(key, CBC, iv, pad=None, padmode=PAD_PKCS5) de = k.decrypt(binascii.a2b_hex(text), padmode=PAD_PKCS5) return de if __name__ == '__main__': secret_key = '54367819' # 密钥 text = 'CGGG' # 加密对象 iv = secret_key # 偏移量 secret_str = des_encrypt(secret_key, text, iv) print('加密字符串:', secret_str) # clear_str = des_decrypt(secret_key, secret_str, iv) # print('解密字符串:', clear_str)
对应的js
var CryptoJS = require('crypto-js') function desEncrypt() { var key = CryptoJS.enc.Utf8.parse(desKey), iv = CryptoJS.enc.Utf8.parse(desIv), srcs = CryptoJS.enc.Utf8.parse(text), // CBC 加密模式,Pkcs7 填充方式 encrypted = CryptoJS.DES.encrypt(srcs, key, { iv: iv, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 }); return encrypted.ciphertext.toString(); }
一般最后 是 return encrypted.toString( ) 但是他这里 return encrypted.ciphertext.toString( ) 不太懂 先记下来
DES 在线加密解密工具: https://the-x.cn/cryptography/Des.aspx
posted on
浙公网安备 33010602011771号