对比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的长度给变了? 谢谢告知。

上一篇下一篇

猜你喜欢

热点阅读