基于私钥加密公钥解密的RSA算法C#实现

RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。 RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的 考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依 赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价 。

RSA的安全性依赖于大数分解。公钥和私钥都是两个大素数( 大于 100 个十进制位)的函数。据猜测,从一个密钥和密文推断出明文的难度等同于分解 两个大素数的积。

密钥对的产生。选择两个大素数,p 和q 。计算:

n = p * q

然后随机选择加密密钥e(PS:最常用的e值有3,17和 65537,微软就是使用的65537,采用3个中的任何一个都不存在安全问题),要求 e 和 ( p - 1 ) * ( q - 1 ) 互质。最后,利用Euclid 算法计算解密密钥d, 满 足

e * d = 1 ( mod ( p - 1 ) * ( q - 1 ) )

其中n和d也要互质 。数e和n是公钥,d是私钥。两个素数p和q不再需要,应该丢弃,不要让任何人知 道。

加密信息 m(二进制表示)时,首先把m分成等长数据块 m1 ,m2,..., mi ,块长s,其中 2^s <= n, s 尽可能的大。对应的密文是:

ci = mi^e ( mod n ) ( a )

解密时作如下计算:

mi = ci^d ( mod n ) ( b )

.NET提供常用的加密算法类,支持RSA的类是 RSACryptoServiceProvider(命名空间:System.Security.Cryptography),但 只支持公钥加密,私钥解密。RSACryptoServiceProvider类包括:Modulus、 Exponent、P、Q、DP、DQ、InverseQ、D等8个属性,其中Modulus和Exponent就是 公钥,Modulus和D就是私钥,RSACryptoServiceProvider类提供导出公钥的方法 ,也提供导出私钥的方法,但导出的私钥包含上面8个属性,显然要用 RSACryptoServiceProvider实现私钥加密公钥是不可行的。

从RSA的原理 来看,公钥加密私钥解密和私钥加密公钥解密应该是等价的,在某些情况下,比 如共享软件加密,我们需要用私钥加密注册码或注册文件,发给用户,用户用公 钥解密注册码或注册文件进行合法性验证。

本人利用网上找的一个C#版的 大整数类BigInteger(本人认为这是偶发现的效率最高的一个C#版大整数类)来 实现私钥加密公钥加密(事实上也完全支持公租加密私钥解密),但没有使用类 BigInteger的大素数生成函数,而是直接使用类RSACryptoServiceProvider来生 成大素数。其中加密函数和解密函数的实现如下:

