我一直在研究很多不同的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;
}
但是,当我将此IV的字符串表示形式传递给加密方法然后将其转换回字节数组时,以下代码无法说明IV的大小不合适。
byte[] initVectorBytes = Encoding.UTF8.GetBytes(initializationVector);`
// intermediate code excluded for brevity
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);
是否存在在字节数组和字符串表示之间来回转换加密密钥和IV的标准方法?
答案 0 :(得分:6)
您无法将二进制数据转换为UTF-8并再次返回。某些二进制序列不是有效的UTF-8字符,当您转换为UTF-8时,数据会丢失。相当于某些角色被设置为'?'在编码之间进行转换时。
您可以使用base64编码的二进制数据来编写文本,然后使用base64解码来获取原始二进制文件。
尝试将其转换为UTF-8,例如:" \ x00?\ xdc \ x80" (那个四个字节:0,63,220,128)。它不会编码为UTF-8 - 它无效。
标准方法是使用Base-64编码 - How do I encode and decode a base64 string?