ホームページ > バックエンド開発 > Golang > Go と PyCrypto の AES-CFB 実装で異なる暗号文が生成されるのはなぜですか?

Go と PyCrypto の AES-CFB 実装で異なる暗号文が生成されるのはなぜですか?

Barbara Streisand
リリース: 2024-12-11 14:55:10
オリジナル
542 人が閲覧しました

Why Do My Go and PyCrypto AES-CFB Implementations Produce Different Ciphertexts?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート