Golang AES CFB - 变异 IV

我在 Go 中编写了一个客户端应用程序,它需要与服务器端的 C 程序进行交互。客户端执行 AES CFB 加密,服务器解密。不幸的是,服务器端有一个重用初始化向量的错误。它尝试基于以下三个解密操作:-

key1, iv

key2, iv

key3, iv


由于这个问题,iv 实际上在解密操作之间被修改。我现在的问题是如何使用 Go 在客户端重现这种行为。


通过将 Println 插入下面的 encrypt 函数,我可以看到 cfb 结构,我认为它包含下一个块的修改后的 IV,但因为它是一个流接口,我不确定如何将它提取到一个字节片中。有什么建议么?


谢谢


package main


import (

  "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))

}


幕布斯6054654
浏览 272回答 1
1回答

繁星点点滴滴

沿着您暗示的路径走下去有点难看,并且在实现更改时容易中断。您可以通过以下方式从流中获取 IV:s := reflect.Indirect(reflect.ValueOf(stream))lastIV := s.FieldByName("next").Bytes()但是,还有更简单的方法!连接纯文本输入,以便第二个的流从第一个末尾的 IV 开始(依此类推)。Playground Examplecombined := append(plain, plain2...)encCombined := encrypt_aes_cfb(combined, key, iv)enc := encCombined[:len(plain)]enc2 := encCombined[len(plain):]
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go