c# - AES GCM 手动 byte[] IV 和标记与加密信息的串联

标签 c# .net encryption aes encryption-symmetric

我在 GCM 模式下使用 AES 256 加密,使用来自此站点的名为 AuthenticatedAesCng 的类: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 密码的正确方式吗?我应该手动将所有这些值放在一起,还是自动完成而我只是错过了?

最佳答案

密文只是数据,但没有标签就不能拥有 GCM 密文:它会破坏 GCM 的全部目的。标签通常附加到密文。

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

IV 实际上是一个随机数,所以它可以在两边计算。如果您使用随机 NONCE 或无法预先计算它,那么通常将它作为密文的前缀(但您必须在两侧明确编码)。

关于c# - AES GCM 手动 byte[] IV 和标记与加密信息的串联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11533105/

相关文章:

c# - 序列化数组时去掉 <ArrayOfClassname> 根元素

C#:python 文件中的类反射机制(获取函数、参数等)

.net - 从 ASP.NET 切换到面包和黄油 HTML/jQuery 的优势

algorithm - 有人可以解释这个 RSA 示例的最后部分发生了什么吗?

Java AES 无法解密阿拉伯语

encryption - 如果只知道 key 和明文,则恢复 AES IV

c# - 使用 LINQ 获取具有相同值属性的所有对象?

c# - 为什么我要在我的 Controller 属性中硬编码用户权限?

c# - .Net 增加了我的开发时间——我是不是遗漏了什么?

.net - 混合 MarshalByRefObject 和 Serializable