我有一个当前返回从字节数组转换的字符串的方法:
public static readonly UnicodeEncoding ByteConverter = new UnicodeEncoding();
public static string Decrypt(string textToDecrypt, string privateKeyXml)
{
if (string.IsNullOrEmpty(textToDecrypt))
{
throw new ArgumentException(
"Cannot decrypt null or blank string"
);
}
if (string.IsNullOrEmpty(privateKeyXml))
{
throw new ArgumentException("Invalid private key XML given");
}
byte[] bytesToDecrypt = Convert.FromBase64String(textToDecrypt);
byte[] decryptedBytes;
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(privateKeyXml);
decryptedBytes = rsa.Decrypt(bytesToDecrypt, FOAEP);
}
return ByteConverter.GetString(decryptedBytes);
}
我正在尝试更新此方法以返回 a SecureString,但我无法将RSACryptoServiceProvider.Decryptfrom的返回值转换byte[]为SecureString。我尝试了以下方法:
var secStr = new SecureString();
foreach (byte b in decryptedBytes)
{
char[] chars = ByteConverter.GetChars(new[] { b });
if (chars.Length != 1)
{
throw new Exception(
"Could not convert a single byte into a single char"
);
}
secStr.AppendChar(chars[0]);
}
return secStr;
但是,使用此 SecureString 相等性测试器,结果SecureString不等于SecureString从原始未加密文本构造的结果。我的 Encrypt 和 Decrypt 方法以前工作过,当时我只是string到处使用,而且我还测试了SecureString相等代码,所以我很确定这里的问题是我如何尝试转换byte[]为SecureString. SecureString我应该采取另一条路线来使用 RSA 加密来让我在解密时取回 a吗?
编辑:我不想将字节数组转换为常规字符串,然后将该字符串填充到 aSecureString中,因为这似乎首先破坏了使用 aSecureString的意义。但是,Decrypt返回是否也很糟糕,byte[]然后我试图将该字节数组填充到SecureString? 我猜如果Decrypt返回 a byte[],那么这是一种传递敏感信息的安全方式,因此将数据的一种安全表示转换为另一种安全表示似乎没问题。