【发布时间】:2021-04-02 13:16:48
【问题描述】:
我正在尝试解密来自受 SSL 证书保护的 Web 套接字的通信。证书已安装在计算机上,并且存在私钥。我有这个解密功能
public static string DecryptTry(X509Certificate2 x509, string stringTodecrypt)
{
try
{
if (x509 == null || string.IsNullOrEmpty(stringTodecrypt))
throw new Exception("A x509 certificate and string for decryption must be provided");
if (!x509.HasPrivateKey)
throw new Exception("x509 certificate does not contain a private key for decryption");
if(x509 == null)
{
Console.WriteLine("certificate is null");
return "";
}
Console.WriteLine("decoding text with private key " + x509.HasPrivateKey);//true
using (RSA csp = (RSA)x509.PrivateKey)
{
byte[] bytestoDecrypt = Encoding.UTF8.GetBytes(stringTodecrypt).Take(256).ToArray();
Console.WriteLine("key size: " + x509.PrivateKey.KeySize + " received data length: " + stringTodecrypt.Length + " bytes length: " + bytestoDecrypt.Length);
Console.WriteLine(Encoding.UTF8.GetString(bytestoDecrypt));
byte[] bytesDecrypted = csp.Decrypt(bytestoDecrypt, RSAEncryptionPadding.OaepSHA256); //ERROR HERE
return Encoding.UTF8.GetString(bytesDecrypted);
}
}
catch(Exception e)
{
Console.WriteLine("Error while decrypting text: " + e.Message + e.HResult + e.StackTrace);
return "";
}
}
但是csp.Decrypt 抛出错误
参数不正确
我已经尝试了所有填充参数 - 似乎都没有任何区别。 有谁知道问题可能出在哪里?我错过了什么吗? **
编辑 25.12.2020
**
添加更多背景信息:WebSocket 客户端正在侦听的网站是安全的 HTTPS,SSL 证书由 CA 签署,我可以完全访问其所有信息。最初的问题是加密的 WebSocket 通信的握手。我在想我可以用私钥解密它,这就是问题发生的地方。传入请求(或握手)的长度在 490 到 520 字节之间,这就是 .Take(256) 的原因。我正在考虑将文本分成多个,分别解码然后放在一起。然而,这把我带到了这里。
最后一个想法:这是一个 .NET 控制台应用程序。可以通过将其转换为 IIS 接受的格式来解决问题吗?机器上的 IIS 安装了证书......它可能会有所作为吗?
提前致谢!
【问题讨论】:
-
Encoding.UTF8.GetBytes(stringTodecrypt).Take(256)解释为什么选择 UTF8 以及为什么要占用 256 个字符。 -
你能把加密代码贴出来吗?如果密文真的是用 UTF8 解码的,一般是被这个破坏了。如果应将密文转换为字符串,则必须使用合适的二进制到文本编码,例如 Base64。注意: (1) 对于 RSA,密文(例如 256 字节)和密钥(例如 2048 位)的长度是相同的。 (2)明文的长度不能超过key的长度减去padding所需的长度。 (3) 其他可能的错误是:不匹配的填充或损坏的密文(例如,关于
Take(256)的不完整)。 -
另外,如果您的通信是通过 TLS 使用 websockets,那么 websocket 堆栈已经为您处理了加密和解密。
-
大家好,很抱歉我的回复晚了。谢谢你的cmets,他们让我更清楚了。我已经编辑了这篇文章,以添加更多关于我的意图的背景信息并澄清我的一些步骤。值得一提的是,我没有加密文本,因为网页使用 SSL 证书,文本已经加密。至少我是这么认为的,如果我错了,请纠正我。
-
最后要补充的一件事:我设法将加密函数中的结果转换为 base64string 并在解密中对其进行解码。问题是,我不控制加密。所以也许我应该把我的问题改成:“HTTPS 通信使用什么编码以及如何获取其加密数据?”
标签: c# .net ssl encryption rsa