2012-03-05 130 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')