问题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行,是不是很矛盾呢,这行意思是不是导入私钥呀,那上面生成或者读取的,不就是没有任何意义了吗?因为这行肯定会覆盖上面生成或读取的私钥的。
请各位大神解答下。
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,所以这个操作并不是多余的,是一个必经过程。
谢谢回答,第三个问题,先不管作者是什么用意,按照代码的运行过程,我应该没有说错吧。
记忆中,好像就算不传CspParameters给RSACryptoServiceProvider,RSACryptoServiceProvider也会默认创建临时的容器的。谢谢提醒
@atfeel: 你说的对,比如这样:RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
但是,你要注意到,它做了个设置:csp.Flags = CspProviderFlags.UseMachineKeyStore;,我查了下源码 RSACryptoServiceProvider 的无参构造函数也是使用的 UseMachineKeyStore 标识。
我想原作者的本意可能只是想让容器始终存储在 MachineKeyStore 中,显然它不知道默认存储就是这个。