Storing/Converting the encryption key and IV as strings
我已经研究了很多不同的C加密示例。在大多数示例中,加密密钥和初始化向量(IV)作为字节数组传递到加密/解密方法中。
我想把密钥和IV存储为字符串。硬件安全模块中的密钥和SQL Server数据库中作为nvarchar的IV。
我不断地遇到如何正确地将键和IV转换为字符串的问题。一些例子说使用base64编码,而其他例子使用
下面是一个生成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字符串进行编码和解码?