1 回答
TA贡献1829条经验 获得超7个赞
我假设你在这里使用 CBC,但 CFB 模式应该是一样的。
请注意,由于 IV 不被认为是秘密的,为了方便起见,它通常被添加到密文本身。
由于这些模式处理 IV 的方式,如果您使用不正确的 IV,您只会丢失第一个明文块。如果实际的 IV 存在,您最终会在明文输出的开头解密随机数据,因此简单地尝试用空的 IV 解密它并没有什么坏处。但是,如果没有原始 IV,您将无法取回第一个块(缺少使用蛮力)。
Example
key := []byte("YELLOW SUBMARINE")
plaintext := []byte("exampleplaintext that is longer than a single block and some pad")
if len(plaintext)%aes.BlockSize != 0 {
panic("plaintext not multiple of block size")
}
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
// The IV needs to be unique, but not secure. Therefore it's common to
// include it at the beginning of the ciphertext.
ciphertext := make([]byte, aes.BlockSize+len(plaintext))
iv := ciphertext[:aes.BlockSize]
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
panic(err)
}
mode := cipher.NewCBCEncrypter(block, iv)
mode.CryptBlocks(ciphertext[aes.BlockSize:], plaintext)
fmt.Printf("%x\n", ciphertext)
// Now Decrypt with wrong IV
iv = make([]byte, 16)
// If you wanted the correct IV, in thise case we could pull it from the ciphertext
//iv = ciphertext[:aes.BlockSize]
//ciphertext = ciphertext[aes.BlockSize:]
if len(ciphertext)%aes.BlockSize != 0 {
panic("ciphertext is not a multiple of the block size")
}
mode = cipher.NewCBCDecrypter(block, iv)
newPlaintext := make([]byte, len(ciphertext))
mode.CryptBlocks(newPlaintext, ciphertext)
fmt.Printf("%s\n", newPlaintext)
- 1 回答
- 0 关注
- 321 浏览
添加回答
举报