Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Encryption 为什么';golang加密示例是否使用随机IV?_Encryption_Go_Initialization Vector - Fatal编程技术网

Encryption 为什么';golang加密示例是否使用随机IV?

Encryption 为什么';golang加密示例是否使用随机IV?,encryption,go,initialization-vector,Encryption,Go,Initialization Vector,根据CWE-329,非随机IV允许字典攻击的可能性。 但是,golang文档使用非随机IV: ciphertext := make([]byte, aes.BlockSize+len(plaintext)) iv := ciphertext[:aes.BlockSize] 这个实现是安全的还是应该使用随机函数来获取IV?它是安全的,因为IV是由加密安全的伪随机数生成器(CSPRNG)填充的,默认情况下,它是由操作系统提供的。从示例newcbcencrypter函数: iv := ciphert

根据CWE-329,非随机IV允许字典攻击的可能性。 但是,golang文档使用非随机IV:

ciphertext := make([]byte, aes.BlockSize+len(plaintext))
iv := ciphertext[:aes.BlockSize]

这个实现是安全的还是应该使用随机函数来获取IV?

它是安全的,因为IV是由加密安全的伪随机数生成器(CSPRNG)填充的,默认情况下,它是由操作系统提供的。从
示例newcbcencrypter
函数:

iv := ciphertext[:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
    panic(err)
}

你错了。在加密情况下,它使用随机IV。在解密情况下,它使用来自消息的IV。不要让IV被初始化为密文片段的事实欺骗了你;接下来它要做的事情是从a.GO示例向该切片中随机读取字节,感谢您对GO示例的说明,它确实通过执行
io.ReadFull(rand.Reader,IV)
来随机执行IV。我认为这有点误导。执行
iv:=make([]字节,[:aes.BlockSize])
赋值会更清晰。这甚至不是有效的语法。我完全错了。请再读一遍我的答案。现在应该是对的。你的第一句话就错了<代码>生成始终返回一个归零的切片<代码>密文在OP示例中始终为全零。这100%是错误的。如果制作切片时未提供容量,则容量与长度相同。是否提供与备份数组是否初始化无关;它总是初始化为零。如果不使用“不安全”,就无法访问Go中未初始化的内存。即使要将初始化内存用于IV,也肯定是不够的。在后续运行中,从堆中获得16字节的非唯一块的可能性相对较高。@ArtjomB。这仍然是错误的,因为示例确实按照您推荐的方式从
rand.Reader
初始化IV(第77行:)