为了账号安全,请及时绑定邮箱和手机立即绑定

Golang AES CFB - 变异 IV

Golang AES CFB - 变异 IV

Go
幕布斯6054654 2021-08-10 20:43:20
我在 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):]


查看完整回答
反对 回复 2021-08-10
  • 1 回答
  • 0 关注
  • 271 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信