为了账号安全,请及时绑定邮箱和手机立即绑定

没有 IV 的 AES128

没有 IV 的 AES128

Go
慕桂英4014372 2021-08-10 15:05:53
我正在尝试解密一些没有 IV 的 AES128 数据。Go 提供了用 IV 解密的简单方法,但我不知道如何不使用 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)所以我正在努力弄清楚如何使用块来解密。谢谢...
查看完整描述

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)


查看完整回答
反对 回复 2021-08-10
  • 1 回答
  • 0 关注
  • 321 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信