加密和解密(1):常用数据加密和解密方法汇总(4)

B)分组长度太大,为保证安全性,n 至少也要 600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个

长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。C)RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。

保密级别

 

对称密钥长度(bit)

 

RSA密钥长度(bit)

 

ECC密钥长度(bit)

 

保密年限

 

80

 

80

 

1024

 

160

 

2010

 

112

 

112

 

2048

 

224

 

2030

 

128

 

128

 

3072

 

256

 

2040

 

192

 

192

 

7680

 

384

 

2080

 

256

 

256

 

15360

 

512

 

2120

 

 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。早在1973年,英国国家通信总局的数学家Clifford Cocks就发现了类似的算法。但是他的发现被列为绝密,直到1998年才公诸于世。

  RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。

  RSA的算法涉及三个参数,n、e1、e2。

  其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。

  e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。

  (n及e1),(n及e2)就是密钥对。

  RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;

  e1和e2可以互换使用,即:

  A=B^e2 mod n;B=A^e1 mod n;

C#代码实现

需引用using System.Security.Cryptography;

/// <summary> /// RSA加密 /// </summary> /// <param></param> /// <param></param> /// <returns></returns> public static string RSAEncrypt(string publickey, string content) { publickey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>"; RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(); byte[] cipherbytes; rsa.FromXmlString(publickey); cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); </span><span style="line-height:1.5;color:rgb(0,0,255);">return</span><span style="line-height:1.5;"> Convert.ToBase64String(cipherbytes); } </span><span style="line-height:1.5;color:rgb(128,128,128);">///</span> <span style="line-height:1.5;color:rgb(128,128,128);">&lt;summary&gt;</span> <span style="line-height:1.5;color:rgb(128,128,128);">///</span><span style="line-height:1.5;color:rgb(0,128,0);"> RSA解密 </span><span style="line-height:1.5;color:rgb(128,128,128);">///</span> <span style="line-height:1.5;color:rgb(128,128,128);">&lt;/summary&gt;</span> <span style="line-height:1.5;color:rgb(128,128,128);">///</span> <span style="line-height:1.5;color:rgb(128,128,128);">&lt;param name="privatekey"&gt;&lt;/param&gt;</span> <span style="line-height:1.5;color:rgb(128,128,128);">///</span> <span style="line-height:1.5;color:rgb(128,128,128);">&lt;param name="content"&gt;&lt;/param&gt;</span> <span style="line-height:1.5;color:rgb(128,128,128);">///</span> <span style="line-height:1.5;color:rgb(128,128,128);">&lt;returns&gt;&lt;/returns&gt;</span> <span style="line-height:1.5;color:rgb(0,0,255);">public</span> <span style="line-height:1.5;color:rgb(0,0,255);">static</span> <span style="line-height:1.5;color:rgb(0,0,255);">string</span> RSADecrypt(<span style="line-height:1.5;color:rgb(0,0,255);">string</span> privatekey, <span style="line-height:1.5;color:rgb(0,0,255);">string</span><span style="line-height:1.5;"> content) { privatekey </span>= <span style="line-height:1.5;color:rgb(128,0,0);">@"</span><span style="line-height:1.5;color:rgb(128,0,0);">&lt;RSAKeyValue&gt;&lt;Modulus&gt;5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=&lt;/Modulus&gt;&lt;Exponent&gt;AQAB&lt;/Exponent&gt;&lt;P&gt;/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==&lt;/P&gt;&lt;Q&gt;6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==&lt;/Q&gt;&lt;DP&gt;ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==&lt;/DP&gt;&lt;DQ&gt;MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==&lt;/DQ&gt;&lt;InverseQ&gt;EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==&lt;/InverseQ&gt;&lt;D&gt;vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=&lt;/D&gt;&lt;/RSAKeyValue&gt;</span><span style="line-height:1.5;color:rgb(128,0,0);">"</span><span style="line-height:1.5;">; RSACryptoServiceProvider rsa </span>= <span style="line-height:1.5;color:rgb(0,0,255);">new</span><span style="line-height:1.5;"> RSACryptoServiceProvider(); </span><span style="line-height:1.5;color:rgb(0,0,255);">byte</span><span style="line-height:1.5;">[] cipherbytes; rsa.FromXmlString(privatekey); cipherbytes </span>= rsa.Decrypt(Convert.FromBase64String(content), <span style="line-height:1.5;color:rgb(0,0,255);">false</span><span style="line-height:1.5;">); </span><span style="line-height:1.5;color:rgb(0,0,255);">return</span><span style="line-height:1.5;"> Encoding.UTF8.GetString(cipherbytes); }<br></span></pre>

七、ASP.NET(C#)常用加密类调用的讲解

1、C#常用加密解密类库代码如下: 

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/73e38c6af0eebbf8afc969c9d1c1ee2f.html