• 标 题:.NET中RAS加解密和签名与验证的c#实现代码讲解,及实现程序提供,源码自己Reflector。
  • 作 者:opxlz
  • 时 间:2008-11-24 10:25:20
  • 链 接:http://bbs.pediy.com/showthread.php?t=77341

第一次发表原创,申请加精。提供实现程序,自己可以Reflector。代码没有加密等。


RSA加密算法是一种非对称加密算法。在公钥加密标准和电子商业中RSA被广泛使用。RSA是1977年由罗纳德李维斯特(Ron Rivest)、阿迪萨莫尔(Adi Shamir)和伦纳德阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。

     公钥和私钥的产生
假设Alice想要通过一个不可靠的媒体接收Bob的一条私人讯息。她可以用以下的方式来产生一个公钥和一个密钥:
1.随意选择两个大的质数p和q,p不等于q,计算N=pq。 
2.根据欧拉函数,不大于N且与N互质的整数个数为(p-1)(q-1) 
3.选择一个整数e与(p-1)(q-1)互质,并且e小于(p-1)(q-1) 
4.用以下这个公式计算d:d× e ≡ 1 (mod (p-1)(q-1)) 
5.将p和q的记录销毁。 
e是公钥,d是私钥。d是秘密的,而N是公众都知道的。Alice将她的公钥传给Bob,而将她的私钥藏起来。

     加密消息
     假设Bob想给Alice送一个消息m,他知道Alice产生的N和e。他使用起先与Alice约好的格式将m转换为一个小于N的整数n,比如他可以将每一个字转换为这个字的Unicode码,然后将这些数字连在一起组成一个数字。假如他的信息非常长的话,他可以将这个信息分为几段,然后将每一段转换为n。可以将n加密为c,计算c并不复杂。Bob算出c后就可以将它传递给Alice。

      解密消息
      Alice得到Bob的消息c后就可以利用她的密钥d来解码。可以公式来将c转换为n,得到n后,她可以将原来的信息m重新复原。
 
      签名消息
      RSA也可以用来为一个消息署名。假如甲想给乙传递一个署名的消息的话,那么她可以为她的消息计算一个散列值,然后用她的密钥加密这个散列值并将这个“署名”加在消息的后面。这个消息只有用她的公钥才能被解密。乙获得这个消息后可以用甲的公钥解密这个散列值,然后将这个数据与他自己为这个消息计算的散列值相比较。假如两者相符的话,那么他就可以知道发信人持有甲的密钥,以及这个消息在传播路径上没有被篡改过。
安全
      假设偷听者乙获得了甲的公钥N和e以及丙的加密消息c,但她无法直接获得甲的密钥d。要获得d,最简单的方法是从c算出n,然后将N分解为p和q,这样她可以计算(p-1)(q-1)并从而由e推算出d。至今为止还没有人找到一个多项式时间的计算方法来分解一个大的整数的因子,但至今为止也还没有人能够证明这种算法不存在(见因式分解)。
      至今为止也没有人能够证明对N进行分解因式是唯一的从c导出n的方法,但今天还没有找到比它更简单的方法。(至少没有公开的方法。)
      因此今天一般认为只要N足够大,那么黑客就没有办法了。

      .Net的推出,我们能够利用.Net Framework中的类提供的加密服务来保证数据安全。目前应用较为广泛的加密方法是使用RSA算法进行加密。在.Net Framework中与RSA加密算法相关的类主要有两个:RSA 类和RSACryptoServiceProvider 类。按照MSDN的说法RSA 类是“表示 RSA 算法的所有实现均从中继承的基类”,而RSACryptoServiceProvider 类是“使用加密服务提供程序 (CSP) 提供的 RSA 算法的实现执行不对称加密和解密”。另外,“表示 RSA 算法的标准参数”的RSAParameters 结构也是很重要的,它保存了RSA算法的参数。

      这里具体讲述一下在C#中如何使用框架提供的RSA算法来对我们的信息加密、签名、验证签名、解密的这个几个步骤的实现过程

      产生私钥和公钥

代码:
System.Security.Cryptography.RSACryptoServiceProvider myrsa = new RSACryptoServiceProvider();
//得到私钥主要保存了RSAParameters中的8各参数
privateKey = myrsa.ToXmlString(true); 
//得到公钥保存了RSAParameters中2个参数
publicKey = myrsa.ToXmlString(false); 
      RAS实现加密
代码:
System.Security.Cryptography.RSACryptoServiceProvider myrsa = new RSACryptoServiceProvider();
//得到公钥
myrsa.FromXmlString(publicKey);
//把你要加密的内容转换成byte[]
PlainTextBArray = (new UnicodeEncoding()).GetBytes(“这里是你要加密的内容”);
//使用.NET中的Encrypt方法加密
CypherTextBArray = myrsa.Encrypt(PlainTextBArray, false);
//最后吧加密后的byte[]转换成Base64String,这里就是加密后的内容了
Result = Convert.ToBase64String(CypherTextBArray);
      RAS实现解密
代码:
System.Security.Cryptography.RSACryptoServiceProvider myrsa = new RSACryptoServiceProvider();
//得到私钥
myrsa.FromXmlString(xmlPrivateKey);
//把原来加密后的String转换成byte[]
PlainTextBArray = Convert.FromBase64String(“刚才加密后的string”);
//使用.NET中的Decrypt方法解密
DypherTextBArray = myrsa.Decrypt(PlainTextBArray, false);
//转换解密后的byte[],这就得到了我们原来的加密前的内容了
Result = (new UnicodeEncoding()).GetString(DypherTextBArray);
      获取MD5的Hash描述表
代码:
System.Security.Cryptography.HashAlgorithm MD5 = System.Security.Cryptography.HashAlgorithm.Create("MD5");
Buffer = System.Text.Encoding.GetEncoding("GB2312").GetBytes(m_strSource);
HashData = MD5.ComputeHash(Buffer);
      RSA签名
代码:
System.Security.Cryptography.RSACryptoServiceProvider MYRSA = new System.Security.Cryptography.RSACryptoServiceProvider();
//得到私钥
MYRSA.FromXmlString(KeyPrivate);
//使用.NET中提供的RSA签名,生成刚才我们的MYRSA私钥的签名对象RSAFormatter
System.Security.Cryptography.RSAPKCS1SignatureFormatter RSAFormatter = new System.Security.Cryptography.RSAPKCS1SignatureFormatter(MYRSA);
//设置签名的算法为MD5
RSAFormatter.SetHashAlgorithm("MD5");
//执行签名EncryptedSignatureData就是签名后的数据
EncryptedSignatureData = RSAFormatter.CreateSignature(“MD5的Hash描述表”);
     RSA 签名验证
代码:
System.Security.Cryptography.RSACryptoServiceProvider MYRSA = new System.Security.Cryptography.RSACryptoServiceProvider();
//得到公钥
MYRSA.FromXmlString(strKeyPublic);
//使用.NET中提供的RSA签名,生成刚才我们的MYRSA公钥的验证签名对象RSADeformatter
System.Security.Cryptography.RSAPKCS1SignatureDeformatter RSADeformatter = new System.Security.Cryptography.RSAPKCS1SignatureDeformatter(MYRSA);
//指定解密的时候HASH算法为MD5
RSADeformatter.SetHashAlgorithm("MD5");
//验证签名,
RSADeformatter.VerifySignature(“MD5的Hash描述表”, “这里是需要验证的签名数据”)
上传的附件 RSA.rar