/**//*

功能: 用指定的私钥(n,d)加密指定字符串source

*/
         private string EncryptString(string source, BigInteger d, BigInteger n)
        ...{
             int len = source.Length;
            int len1 = 0;
            int blockLen = 0;
             if ((len % 128) == 0)
                len1 = len / 128;
            else
                 len1 = len / 128 + 1;
            string block = "";
            string temp = "";
            for (int i = 0; i < len1; i++)
            ...{
                 if (len >= 128)
                     blockLen = 128;
                else
                     blockLen = len;
                 block = source.Substring(i * 128, blockLen);
                 byte[] oText = System.Text.Encoding.Default.GetBytes(block);
                 BigInteger biText = new BigInteger(oText);
                 BigInteger biEnText = biText.modPow(d, n);
                string temp1 = biEnText.ToHexString ();
                temp += temp1;
                 len -= blockLen;
            }
            return temp;
        }
        /**//*

时间: 2024-07-30 15:22:35

基于私钥加密公钥解密的RSA算法C#实现的相关文章

RSA公钥加密—私钥解密&amp;amp;私钥加密—公钥解密&amp;amp;私钥签名—公钥验证签名

关于RSA算法,前面有介绍,点击打开链接. 这里直接有实现. 代码太多就不直接贴了,免积分下载. http://download.csdn.net/detail/acmjk/7310847

c# rsa 私钥机密公钥解密

问题描述 使用pemPKCS#8格式私钥和公钥,在c#里测试使用公钥加密私钥解密没问题,使用私钥加密公钥解密报错不正确的项,难道c#私钥加密的公钥解密有问题,还是说我私钥加密的有问题? 解决方案 解决方案二:解密的时候报该项不存在解决方案三:.netRSA不支持这个功能,私钥只能解密不能加密.可以试试:解决方案四:如果你需要自己研发研发一个"证书授权"系统,需要私钥加密公钥解密,只能自己写一个RSA处理功能.解决方案五:.net的RSACryptoServiceProvider不支持使

JAVA加密解密之RSA算法

RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的.1987年首次公布,当时他们三人都在麻省理工学院工作.RSA就是他们三人姓氏开头字母拼在一起组成的. RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准. 今天只有短的RSA钥匙才可能被强力方式解破.到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式.只

请问怎么在VS2010下用c#对一个.db文件进行加密和解密?用AES算法

问题描述 本人初学c#,刚了解了vs2010..winform和控制台学了一点点不太会啊现在要用AES算法..代码不知道怎么写也不知道怎么放,有谁能详细指导下吗... 解决方案 解决方案二:Streamstream=newFileStream(你的.db文件路径);byte[]buf=nwbuf[stream.length];//对buf进行AES加密,网上有代码,粘贴就行byte[]buf2=AES(buf);FileStreamfs=File.Creat("创建加密后的文件");/

C# 实现 加密、解密使用AES算法的OFB模式(不填充,明文与密文长度一致)

问题描述 //默认密钥向量byte[]_key1={0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF,0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF};//加密KEYbyte[]Key=Encoding.UTF8.GetBytes("12345678901234567890123456789012");//加密方法publicstaticbyte[]EncryptStringToBytes_Aes(byte[]plainTe

php rsa 加密,解密,签名,验签详解_php技巧

php rsa 加密,解密,签名,验签 由于对接第三方机构使用的是Java版本的rsa加解密方法,所有刚开始在网上搜到很多PHP版本的rsa加解密,但是对接java大多都不适用. 以下php版本是适用于对接java接口,java适用密钥再php语言使用是需要添加 -----BEGIN CERTIFICATE----- -----END CERTIFICATE----- 使用密钥:加密公钥  public_key.cer 解密私钥  private_key.key 签名私钥 sign_key.ke

Java生成非对称型加密公钥和私钥的方法_java

本文实例讲述了Java生成非对称型加密公钥和私钥的方法.分享给大家供大家参考.具体如下: 非对称型加密非常适合多个客户端和服务器之间的秘密通讯,客户端使用同一个公钥将明文加密,而这个公钥不能逆向的解密,密文发送到服务器后有服务器端用私钥解密,这样就做到了明文的加密传送. 非对称型加密也有它先天的缺点,加密.解密速度慢制约了它的发挥,如果你有大量的文字需要加密传送,建议你通过非对称型加密来把对称型'密钥'分发到客户端,及时更新对称型'密钥'. KeyRSA.java如下: import java.

非对称加密算法-RSA算法

一.概述  1.RSA是基于大数因子分解难题.目前各种主流计算机语言都支持RSA算法的实现  2.java6支持RSA算法  3.RSA算法可以用于数据加密和数字签名  4.RSA算法相对于DES/AES等对称加密算法,他的速度要慢的多  5.总原则:公钥加密,私钥解密  /   私钥加密,公钥解密   二.模型分析 RSA算法构建密钥对简单的很,这里我们还是以甲乙双方发送数据为模型 1.甲方在本地构建密钥对(公钥+私钥),并将公钥公布给乙方 2.甲方将数据用私钥进行加密,发送给乙方 3.乙方用

ASP中加密与解密对应的函数

函数|加密|解密 在ASP中加密方法有对应的解密方法好象不多,现在根据前辈资料整理出在asp中加密与解密函数 rsa.asp<%rem 在ASP中实现加密与解密,加密方法:根据RSArem 联系:hnsoso@sina.comClass clsRSA Public PrivateKeyPublic PublicKeyPublic Modulus Public Function Crypt(pLngMessage, pLngKey)On Error Resume NextDim lLngModDi