将加密密钥和IV存储/转换为字符串

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

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

我一直在讨论如何正确地将Key和IV转换为字符串的问题。 一些示例说使用Base64编码,而其他示例使用Encoding.UTF8

这是一个生成IV并将其转换为Base64字符串的示例…

 using (var aesProvider = new AesCryptoServiceProvider()) { aesProvider.GenerateIV(); var ivBase64 = Convert.ToBase64String(aesProvider.IV); return ivBase64; } 

但是,当我将此字符串表示forms传递给加密方法然后将其转换回字节数组时,以下代码无法说明IV的大小不合适。

 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?\ xdc \ x80”(即四个字节:0,63,220,128)。 它不会编码为UTF-8 – 它无效。

标准方法是使用Base-64编码 – 如何编码和解码base64字符串?