gpt4 book ai didi

encryption - Golang AES CFB - 变异 IV

转载 作者:IT王子 更新时间:2023-10-29 00:56:26 28 4
gpt4 key购买 nike

我用 Go 编写了一个客户端应用程序,它需要与服务器端的 C 程序进行交互。客户端执行 AES CFB 加密,服务器解密。不幸的是,服务器端存在重用初始化向量的错误。它尝试根据以下条件进行 3 次解密操作:-
key1, iv
key2, iv
键 3、iv

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

通过在下面的加密函数中插入一个 Println,我可以看到 cfb 结构,我认为它包含下一个 block 的修改后的 IV,但因为它是一个流接口(interface),我不确定如何将它提取到一个 byte slice 。有什么建议吗?

谢谢

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

最佳答案

沿着您暗示的路径走下去有点难看,并且在实现更改时容易中断。

您可以通过以下方式从流中获取 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):]

关于encryption - Golang AES CFB - 变异 IV,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25513555/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com