Discuz!NT
欢迎 游客 , 注册 | 登录 | 会员 | 界面 | 简洁版本 | 在线 | 帮助
商都网教育宝典宝库

发表新主题 回复该主题
本主题被查看1017次, 共1个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第   上一主题   下一主题
标题: RSA加密在VS.NET的使用
张小峰
超级版主
UID: 14
来自:
精华: 4
积分: 313
帖子: 285
注册: 2007-8-23 10:27:00
状态: 离线
威望: 8.00
金钱: 75.55 元
只看楼主 2007-09-07 11:34
RSA加密在VS.NET的使用
也就是利用公共密钥和私用密钥(public key and private key)进行加密解密,属于可逆操作。由Rivest、Shamir和Adlernan三人所研究发明的。它利用两个很大的质数相乘所产生的乘积来加密。这两个质数无论哪一个先与原文件编码相乘,对文件加密,均可由另一个质数再相乘来解密。但要用一个质数来求出另一个质数,则是十分困难的。因此将这一对质数称为密钥对(Key Pair)。在加密应用时,某个用户总是将一个密钥公开,让需发信的人员将信息用其公共密钥加密后发给该用户,而一旦信息加密后,只有用该用户一个人知道的私用密钥才能解密。具有数字凭证身份的人员的公共密钥可在网上查到,亦可在请对方发信息时主动将公共密钥传给对方,这样保证在Internet上传输信息的保密和安全。


下面是具体使用方法:


1 /**//// <summary>
2    /// 生成公钥和私钥信息
3    /// </summary>
4    public void ExportKeyXml()
5    {
6        //ExportParameters和ToXmlString选true时表示公钥和私钥信息同时导出,选false则只导出公钥信息
7        System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
8     
9        System.IO.StreamWriter swPublic = new System.IO.StreamWriter(@"F:\Study\myProject\test2005\PublicKeyXml.xml");
10        swPublic.Write(rsa.ToXmlString(false));
11        swPublic.Close();
12
13        System.IO.StreamWriter swPrivate = new System.IO.StreamWriter(@"F:\Study\myProject\test2005\PrivateKeyXml.xml");
14        swPrivate.Write(rsa.ToXmlString(true));
15        swPrivate.Close();
16    }
17
18    /**//// <summary>
19    /// 加密数据
20    /// </summary>
21    /// <param name="encryptData">需要加密的明文</param>
22    /// <returns>加密后的十六进制字符串,带横杠</returns>
23    public string EncryptData(string encryptData)
24    {
25        //我的xp系统加密数据只支持最长117字节,如果超过了,将会报错,可以采用分段加密
26        if(encryptData.Length > 117)
27            return "";
28
29        System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
30        //获取公钥信息
31        System.IO.StreamReader sr = new System.IO.StreamReader(@"F:\Study\myProject\test2005\PublicKeyXml.xml");
32
33        rsa.FromXmlString(sr.ReadToEnd());
34        sr.Close();
35        //加密
36        byte[] bytResult = rsa.Encrypt(System.Text.Encoding.Default.GetBytes(encryptData), false);
37        return BitConverter.ToString(bytResult);
38    }
39
40    /**//// <summary>
41    /// 解密数据
42    /// </summary>
43    /// <param name="decryptData">加密十六进制字符串,带横杠</param>
44    /// <returns>解密明文</returns>
45    public string DecryptData(string decryptData)
46    {
47        System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
48        //获取私钥钥信息
49        System.IO.StreamReader sr = new System.IO.StreamReader(@"F:\Study\myProject\test2005\PrivateKeyXml.xml");
50
51        rsa.FromXmlString(sr.ReadToEnd());
52        sr.Close();
53        //解密,因为我的加密数据转换成十六进制字符串时没有去掉"-",所以这里直接通过split('-')来分数组
54        //不知道还有没有更好的办法处理,比如隔两位取一次等
55        string[] strKey = decryptData.Split('-');
56        byte[] bytKey = new byte[128];
57        for (int i = 0; i < strKey.Length; i++)
58        {
59            bytKey[i] = Convert.ToByte(strKey[i], 16);
60        }
61        byte[] bytDecryptResult = rsa.Decrypt(bytKey, false);
62        return System.Text.Encoding.Default.GetString(bytDecryptResult);
63    }

这里有几个需要注意的地方:

1.当导出密钥信息到文件中时, ToXmlString的参数--true表示公钥和私钥信息,false只导出公钥信息

2.加密的数据长度是有限制的,根据具体环境而有所不同

下表说明了 Microsoft Windows 的不同版本所支持的填充,以及操作系统和填充的不同组合所允许的 rgb 的最大长度。

填充
支持的操作系统
rgb 参数的最大长度

OAEP 填充(PKCS#1 2 版)
Microsoft Windows XP 或更高版本。
模块大小 -2 -2*hLen,其中 hLen 为哈希代码的大小。

直接加密(PKCS#1 1.5 版)
安装了高位加密包的 Microsoft Windows 2000 或更高版本。
模块大小 - 11(11 个字节是可能的最小填充值。)

不支持直接加密和 OAEP 填充
未安装高位加密包的 Windows 98、Microsoft Windows Millennium 或 Windows 2000(或更高版本)。
对称密钥允许的最大大小。




3.加解密信息必须成对使用



上面的这几个方法,可以用在配置文件上。比如,配置文件里有密码等敏感信息,那么你可以先把密码加密,然后写在配置文件中。使用的时候再到程序里进行解密。有个问题,偶没想明白,私钥信息是个文件,放在哪才安全呢,磁盘上?程序里?数据库?

Rsa还有一种用法,如下。这种方法具体用在什么场合,恕偶愚钝,还没想到,难不成在项目的各个模块之间运行时传递?


1/**//// <summary>
2    /// 这里我用到了三个RSACryptoServiceProvider对象,目的就是为了演示RSAParameters结构的作用
3    /// </summary>
4    public void OtherMethod()
5    {
6        System.Security.Cryptography.RSACryptoServiceProvider rsa = new System.Security.Cryptography.RSACryptoServiceProvider();
7        //导出公钥信息
8        System.Security.Cryptography.RSAParameters paramPublice = rsa.ExportParameters(false);
9        //导出私钥信息
10        System.Security.Cryptography.RSAParameters paramPrivate = rsa.ExportParameters(true);
11
12        //加密
13        System.Security.Cryptography.RSACryptoServiceProvider rsaEncrypt = new System.Security.Cryptography.RSACryptoServiceProvider();
14        rsaEncrypt.ImportParameters(paramPublice);
15        byte[] bytResult = rsaEncrypt.Encrypt(System.Text.Encoding.Default.GetBytes(this.TextBox1.Text), false);
16        this.TextBox2.Text = BitConverter.ToString(bytResult);
17
18        //解密
19        System.Security.Cryptography.RSACryptoServiceProvider rsaDecrypt = new System.Security.Cryptography.RSACryptoServiceProvider();
20        rsaDecrypt.ImportParameters(paramPrivate);
21        byte[] bytDecryptResult = rsaDecrypt.Decrypt(bytResult, false);
22        this.TextBox4.Text = System.Text.Encoding.Default.GetString(bytDecryptResult);
23    }
24
#1  
发表新主题 回复该主题
本主题被查看1017次, 共1个帖子, 1页, 当前为第1页     选择页数: 1      跳转到第







现在的时间是 2008-09-07 13:59:04

版权所有 商都网教育宝典
         Powered by Discuz!NT 1.0.6666    Copyright © 2001-2008 Comsenz Inc.
Processed in 0.032 seconds