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

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

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


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

用Bouncy Castle的C#版API产生公钥和私钥的更多相关文章

  1. 在C#中保存Bouncy Castle生成的密钥对

    在用Bouncy Castle的C#版API产生公钥和私钥 中产生了一对密钥对,可以用bouncy caslte提供的API进行保存 公钥方面的3个类,具体代码根据命名空间自行查看其源代码: Org. ...

  2. Bouncy Castle Crypto API c# port

    Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包.它支持大量的密码术算法,并提供 JCE 1.2.1 的实现.现在有了C#的版本.下面是网站上的介绍 This port ...

  3. Arcgis API For IOS扩展AGSDynamicLayer新旧版API对比

    AGSDynamicLayer(ForSubclassEyesOnly) Category Reference Description This category organizes the meth ...

  4. 加密 bouncy castle

    1.去官方站点下载Bouncy Castle的JCE Provider包 bcprov-ext-jdk15-145.jar 2.把jar文件复制到 $JAVA_HOME$\jre\lib\ext 目录 ...

  5. bouncy castle的配置

    Bouncy Castle 是一种用于 Java 平台的开放源码的轻量级密码术包.它支持大量的密码术算法,并提供 JCE 1.2.1 的实现.因为 Bouncy Castle 被设计成轻量级的,所以从 ...

  6. 高德地图车机版API演示程序

    高德地图车机版API演示程序 做车载的应该和这个程序打交道打的比较多吧,这里是我今天写的一个实现了他的API的一个演示程序 首先我们来看下他的官网. http://lbs.amap.com/api/a ...

  7. 基于.Net平台C#的微信网页版API

    git上有很多类似的项目,但大多都是python和js的,为了便于.Net windows平台的使用,我重构了一个.Net版本的,已整理开源 https://github.com/leestar54/ ...

  8. 【Java密码学】使用Bouncy Castle生成数字签名、数字信封

    Bouncy Castle(轻量级密码术包)是一种用于 Java 平台的开放源码的轻量级密码术包,它支持大量的密码术算法,并提供 JCE 1.2.1 的实现.最近项目上正好用到了Bouncy Cast ...

  9. 将html版API文档转换成chm格式的API文档

    文章完全转载自: https://blog.csdn.net/u012557538/article/details/42089277 将html版API文档转换成chm格式的API文档并不是一件难事, ...

随机推荐

  1. DNS劫持和DNS污染解决办法

    编号:1013时间:2016年5月26日09:35:27功能:DNS劫持和DNS污染解决办法URL : http://www.itechzero.com/dns-hijacking-dns-pollu ...

  2. Git工作常用

    工作时,最好每次都创建一个本地分支,这样就会减少错误修改远程代码的机会. 基于远程dev分支创建分支并切到本地分支: git checkout -b <local_dev> -t orig ...

  3. linux shell 逻辑运算符、逻辑表达式详解

    shell的逻辑运算符 涉及有以下几种类型,因此只要适当选择,可以解决我们很多复杂的判断,达到事半功倍效果. 一.逻辑运算符 逻辑卷标 表示意思 1. 关于档案与目录的侦测逻辑卷标! -f 常用!侦测 ...

  4. 转:db2 backup 及 restore

    db2 backup 及 restore 2011-06-21 18:12:20|  分类: AIX |举报 |字号 订阅     两个问题: db2=>list applications db ...

  5. html5的结构标记与内联元素

    <article>标签定义外部的内容(结构元素)<section>标签定义文档中的节(section,区段).比如章节,页眉,页脚或文档中的其他部分(结构元素)<nav& ...

  6. 本文使用springMVC和ajax,实现将JSON对象返回到页面

    一.引言 本文使用springMVC和ajax做的一个小小的demo,实现将JSON对象返回到页面,没有什么技术含量,纯粹是因为最近项目中引入了springMVC框架. 二.入门例子 ①. 建立工程, ...

  7. leetcode 103 Binary Tree Zigzag Level Order Traversal ----- java

    Given a binary tree, return the zigzag level order traversal of its nodes' values. (ie, from left to ...

  8. 家族_NOI导刊2010普及(10)

    题目描述 在一个与世隔绝的岛屿上,有一个有趣的现象:同一个家族的人家总是相邻的(这里的相邻是指东南西北四个方向),不同的家族之间总会有河流或是山丘隔绝,但同一个家族的人不一定有相同姓氏.现在给你岛上的 ...

  9. php构造函数实例讲解

    PHP官网定义: 复制代码 代码如下: 构造函数是类中的一个特殊函数,当使用 new 操作符创建一个类的实例时,构造函数将会自动调用.当函数与类同名时,这个函数将成为构造函数.如果一个类没有构造函数, ...

  10. P235 实战练习(集合类)

    将1~100之间的所有正整数存放在一个List集合中,并将集合中索引位置是10的对象从集合中移除. package org.hanqi.practise; import java.util.*; pu ...