AES GCM手动字节[]将IV和标记连接到加密信息

时间:2012-07-17 19:04:49

标签: c# .net encryption aes encryption-symmetric

我使用此站点中名为AuthenticatedAesCng的类在GCM模式下使用AES 256加密:CLR security

通过加密流写入明文后,我手动连接IV,TAG和加密数据,然后返回该值。

cs是加密流,ms是内存流

// Write through and retrieve encrypted data.
cs.Write(message, 0, message.Length);
cs.FlushFinalBlock();
byte[] cipherText = ms.ToArray();                   

// Retrieve tag and create array to hold encrypted data.
byte[] authenticationTag = encryptor.GetTag();      
byte[] encrypted = new byte[cipherText.Length + aes.IV.Length + authenticationTag.Length];

// Set needed data in byte array.
aes.IV.CopyTo(encrypted, 0);                       
authenticationTag.CopyTo(encrypted, IV_LENGTH);
cipherText.CopyTo(encrypted, IV_LENGTH + TAG_LENGTH);

// Store encrypted value in base 64.
return Convert.ToBase64String(encrypted);

这是在GCM模式下使用AES密码的正确方法吗?我应该手动将所有这些值放在一起,还是自动完成,我只是错过了它?

1 个答案:

答案 0 :(得分:1)

密文只是数据,但你不能没有标签的GCM密文:它会破坏GCM的整个目的。标签通常附加在ciphtertext。

AAD数据是可选的,它的全部目的是让它以明文形式发送。

IV实际上是一个随机数,因此它可以在双方计算。如果您使用随机NONCE或无法预先计算它,那么将它作为密文的前缀是正常的(但您必须在两侧明确地对其进行编码)。