对比Python与Js 实现AES CBC算法的区别(结果由64
2020-01-02 本文已影响0人
隐墨留白
遇到网站的密码加密算法是AES CBC类型的加密算法,先看看源码:
function encryptPassword(c, e, g) {
var d = CryptoJS.enc.Utf8.parse("0123456789AB" + e.toUpperCase());
var b = CryptoJS.enc.Utf8.parse(g);
var a = {
iv: b,
mode: CryptoJS.mode.CBC,
padding: CryptoJS.pad.Pkcs7
};
var f = CryptoJS.AES.encrypt(CryptoJS.MD5(c).toString(), d, a);
return f.ciphertext.toString(CryptoJS.enc.Hex)
}
由源码可得,
text是将c进行MD5加密后的结果,
key d是将e大写后再与'0123456789AB'拼接,再进行编码
iv b是将g编码后的数据
接着来使用python来写AES CBC加密算法(百度来的代码)
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex
import hashlib
# 如果text不足16位的倍数就用空格补足为16位
def add_to_16(text):
if len(text.encode('utf-8')) % 16:
add = 16 - (len(text.encode('utf-8')) % 16)
else:
add = 0
text = text + ('\0' * add)
return text.encode('utf-8')
# 加密函数
def encrypt(text,v_code,iv):
m = hashlib.md5(text.encode('utf-8')).hexdigest()
verifyCode = '0123456789AB' + v_code.upper()
key = verifyCode.encode('utf-8')
mode = AES.MODE_CBC
iv = iv.encode('utf-8')
text = add_to_16(m)
# text = add_to_16(m) + b'\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10'
print(m)
print(text)
cryptos = AES.new(key, mode, iv)
cipher_text = cryptos.encrypt(text)
# 因为AES加密后的字符串不一定是ascii字符集的,输出保存可能存在问题,所以这里转为16进制字符串
return b2a_hex(cipher_text).decode('utf-8')
v_code = 'cdsx'
iv = 'Vylz3XX20or9WcUJ'
e = encrypt("123456", v_code, iv) # 加密
print("加密:", e)
运行可得结果为:
python:加密: e52152f0625fc7916f7ad65d15bb3cc4fa1476d271632e33200b829be8348031
js: e52152f0625fc7916f7ad65d15bb3cc4fa1476d271632e33200b829be8348031e6c5bdcac7f85e52666bf015a046a1bc
这就很尴尬了整整差了32位数。js加密既然已经有结果了,那就用python解密一下,得到text为:
解密: b'e10adc3949ba59abbe56e057f20f883e\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10\x10'
取巧一下,在加密算法中,把缺失的text补上。如果有js大佬无意中看到这篇文章,占用您一点时间,能不能告诉我,这个算法在js的哪部分将text的长度给变了? 谢谢告知。