首頁 >後端開發 >Golang >為什麼我的 Go 和 PyCrypto AES-CFB 實作會產生不同的密文?

為什麼我的 Go 和 PyCrypto AES-CFB 實作會產生不同的密文?

Barbara Streisand
Barbara Streisand原創
2024-12-11 14:55:10527瀏覽

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 中,NewCFcrypter情況下為16 位元段,而在Python中,PyCrypto 使用 8 位元段(CFB8)。要解決此差異並允許 Go 解密使用 PyCrypto 設定加密的密文,必須修改 Go 實作以支援 CFB8。

解決方案:

研究顯示 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn