Encryption 为什么';golang加密示例是否使用随机IV?
根据CWE-329,非随机IV允许字典攻击的可能性。 但是,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
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行:)