2014-01-07 116 views
3

获取问题加密AES加密在cryptojs和蟒蛇解密Crypto.Cipher

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/aes.js"></script> 
<script> 
    var message='Secreat Message to Encrypt'; 
    var key = CryptoJS.enc.Hex.parse('824601be6c2941fabe7fe256d4d5a2b7'); 
    var iv = CryptoJS.enc.Hex.parse('1011121314151617'); 

    var encrypted = CryptoJS.AES.encrypt(message, key, { iv: iv, mode: CryptoJS.mode.CBC }); 
    encrypted =encrypted.toString(); 


    encrypted = iv+encrypted; 
    encrypted = btoa(encrypted); 
    console.log('encrypted',encrypted);  
    alert(encrypted); 

    // var decrypted = CryptoJS.AES.decrypt(encrypted, key, { iv: iv, mode: CryptoJS.mode.CBC }); 
    // console.log('decrypted', decrypted); 
    //alert(decrypted.toString(CryptoJS.enc.Utf8)); 
</script> 

而在对AES加密和解密的Python脚本我用

#!/usr/bin/python 

import os, random, struct 
from Crypto.Cipher import AES 
from Crypto import Random 
import base64 
class AESCipher: 
    def __init__(self, key): 
     BS = 16 
     self.pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS) 
     self.unpad = lambda s : s[0:-ord(s[-1])] 
     self.key = self.pad(key[0:16]) 

    def encrypt(self, raw): 
     raw = self.pad(raw) 
     iv = "1011121314151617" 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return base64.b64encode(iv + cipher.encrypt(raw)) 

    def decrypt(self, enc): 
     enc = enc.replace(' ', '+') 
     enc = base64.b64decode(enc) 
     iv = enc[:16] 
     cipher = AES.new(self.key, AES.MODE_CBC, iv) 
     return self.unpad(cipher.decrypt(enc[16:])) 


def main():  

    cipher = AESCipher('824601be6c2941fabe7fe256d4d5a2b7') 
    encrypteddata =cipher.encrypt(''Secreat Message to Encrypt'') 
    print encrypteddata   

    decryptdata =cipher.decrypt(encrypteddata) 
    print decryptdata 

main() 

但相同IV,消息以及k ey在python和js中产生不同的加密消息,

JavaScript与python解密兼容的问题是什么?

两者都使用AES.MODE_CBC并假定使用了两个Pkcs7填充。硬编码iv现在这些是随机生成的

+0

CryptoJS.AES.encrypt()base64是否对输出进行编码?因为在你的js代码中,你正在返回base64编码的AES东西。 –

+0

将iv附加到CryptoJS.AES.encrypt()产生加密的消息作为iv +加密然后做base64编码,因为它匹配python加密“base64.b64encode(iv + cipher.encrypt(raw))” – UdayaLakmal

+0

对不起,没有看到btoa()调用。嗯.. –

回答

0

尝试与实际上与AES的块大小相同的16个字节的IV。您当前正在指定8个字节的十六进制数。 CBC模式需要与块大小相同的IV,并且Python API指定(包括最终的错字):

对于所有其他模式,它必须是block_size字节长。

最好使用上面的方法或(预定义)常量。

+0

使用iv作为'101112131415161718191a1b1c1d1e1f',但是当尝试在python中解密时会得到异常“输入字符串必须是16的倍数”如果iv = CryptoJS.enc.Utf8.parse('7061737323313233'); – UdayaLakmal

+0

python是否期望十六进制为IV,还是期望字节?你可能想要先十六进制解码IV(和键?)...... –