3

間の通信を実装しようとしています

  • crypto-js (javascript 暗号化ライブラリ)

  • およびpycrypto (Python 暗号ライブラリ)

Python サーバー側では、文字列を anivと apassphraseで暗号化し、暗号化されたテキスト base64 でエンコードされた iv を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

しかし、これは 1 つの例にすぎません。考えられる base64 エンコーディング/デコーディングのすべてのコンスタレーションを試しました。モードも変えてみました。しかし、これらはすべてランダムなテストであり、私が本当にしなければならないことを理解したい.

  • crypt-js が必要とするエンコーディングは何ですか?
  • どのモードを選択すればよいですか?
  • Pythonサーバー側で変更する必要があるものはありますか?
  • パディングとは何ですか?障害がある可能性がありますか?
  • 他に推奨できる JavaScript ライブラリはありますか?

どうもありがとうございました。

4

1 に答える 1

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')
于 2012-12-20T04:41:16.347 に答える