我试图解密一些没有IV的AES128数据。 Go为IV提供了简单的decypher方法,但我无法弄清楚如何不使用IV。所以我到目前为止:
block, err := aes.NewCipher(key)
if err != nil {
panic(err)
}
if len(data)%aes.BlockSize != 0 {
panic("ciphertext is not a multiple of the block size")
}
fmt.Printf("Decyphered:\n%s\n", data)
因此,我正在努力弄清楚如何使用该块的decypher。
...谢谢
答案 0 :(得分:1)
我假设你在这里使用CBC,但CFB模式应该是一样的。
请注意,由于IV不被认为是秘密的,因此为了方便起见,它经常被加在密文本身之前。
由于这些模式处理IV的方式,如果你使用不正确的IV,你只会丢失第一个明文块。如果实际的IV存在,你最终会在明文输出的开头解密随机数据,所以简单地试图用空IV解密它并不会有什么坏处。如果没有原版IV,你就无法回到第一块(没有使用暴力)。
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)