我有一个当前返回从字节数组转换的字符串的方法:
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.Decrypt
from的返回值转换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[]
,那么这是一种传递敏感信息的安全方式,因此将数据的一种安全表示转换为另一种安全表示似乎没问题。