关于c#:将加密密钥和IV存储/转换为字符串

Storing/Converting the encryption key and IV as strings

我已经研究了很多不同的C加密示例。在大多数示例中,加密密钥和初始化向量(IV)作为字节数组传递到加密/解密方法中。

我想把密钥和IV存储为字符串。硬件安全模块中的密钥和SQL Server数据库中作为nvarchar的IV。

我不断地遇到如何正确地将键和IV转换为字符串的问题。一些例子说使用base64编码,而其他例子使用Encoding.UTF8

下面是一个生成IV并将其转换为base64字符串的示例…

1
2
3
4
5
6
using (var aesProvider = new AesCryptoServiceProvider())
{
    aesProvider.GenerateIV();
    var ivBase64 = Convert.ToBase64String(aesProvider.IV);
    return ivBase64;
}

但是,当我将这个IV的字符串表示形式传递到加密方法中,然后将其转换回字节数组时,下面的代码无法说明IV的大小不正确。

1
2
3
byte[] initVectorBytes = Encoding.UTF8.GetBytes(initializationVector);`
// intermediate code excluded for brevity
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);

在字节数组和字符串表示形式之间,是否有一种标准的方法来来回转换加密密钥和IV?


不能将二进制数据转换为UTF-8,然后再转换回来。某些二进制序列不是有效的UTF-8字符,当转换为UTF-8时,数据将丢失。它相当于一些字符被设置为'?'在编码之间转换时。

您可以使用base64将二进制数据编码为文本,然后base64解码以返回原始二进制。

尝试将其转换为UTF-8,例如:"x00"? xdcx80"(四个字节:0、63、220、128)。它不会编码成UTF-8——它是无效的。

标准方法是使用base-64编码-如何对base64字符串进行编码和解码?