.NET中非对称加密RSA算法的密钥保存
来源:互联网 发布:非常污的网络用词 编辑:程序博客网 时间:2024/06/11 17:13
在.NET中使用RSA算法进行数据加密和签名,很多时候,我们需要重复的使用一组密钥,因此就需要将这组密钥保存起来。接下来,我给大家介绍3种在.Net中保存密钥的方法。
第三种方法:使用数字证书。
如果你的密钥需要在不同的机器上使用,那么将密钥保存在数字证书中是一个不错的选择。实际上,说将密钥保存在数字证书中并不准确,应该是先生成一个数字证书,然后在使用数字证书中的密钥。
如何生成一个数字证书呢?正式的数字证书需要到CA去申请,当然还要奉上一笔银子。还好我们可以使用.Net SDK提供的MakeCert.exe来生成临时的数字证书。
.Net中用来访问证书的对象是X509Certificate2,我们可以用它来加载一个数字证书并获得数字证书中的密钥。
如果证书是以文件的形式保存在本地的话,可以用下面的方法加载:
以下是代码片段:1: static byte[] EncryptDataByCert(byte[] data)
2: {
3: //实例化一个X509Certificate2对象,并加载证书testCertificate.cer
4: X509Certificate2 cert = new X509Certificate2(@"c:\testCertificate.cer");
5: //将证书的公钥强制转换成一个RSACryptoServiceProvider对象,然后可以使用这个对象执行加密操作
6: RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PublicKey.Key;
7: byte[] enData = rsa.Encrypt(data, false);
8: return enData;
9: }
一般情况下,对于数字证书来说,保存公钥的证书使用.cer做扩展名,而保存了私钥的证书会使用.pfx做扩展名,当我们加载一个私钥的数字证书时,需要提供私钥的保护密码,代码如下:
以下是代码片段:1: static string DecryptByCert(byte[] endata)
2: {
3: //实例化一个X509Certificate2对象,并加载证书testCertificate.pfx。
4: //由于证书testCertificate.pfx包含私钥,所以需要提供私钥的保护密码(第二个参数)
5: X509Certificate2 cert = new X509Certificate2(@"c:\testCertificate.pfx", "123456");
6: //将证书testCertificate.pfx的私钥强制转换为一个RSACryptoServiceProvider对象,用于解密操作
7: RSACryptoServiceProvider rsa = (RSACryptoServiceProvider)cert.PrivateKey;
8: byte[] data = rsa.Decrypt(endata, false);
9: return data;
10: }
如果证书保存在计算机的证书存储区(Certificate Store)中,我们就需要使用另一个对象X509Store来访问证书存储区。根据访问权限,证书存储区分为当前用户(Current User)和本地计算机(Local Machine)两个部分,前者用来保存当前登录的用户所能使用的数字证书,而后者用来保存登录到本机所能使用的数字证书。不管是当前用户还是本地计算机,都包含多个逻辑存储区,它们通过不同的名称来区分,每个逻辑存储区可以保存多个数字证书。更详细的介绍,可以参考证书 。具体的访问证书存储区的代码如下:
以下是代码片段:1: private X509Certificate2 GetCertificate(string CertName)
2: {
3: //声明X509Store对象,指定存储区的名称和存储区的类型
4: //StoreName中定义了系统默认的一些存储区的逻辑名称
5: X509Store store = new X509Store(StoreName.My, StoreLocation.CurrentUser);
6: //以只读的方式打开这个存储区,OpenFlags定义的打开的方式
7: store.Open(OpenFlags.ReadOnly);
8: //获取这个存储区中的数字证书的集合
9: X509Certificate2Collection certCol = store.Certificates;
10: //查找满足证书名称的证书并返回
11: foreach (X509Certificate2 cert in certCol)
12: {
13: if (cert.SubjectName.Name == "CN=" + CertName)
14: {
15: store.Close();
16: return cert;
17: }
18: }
19: store.Close();
20: return null;
21: }
我们也可以通过X509Certificate2Collection 对象在当前存储区中添加删除证书。
上面的介绍是我自己对密钥保存的一些理解,大家可以根据的具体情况,去选择具体的方法,希望对大家有所帮助。如果哪位大神有更好的方法,希望留下你的方法共我们学习。
- .NET中非对称加密RSA算法的密钥保存
- NET中非对称加密RSA算法的密钥保存
- .NET中非对称加密RSA算法的密钥保存
- Silverlight中非对称加密及数字签名RSA算法的实现
- Silverlight中非对称加密及数字签名RSA算法的实现
- java中非对称加密(RSA)的使用
- .NET中非对称加密算法的密钥的存储
- 非对称加密(RSA、DH密钥交换算法、数字签名)
- 非对称加密(RSA、DH密钥交换算法、数字签名)
- 非对称加密(RSA、DH密钥交换算法、数字签名)
- 非对称加密(RSA、DH密钥交换算法、数字签名)
- 非对称加密RSA算法原理和DH密钥交换的简单理解
- 非对称密钥体制&RSA加密原理
- 非对称加密---RSA算法
- 非对称加密 RSA算法
- 算法整理——非对称密钥加密RSA数学相关与简单实现
- 对称加密的密钥交换
- 对称加密的对称密钥分发
- 对青鸟锦江学员们的60条建议
- javascript 中 undefine于void 0区别
- 闲来无事,写了一个比较完整的计算器
- C# 加密解密算法
- makefile 就这样纠结了这么久
- .NET中非对称加密RSA算法的密钥保存
- C#.NET 加密解密:AES/DES/Base64/RSA/MD5/SHA256
- 数字认证介绍
- linux非实时任务调度CFS算法分析
- Python编程规范v2
- 数字证书百度简介
- POJ 2665 Trees(我的水题之路——移树,POJ100题啦!)
- NoSQL数据库探讨 -- 非关系型数据库
- 动态ip怎样实现远程连接计算机?