美文网首页
对比Python与Js 实现AES CBC算法的区别(结果由64

对比Python与Js 实现AES CBC算法的区别(结果由64

作者: 隐墨留白 | 来源:发表于2020-01-02 16:14 被阅读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的长度给变了? 谢谢告知。

    相关文章

      网友评论

          本文标题:对比Python与Js 实现AES CBC算法的区别(结果由64

          本文链接:https://www.haomeiwen.com/subject/xsrooctx.html