RSACryptoServiceProvider 提供的 rsa 加密,其本身可以泄露私钥,望讨论
做了个小测试,发现 RSACryptoServiceProvider,及其内核 Microsoft Cryptography API,完全可以轻松泄露私钥:
代码如下:
如果你将这个程序运行两次,你会发现,不仅私钥可以被输出,而且两次的私钥内容完全一样。
因为公约和私钥对,永久驻留在 Windows 系统中,就算你重启 windows,它俩的数据保持不变。
换句话说,上述名字为 “x-user” 的密钥容器中的密钥永远不会改变,而且还可以被输出。
那就完蛋了,只要你用过 RSACryptoServiceProvider 来进行过非对称加密,人家拿到你密钥容器的名字,就可以把你的私钥输出来。
而拿到你密钥容器的名字易如反掌,只要反编译你的 C# 代码,或者查找程序集中的常量字符串,就知道了
问题的根源不在于 .NET 的 RSACryptoServiceProvider 类,而是在于 Windows 提供的 Microsoft Cryptography API,它本身就是永久保存密钥对,并可以输出私钥。
我又用 VC 调用这个 API 做了个测试,密钥容器名字仍使用 x-user,发现输出的密钥对,完全同上述一样。
各位想象一下,这有多危险
代码如下:
CspParameters cspParam = new CspParameters( 1, null, "x-user" );
RSACryptoServiceProvider ras = new RSACryptoServiceProvider( cspParam );
bool bset = ras.PersistKeyInCsp;
bset = ras.PublicOnly;
string key1 = ras.KeyExchangeAlgorithm;
key1 = ras.SignatureAlgorithm;
byte[] blob = ras.ExportCspBlob( true );
StreamWriter blbWriter = new StreamWriter( "e:\\blob.txt" );
for( int mm = 0; mm < blob.Length; mm++ )
{
blbWriter.Write( "{0:x2} ", blob[mm] );
if( (mm + 1) % 20 == 0 )
blbWriter.WriteLine();
}
blbWriter.Dispose();如果你将这个程序运行两次,你会发现,不仅私钥可以被输出,而且两次的私钥内容完全一样。
因为公约和私钥对,永久驻留在 Windows 系统中,就算你重启 windows,它俩的数据保持不变。
换句话说,上述名字为 “x-user” 的密钥容器中的密钥永远不会改变,而且还可以被输出。
那就完蛋了,只要你用过 RSACryptoServiceProvider 来进行过非对称加密,人家拿到你密钥容器的名字,就可以把你的私钥输出来。
而拿到你密钥容器的名字易如反掌,只要反编译你的 C# 代码,或者查找程序集中的常量字符串,就知道了
问题的根源不在于 .NET 的 RSACryptoServiceProvider 类,而是在于 Windows 提供的 Microsoft Cryptography API,它本身就是永久保存密钥对,并可以输出私钥。
我又用 VC 调用这个 API 做了个测试,密钥容器名字仍使用 x-user,发现输出的密钥对,完全同上述一样。
各位想象一下,这有多危险
...全文
相关推荐
C#创建并使用签名证书
辅助类 1、创建签名证书 2、通过RSA加密解密 3、通过Pkcs7加密
C#中实现RSA生成公钥和私钥算法
在C#中,我们可以使用.NET Framework提供的加密库来生成RSA公钥和私钥。本文将详细介绍如何在C#中实现RSA生成公钥和私钥的算法,并提供相应的源代码。需要注意的是,生成的RSA密钥对是随机生成的,每次运行代码都会得到不同的密钥对。此外,上述示例代码生成的RSA密钥对都是以XML格式进行导出的,如果需要以其他格式进行导出,可以使用相应的方法进行转换。通过以上步骤,我们成功地实现了在C#中生成RSA公钥和私钥的算法。在实际应用中,密钥的安全性非常重要,需要妥善保管和管理,避免泄露。
Base64及多种加密解密方法_加密_解密_
C# Base64及多种加密解密方法源代码
ASP基于RSA的数字签名的设计与实现(源代码+论文).zip
ASP基于RSA的数字签名的设计与实现(源代码+论文).zip
c# 加密算法源码
整理了c#自带的几种加密算法,直接使用,加密字符串 文件


