gpt4 book ai didi

C# - RSACryptoServiceProvider 解密为 SecureString 而不是字节数组

转载 作者:太空狗 更新时间:2023-10-30 01:10:33 29 4
gpt4 key购买 nike

我有一个方法,当前返回一个从字节数组转换而来的字符串:

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);
}

我正在尝试更新此方法以改为返回 SecureString,但我无法从 byte 转换 RSACryptoServiceProvider.Decrypt 的返回值[]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;

但是,使用 this SecureString equality tester ,生成的 SecureString 不等于从原始未加密文本构造的 SecureString。我的 Encrypt 和 Decrypt 方法以前工作过,当时我到处都使用 string,而且我还测试了 SecureString 相等代码,所以我很确定这里的问题这就是我尝试将 byte[] 转换为 SecureString 的方式。有没有我应该采取的另一条路线来使用 RSA 加密,这将允许我在解密时取回 SecureString

编辑:我不想将字节数组转换为常规字符串,然后将该字符串填充到SecureString 中,因为这似乎打败了the point of using a SecureString。首先。但是,Decrypt 返回 byte[] 是否也很糟糕,然后我试图将该字节数组填充到 SecureString 中?我猜测如果 Decrypt 返回 byte[],那么这是传递敏感信息的安全方式,因此将数据的一种安全表示形式转换为另一种安全表示形式似乎好的。

最佳答案

char 和 byte 可以与转换互换使用,因此请修改您的第二段代码:

var secStr = new SecureString();
foreach (byte b in decryptedBytes)
{
secStr.AppendChar((char)b);
}

return secStr;

这应该可以正常工作,但请记住,您仍在将未加密的信息带入内存中的“清晰”状态,因此它可能会在某一点上遭到破坏(这与 SecureString 的目的背道而驰) .

** 更新 **

A byte[] 您的敏感信息不安全。您可以在内存中查看它并查看信息(特别是如果它只是一个字符串)。各个字节将按照字符串的确切顺序排列,因此“读取”它非常简单。

我(实际上大约一个小时前)自己也在为同样的问题而苦苦挣扎,据我所知,没有好的方法可以直接从解密器转到 SecureString,除非解密器经过专门编程以支持此策略.

关于C# - RSACryptoServiceProvider 解密为 SecureString 而不是字节数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4503543/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com