使用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中文網其他相關文章!