当前位置: 首页 > 知识库问答 >
问题:

为什么带GCM的AES-256增加了16个字节的密文大小?

傅志诚
2023-03-14
golang prettyprint-override">block, _ := aes.NewCipher([]byte("W9FLKnyv397R82kKuFpfp6y8usGRf49a"))
gcm, _ := cipher.NewGCM(block)
nonce = make([]byte, gcm.nonceSize()) // nonceSize is 12 bytes
_, _ = io.ReadFull(rand.Reader, nonce) // populate nonce with random data


for {
    src := make([]byte, 1024 * 16) // let's hypotise this src is a chunk of a file, full of 1024 * 16 bytes, so 16384

    encryptedBytes := gcm.Seal(nonce, nonce, src, nil) // this prepends the nonce to the src, thus adding 12 bytes in front of the encrypted string

    /*
    Now, encryptedBytes should be 16384 + 12 bytes long, but it is 16384 + 12 + 16.
    If I want to decrypt a chunk of the encrypted bytes, I need to use the size of 16384 + 12 + 16 and this makes it unpractical.
    */
}

这似乎不是因为填充(也是因为GCM不使用填充)。

那么,为什么AES要给我的密文添加16字节呢?

共有1个答案

周峻
2023-03-14

AES-GCM提供机密性、完整性和身份验证。要提供最后两个,需要一个身份验证标记。

16字节的标记大小总是计算出来的,在您的情况下是追加的。

更多细节;

 if len(IV) = 96 then 
     J_0 = IV || 0^{31}1
 else 
     J_0=GHASH_H(IV||0^{s+64}||len(IV_64))

标签通常附加在密文后面。

遵守NIST特别出版物800-38D(第8页)

标记的位长t是一个安全参数,如附录B所述。通常,t可以是以下五个值中的任意一个:128、120、112、104或96。对于某些应用,t可以是64或32;附录C给出了这两种标签长度的使用指南,包括在这些情况下对输入数据长度和密钥寿命的要求。

 类似资料:
  • 这是一个错误: 1.JS

  • 这应该是一个简单的问题,但我无法从openssl文档中找到任何示例或答案。 我想加密128位,应该适合一个加密块。 所以我调用,然后呢? 我是否调用(加密 128 位块)和(即使没有更多要加密的内容)? 还是只有?还是只有?

  • 我对我当前尝试访问的API的加密有以下要求: < li>PKCS7填充方法 < li>CBC加密模式 < li>AES密钥大小256,块大小128 每次我提交带有加密的API时,API似乎都有问题(不幸的是没有产生错误)。 问题: PKCS7填充方法到底是什么,可以用php实现? AES 256很好,但是块大小到底是什么意思? IV到底是做什么的?

  • tag到底是什么意思?我们为什么需要它?

  • 我在这个网站上用AES-256加密一个虚拟字符串: https://www.devglan.com/online-tools/aes-encryption-decryption 具有以下参数: null 当我尝试用OpenSSL从命令行解密它时: 我得到这个错误: