13

PythonクライアントとRubyサーバーがデータの暗号化方法について意見の相違を持っている理由を理解しようとしています。Rubyコードと私のコードで見られる唯一の違いは、初期化ベクトルを指定していないため、すべての\x0のデフォルトにフォールバックすることです。

ivなしでPyCryptoをインスタンス化しようとすると、エラーが発生します。次に例を示します。

from Crypto.Cipher import AES
test = "Very, very confidential data"
key = b'Thirty Two Byte key, made Beef y' 

gryp = AES.new(key, AES.MODE_CBC)

(この例は、基本的にIVを指定しないPyCryptoドキュメントのサンプルコードです)ドキュメントには、IVがw / r / tと記載されています。「オプションであり、存在しない場合は、すべてゼロのデフォルト値が与えられます。」ただし、「ValueError:IVは16バイト長である必要があります」というエラーが表示されます。

したがって、IVを指定することはできますが、それ自体は問題ではありませんが、デフォルトを使用できないと思われる場合、ライブラリの使用方法に何か問題がある場合は、それを理解しようとしています。

4

2 に答える 2

17

これは、PycryptoのAESのクラスドキュメントのエラーのようです。AESの実装が変更されたため、IVが必要なモードではオプションではありません(つまり、16バイトのゼロを自分で渡す必要があります。どのようにそれをしたいのか)。

誰かがIVを指定せず、オンラインドキュメントを調べた同じ問題については、このバグレポートを参照してください。IVを明示的に必要とする変更があり、基本的に、これを反映するようにオンラインドキュメントを更新した人は誰もいません。Pycryptoソースのクラスドキュメントが更新されましたが、これを反映するためにオンラインドキュメントを再生成する必要があります。

ソースからの新しいドキュメントは次のように述べています。

block_size他のすべてのモードでは、バイト長である必要があります。

古いバージョンの代わりに

block_size他のすべてのモードでは、バイト長である必要があります。これはオプションであり、存在しない場合はすべてゼロのデフォルト値が与えられます。

ivを指定するソースの更新された例は次のとおりです。

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')
于 2013-01-17T23:49:30.120 に答える
3

これがいくつかの修正で私のために働く実装です:

class AESCipher:

    def __init__(self, key):
        self.bs = 32
        if len(key) >= 32:
            self.key = key[:32]
        else:
            self.key = self._pad(key)

    def encrypt(self, raw):
        raw = self._pad(raw)
        iv = Random.new().read(AES.block_size)
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return base64.b64encode(iv + cipher.encrypt(raw))

    def decrypt(self, enc):
        enc = base64.b64decode(enc)
        iv = enc[:AES.block_size]
        cipher = AES.new(self.key, AES.MODE_CBC, iv)
        return self._unpad(cipher.decrypt(enc[AES.block_size:]))

    def _pad(self, s):
        return s + (self.bs - len(s) % self.bs) * chr(self.bs - len(s) % self.bs)

    def _unpad(self, s):
        return s[:-ord(s[len(s)-1:])]
于 2014-02-21T08:03:40.660 に答える