2016-03-22 188 views
2

我一直在寻找很多不同的C#加密示例。在大多数例子中,加密密钥以及初始化向量(IV)作为字节数组传递到加密/解密方法中。将加密密钥和IV存储/转换为字符串

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

我不断遇到关于如何正确地将Key和IV转换为字符串的propblems。一些示例说使用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是否存在标准方式?

+2

[这是加密的最佳答案(http://stackoverflow.com/a/10366194/542251)我发现。我基本上只是现在使用这个代码。它接受一个字符串BTW – Liam

+0

@Liam - 感谢这个伟大的例子!你使用哪一个代码示例?列出了一堆。 – webworm

+0

这取决于!我最近使用SimpleDecryptWithPassword,我并不关心安全性,我主要想混淆一些数据。你使用的方法将取决于你想要数据的安全程度 – Liam

回答

4

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

您可以改为使用base64编码的二进制数据到文本,然后base64解码以获取原始二进制文件。尝试将其转换为UTF-8,例如:“\ x00?\ xdc \ x80”(即四个字节:0,63,220,128)。它不会编码为UTF-8 - 它无效。

的标准方法是使用基本-64编码 - How do I encode and decode a base64 string?

+1

真棒例子。我认为我感到困惑,因为我使用的加密/解密方法使用UTF8编码..'byte [] plainTextBytes = Encoding.UTF8.GetBytes(plainText);' – webworm