我在 Go 中编写了一个客户端应用程序,它需要与服务器端的 C 程序进行交互。客户端执行 AES CFB 加密,服务器解密。不幸的是,服务器端有一个重用初始化向量的错误。它尝试基于以下三个解密操作:-key1, ivkey2, ivkey3, iv由于这个问题,iv 实际上在解密操作之间被修改。我现在的问题是如何使用 Go 在客户端重现这种行为。通过将 Println 插入下面的 encrypt 函数,我可以看到 cfb 结构,我认为它包含下一个块的修改后的 IV,但因为它是一个流接口,我不确定如何将它提取到一个字节片中。有什么建议么?谢谢package mainimport ( "fmt" "encoding/hex" "crypto/cipher" "crypto/aes")func encrypt_aes_cfb(plain, key, iv []byte) (encrypted []byte) { block, err := aes.NewCipher(key) if err != nil { panic(err) } encrypted = make([]byte, len(plain)) stream := cipher.NewCFBEncrypter(block, iv) stream.XORKeyStream(encrypted, plain) fmt.Println(stream) return}func main() { plain := []byte("Hello world...16Hello world...32") key := make([]byte, 32) iv := make([]byte, 16) enc := encrypt_aes_cfb(plain, key, iv) fmt.Println("Key: ", hex.EncodeToString(key)) fmt.Println("IV: ", hex.EncodeToString(iv)) fmt.Println("Enc: ", hex.EncodeToString(enc))}
1 回答
繁星点点滴滴
TA贡献1803条经验 获得超3个赞
沿着您暗示的路径走下去有点难看,并且在实现更改时容易中断。
您可以通过以下方式从流中获取 IV:
s := reflect.Indirect(reflect.ValueOf(stream))
lastIV := s.FieldByName("next").Bytes()
但是,还有更简单的方法!连接纯文本输入,以便第二个的流从第一个末尾的 IV 开始(依此类推)。
Playground Example
combined := append(plain, plain2...)
encCombined := encrypt_aes_cfb(combined, key, iv)
enc := encCombined[:len(plain)]
enc2 := encCombined[len(plain):]
- 1 回答
- 0 关注
- 271 浏览
添加回答
举报
0/150
提交
取消