Проблемы с AES в crypto-js и pycrypto - PullRequest
3 голосов
/ 05 марта 2012

Я пытаюсь реализовать связь между

  • crypto-js (библиотека шифрования javascript)

  • и pycrypto (криптографическая библиотека python)

На стороне python-сервера Я шифрую строку с iv и passphrase и отправляю iv с зашифрованным текстом base64, зашифрованным на клиентскую сторону javascript . Затем я хочу decrypt строку с парольной фразой, которую может ввести пользователь.

python - сервер

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, которые вы можете порекомендовать?

Большое спасибо и добрые пожелания, samuirai

1 Ответ

0 голосов
/ 20 декабря 2012

Перед тем как кодировать в 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')
...