首页 新闻 会员 周边

CspParameters 密钥容器 的矛盾

0
悬赏园豆:50 [已解决问题] 解决于 2013-08-26 14:37

问题1:CspParameters 保存方式是以文件方便存在吗?还是保存在注册表了?

问题2:我用CspParameters 保存的密钥 生成密文,容器保存在计算机里,假如我的电脑换系统,或者还原了呢?我怎么才能对之前的密文解密??

 

问题3:请看下面代码:

1.CspParameters csp = new CspParameters();
2.csp.Flags = CspProviderFlags.UseMachineKeyStore;
3.RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(csp);
4.rsa.FromXmlString(“私钥*******”);
5.return rsa;

第1-2行创建的容器对象,第3行传入引用到RSACryptoServiceProvider,并查找有没有存在同名的容器,没有则创建公共和私钥并保存在容器里,有则读取放到RSACryptoServiceProvider变量里。

那第4行,是不是很矛盾呢,这行意思是不是导入私钥呀,那上面生成或者读取的,不就是没有任何意义了吗?因为这行肯定会覆盖上面生成或读取的私钥的。

 

请各位大神解答下。

atfeel的主页 atfeel | 初学一级 | 园豆:69
提问于:2013-08-24 16:26
< >
分享
最佳答案
0

1、根据你提供的 Provider 类型,它可能保存在文件中、智能卡或其它存储设备,请参看 CspParameters 的其它几个构造函数:http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.cspparameters(v=vs.110).aspx

2、根据你提供的 Provider 类型,你可能需要先要导出你的密钥或证书,然后在新的机器上安装;

3、可以合并 CreateEphemeralKey 标志来安全的释放临时密钥。第4行矛盾不矛盾,是由编写代码的人的逻辑来决定的,可能他希望只用自己的密钥来加密。RSACryptoServiceProvider 总会用默认密钥来初始化:http://msdn.microsoft.com/zh-cn/library/system.security.cryptography.rsacryptoserviceprovider(v=vs.95).aspx,所以这个操作并不是多余的,是一个必经过程。

收获园豆:50
Launcher | 高人七级 |园豆:45045 | 2013-08-26 11:31

谢谢回答,第三个问题,先不管作者是什么用意,按照代码的运行过程,我应该没有说错吧。

记忆中,好像就算不传CspParameters给RSACryptoServiceProvider,RSACryptoServiceProvider也会默认创建临时的容器的。谢谢提醒

atfeel | 园豆:69 (初学一级) | 2013-08-26 14:37

@atfeel: 你说的对,比如这样:RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();

但是,你要注意到,它做了个设置:csp.Flags = CspProviderFlags.UseMachineKeyStore;,我查了下源码 RSACryptoServiceProvider 的无参构造函数也是使用的 UseMachineKeyStore 标识。

我想原作者的本意可能只是想让容器始终存储在 MachineKeyStore 中,显然它不知道默认存储就是这个。

Launcher | 园豆:45045 (高人七级) | 2013-08-26 14:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册