AES-CFB を使用した Go と Pycrypto の異なる結果
この質問は、Go アプリケーションを既存の Python コードベースに統合する必要があることから生じます。暗号化に PyCrypto を利用します。この問題は、AES-CFB 暗号化の Python と Go の実装で異なる暗号文が生成されるときに発生します。
Python サンプル:
cipher = Crypto.Cipher.AES.new( key=password, mode=Crypto.Cipher.AES.MODE_CFB, IV=iv)
Go サンプル:
aesBlock, err4 := aes.NewCipher(password) cfbDecrypter := cipher.NewCFBEncrypter(aesBlock, iv)
Go では、NewCFBEncrypter 関数は次を使用します。デフォルトでは 16 ビット セグメントですが、Python では PyCrypto は 8 ビット セグメント (CFB8) を使用します。この不一致を解決し、Go が PyCrypto 設定を使用して暗号化された暗号文を復号できるようにするには、CFB8 をサポートするように Go 実装を変更する必要があります。
解決策:
研究により、Go のCFBDecrypter および CFBEncrypter のソース コードは、CFB8 をサポートするように簡単に適合させることができます。この変更には、次の行のセグメント サイズの変更が含まれます:
元のコード:
func (f *cfb) XORKeyStream(dst, src []byte)
修正コード:
func (f *cfb) XORKeyStream(dst, src []byte) { for i := 0; i < len(src); i += 1 { f.b[0] = f.b[0] << 8 | src[i] >> 8 f.b[1] = src[i] dst[i] = f.b[f.s] ^ f.update(f.b[0]^f.b[1]) } }
この変更を実装すると、Go は CFB8 をサポートし、次の方法で暗号化された暗号文を復号できるようになります。 Python 実装の設定。
以上がGo と PyCrypto の AES-CFB 実装で異なる暗号文が生成されるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。