去没有IV的AES128

时间:2014-08-13 15:46:07

标签: go

我试图解密一些没有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。

...谢谢

1 个答案:

答案 0 :(得分:1)

我假设你在这里使用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)