Go と Pycrypto の間の AES-CFB 暗号化結果の不一致
新しい Go アプリケーションを既存の Python コードベースと統合しようとして、ユーザーは 2 つの言語で生成された暗号文の不一致に遭遇します。この不一致は、特に AES-CFB 暗号化の実装で発生します。
この問題は、各言語で使用される CFB セグメント サイズの違いに起因します。 Pycrypto は 8 ビット (CFB8) のセグメント サイズを採用しますが、Go はこの構成のネイティブ サポートを提供しません。その結果、Go と Pycrypto によって生成された暗号文が異なり、相互に解読不能になります。
Go コードの調査により、基礎となるソース コードを変更することで、CFBDecrypter クラスと CFBEncrypter クラスが CFB8 をサポートするように適応できる可能性があることが判明しました。このアプローチにより、Go アプリケーションは Pycrypto の CFB8 設定を使用して暗号化された暗号文をシームレスに復号できるようになります。
修正された Go コード:
package main import ( "fmt" "crypto/cipher" "crypto/aes" "encoding/hex" ) // encrypt func main() { payload, err1 := hex.DecodeString("abababababababababababababababababababababababababababababababab") password, err2 := hex.DecodeString("0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF0123456789ABCDEF") iv, err3 := hex.DecodeString("00000000000000000000000000000000") if err1 != nil { fmt.Printf("error 1: %v", err1) return } if err2 != nil { fmt.Printf("error 2: %v", err2) return } if err3 != nil { fmt.Printf("error 3: %v", err3) return } aesBlock, err4 := aes.NewCipher(password) cfb8Decrypter := cipher.NewCFB8Decrypter(aesBlock, iv) cfb8Decrypter.XORKeyStream(payload, payload) fmt.Printf("%v\n", hex.EncodeToString(payload)) // should output dbf6b1877ba903330cb9cf0c4f530d40bf77fe2bf505820e993741c7f698ad6b }
結論:
Go の CFBDecrypter とCFBEncrypter クラスが CFB8 をサポートすると、ユーザーは Go アプリケーションが Pycrypto の AES-CFB8 設定を使用して暗号化された暗号文を効果的に復号できるようになり、2 つの言語間のギャップを埋め、Go アプリケーションと既存の Python コードベース間のシームレスな統合が可能になります。
以上がGo と Pycrypto AES-CFB の暗号化結果が異なるのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。