强制生成长度为 32 字节(16 个字符)的初始化向量

Force generation of Initialization Vector 32 bytes (16 characters) in length

我想为我的 AES 加密方法生成一个初始化向量 (IV)。我已将密钥大小定义为 256(因为我使用的是 AES),因此我的 IV 需要 32 个字节的长度 (256 / 8)。我希望将 IV 存储为字符串表示形式,因此使用 UTF-8,这相当于一个 16 个字符的字符串。

这是我用来生成的代码和 return IV ...

using (var aesProv = new AesCryptoServiceProvider())
{
  aesProv.GenerateIV();
  return System.Text.Encoding.Default.GetString(aesProv.IV);
}

如何确保 IV 的长度为 16 个字符?由于我使用的是 AES 库,我可以指望生成 16 个字符的长度吗? AesCryptoServiceProvider

I wish to store the IV as a string representation so using UTF-8, this would equate to a 16 character string.

没有。只是不要这样做。是的,您可以将 32 个字节解释为 UCS-2 序列,但这是一个非常糟糕的主意。这不是自然的文本——它基本上是任意的二进制数据。由于代理对等原因,您很容易得到无效的 UTF-16 代码单元序列。

假设你想要一个你可能能够安全传输的字符串表示等,我建议只使用 base64:

return Convert.ToBase64String(aesProv.IV);

当然,您也可以使用十六进制。当然,这两个都将比 16 个字符长得多,但这是适当处理数据的 "price"。