2012-03-05 108 views
3

我尝试实施问题与AES的加密js和pycrypto

之间的通信

python服务器端我使用iv加密字符串,并且一个passphrase并发送iv与加密文本base64编码到javascript客户端端。然后我想decrypt带有用户可以输入的密码的字符串。

蟒蛇 - 服务器

from Crypto.Cipher import AES 
from Crypto import Random 

iv = Random.get_random_bytes(16) 
key = "1234567812345678" 
aes = AES.new(key, AES.MODE_CFB, iv) 
encrypted_text = base64.b64encode(aes.encrypt("this is a test..")) 
iv = base64.b64encode(iv) 
# send iv, encrypted_text to client 

的JavaScript - 客户端

// <script type="text/javascript" 
     src="http://crypto-js.googlecode.com/files/2.5.3-crypto-sha1-hmac-pbkdf2-blockmodes-aes.js"> 
    </script> 
// text, and iv is base64encoded from the python script 
// key is a string from an <input type='text'> 
decrypted = Crypto.AES.decrypt(text, key, {iv: iv, mode: new Crypto.mode.CFB}); 

有了这个例子中,我得到一个JavaScript错误

Uncaught URIError: URI malformed 

但是,这只是一个例子 - 我尝试了每个我能想到的base64编码/解码星座。我也试图改变模式。但这些都是随机测试,我想了解我真的必须做什么。

  • crypt-js需要什么编码?
  • 我应该选择哪种模式?
  • 有什么我应该改变在python服务器端?
  • 什么是填充?会不会有错?
  • 你可以推荐任何其他的JavaScript库吗?

非常感谢你,善良的reagards, samuirai

+0

尝试在Python中对您的数据进行URLEncoding,然后将其发送到JS客户端..如“urllib.urlencode(data)”.. – 2012-03-05 10:28:51

+0

如果仍有问题,请查看https://gist.github。 COM/marcoslin/8026990。 – marcoseu 2013-12-18 22:03:47

回答

0

之前编码为Base64你必须总结IV和encrypted_text:

encrypted_text = base64.b64encode(iv + aes.encrypt("this is a test..")) 

从官方文档(https://开头WWW。 dlitz.net/software/pycrypto/doc/):

作为一个例子,加密可以按如下方式完成:

from Crypto.Cipher import AES 
from Crypto import Random 

key = b'Sixteen byte key' 
iv = Random.new().read(AES.block_size) 
cipher = AES.new(key, AES.MODE_CFB, iv) 
msg = iv + cipher.encrypt(b'Attack at dawn')