• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

用Bouncy Castle的C#版API产生公钥和私钥

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

开源API链接地址:The Legion of the Bouncy Castle

     Bouncy Castle,简称为BC,原本是java的一个开源JCE提供者,后来也提供了C#版本的API,我下载其编译好的DLL,在C#项目中直接引用,用其几个API,产生我指定位数的公钥和私钥(目前是1024位,但产生CA的密钥时,要2048位才能满足安全需求)。虽然开源很好很强大,但这个API就是文档很缺陷,C#的文档更是少得可怜,没办法,下载源代码慢慢看吧。。。

 

     在接下来的几篇关于CA文章中,大体按下面链接网址的思路去整理,不过整理出来的是C#版本的实现,基本目标架设一个CA,产生用户使用的数字证书。网页链接:bouncycastle 产生证书

 

     产生密钥,主要是用RsaKeyPairGenerator,根据参数RsaKeyGenerationParameters,产生一个密钥对,再分离出公钥和私钥,再用公钥和私钥进行加解密。

 

RsaKeyPairGenerator的类,类中的其他类自行加载“BouncyCastle.Crypto.dll”到VS中自行查看

 

  1. namespace Org.BouncyCastle.Crypto.Generators  
  2. {  
  3.     public class RsaKeyPairGenerator : IAsymmetricCipherKeyPairGenerator  
  4.     {  
  5.         public RsaKeyPairGenerator();  
  6.         public AsymmetricCipherKeyPair GenerateKeyPair();  
  7.         public void Init(KeyGenerationParameters parameters);  
  8.     }  
  9. }   

 

 

 

接口IAsymmetricBlockCipher,RSA加解密算法实现的类,就是继承了该接口

 

  1. namespace Org.BouncyCastle.Crypto  
  2. {  
  3.     public interface IAsymmetricBlockCipher  
  4.     {  
  5.         string AlgorithmName { get; }  
  6.         int GetInputBlockSize();  
  7.         int GetOutputBlockSize();  
  8.         void Init(bool forEncryption, ICipherParameters parameters);  
  9.         byte[] ProcessBlock(byte[] inBuf, int inOff, int inLen);  
  10.     }  
  11. }  

 

 


测试代码:

 

  1. using System;  
  2. using System.Collections.Generic;  
  3. using System.Text;  
  4. using Org.BouncyCastle.Crypto.Generators;  
  5. using Org.BouncyCastle.Crypto.Parameters;  
  6. using Org.BouncyCastle.Crypto;  
  7. using Org.BouncyCastle.Security;  
  8. using Org.BouncyCastle.Crypto.Engines;  //IAsymmetricBlockCipher engine = new RsaEngine();  
  9. namespace ConsoleApplication1  
  10. {  
  11.     class Program  
  12.     {   
  13.         static void Main(string[] args)  
  14.         {  
  15.             //RSA密钥对的构造器  
  16.             RsaKeyPairGenerator keyGenerator = new RsaKeyPairGenerator();  
  17.               
  18.             //RSA密钥构造器的参数  
  19.             RsaKeyGenerationParameters param = new RsaKeyGenerationParameters(  
  20.                 Org.BouncyCastle.Math.BigInteger.ValueOf(3),   
  21.                 new Org.BouncyCastle.Security.SecureRandom(),   
  22.                 1024,   //密钥长度  
  23.                 25);  
  24.             //用参数初始化密钥构造器  
  25.             keyGenerator.Init(param);  
  26.             //产生密钥对  
  27.             AsymmetricCipherKeyPair keyPair = keyGenerator.GenerateKeyPair();  
  28.             //获取公钥和密钥  
  29.             AsymmetricKeyParameter publicKey = keyPair.Public;  
  30.             AsymmetricKeyParameter privateKey = keyPair.Private;  
  31.             if( ((RsaKeyParameters)publicKey).Modulus.BitLength<1024 )  
  32.             {  
  33.                 Console.WriteLine("failed key generation (1024) length test");                  
  34.             }  
  35.             //一个测试……………………  
  36.             //输入,十六进制的字符串,解码为byte[]  
  37.             //string input = "4e6f77206973207468652074696d6520666f7220616c6c20676f6f64206d656e";  
  38.             //byte[] testData = Org.BouncyCastle.Utilities.Encoders.Hex.Decode(input);             
  39.             string input = "popozh RSA test";  
  40.             byte[] testData = Encoding.UTF8.GetBytes(input);  
  41.             Console.WriteLine("明文:" + input + Environment.NewLine);  
  42.             //非对称加密算法,加解密用  
  43.             IAsymmetricBlockCipher engine = new RsaEngine();  
  44.             //公钥加密  
  45.             engine.Init(true, publicKey);  
  46.             try  
  47.             {  
  48.                 testData = engine.ProcessBlock(testData, 0, testData.Length);                 
  49.                 Console.WriteLine("密文(base64编码):" + Convert.ToBase64String(testData) + Environment.NewLine);  
  50.             }  
  51.             catch (Exception ex)  
  52.             {  
  53.                 Console.WriteLine("failed - exception " + Environment.NewLine + ex.ToString());  
  54.             }  
  55.             //私钥解密  
  56.             engine.Init(false, privateKey);  
  57.             try  
  58.             {  
  59.                 testData = engine.ProcessBlock(testData, 0, testData.Length);  
  60.      
  61.             }  
  62.             catch (Exception e)  
  63.             {  
  64.                 Console.WriteLine("failed - exception " + e.ToString());  
  65.             }  
  66.             if (input.Equals(Encoding.UTF8.GetString(testData)))  
  67.             {  
  68.                 Console.WriteLine("解密成功");  
  69.             }  
  70.             Console.Read();  
  71.         }  
  72.     }  
  73. }  

 

 

BC的API源代码中,以上的代码测试思路来自:csharp/crypto/test/src/crypto/test/RsaTest.cs,可以定位到该CS文件参考官方提供的测试和代码

 

下篇思路:生成自签的CA根证书、生成用户的证书


密钥对的保存:http://blog.csdn.net/popozhu/archive/2010/08/10/5802656.aspx


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
C# 实现身份验证之WCF篇(1)发布时间:2022-07-10
下一篇:
【C#】使用OWIN创建WebAPI发布时间:2022-07-10
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap