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

web*_*orm 3 c# encryption

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

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

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

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

using (var aesProvider = new AesCryptoServiceProvider())
{
    aesProvider.GenerateIV();
    var ivBase64 = Convert.ToBase64String(aesProvider.IV);
    return ivBase64;
}
Run Code Online (Sandbox Code Playgroud)

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

byte[] initVectorBytes = Encoding.UTF8.GetBytes(initializationVector);`
// intermediate code excluded for brevity
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(keyBytes, initVectorBytes);
Run Code Online (Sandbox Code Playgroud)

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

Jim*_*ood 6

您无法将二进制数据转换为UTF-8并再次返回.某些二进制序列不是有效的UTF-8字符,当您转换为UTF-8时,数据会丢失.这相当于某些字符被设置为'?' 在编码之间进行转换时.

您可以使用base64编码的二进制数据来编写文本,然后使用base64解码来获取原始二进制文件.

尝试将其转换为UTF-8,例如:"\ x00?\ xdc\x80"(即四个字节:0,63,220,128).它不会编码为UTF-8 - 它无效.

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