用Bouncy Castle的C#版API产生公钥和私钥 如何保存成文件与加载

cqhydz 2015-03-12 06:12:22
搞了几天都没有有完成,求助一下
网上找到的例了,这个算简单的一个,代码能跑,但问题是 这里面的key怎么导出成文件,还有使用时怎么载入,没搞明白,有哪位搞过这方面的指导一下。

http://blog.csdn.net/popozhu/article/details/5789382
using System;
using System.Collections.Generic;
using System.Text;
using Org.BouncyCastle.Crypto.Generators;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Crypto;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.Crypto.Engines; //IAsymmetricBlockCipher engine = new RsaEngine();
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
//RSA密钥对的构造器
RsaKeyPairGenerator keyGenerator = new RsaKeyPairGenerator();

//RSA密钥构造器的参数
RsaKeyGenerationParameters param = new RsaKeyGenerationParameters(
Org.BouncyCastle.Math.BigInteger.ValueOf(3),
new Org.BouncyCastle.Security.SecureRandom(),
1024, //密钥长度
25);
//用参数初始化密钥构造器
keyGenerator.Init(param);
//产生密钥对
AsymmetricCipherKeyPair keyPair = keyGenerator.GenerateKeyPair();
//获取公钥和密钥
AsymmetricKeyParameter publicKey = keyPair.Public;
AsymmetricKeyParameter privateKey = keyPair.Private;
if( ((RsaKeyParameters)publicKey).Modulus.BitLength<1024 )
{
Console.WriteLine("failed key generation (1024) length test");
}
//一个测试……………………
//输入,十六进制的字符串,解码为byte[]
//string input = "4e6f77206973207468652074696d6520666f7220616c6c20676f6f64206d656e";
//byte[] testData = Org.BouncyCastle.Utilities.Encoders.Hex.Decode(input);
string input = "popozh RSA test";
byte[] testData = Encoding.UTF8.GetBytes(input);
Console.WriteLine("明文:" + input + Environment.NewLine);
//非对称加密算法,加解密用
IAsymmetricBlockCipher engine = new RsaEngine();
//公钥加密
engine.Init(true, publicKey);
try
{
testData = engine.ProcessBlock(testData, 0, testData.Length);
Console.WriteLine("密文(base64编码):" + Convert.ToBase64String(testData) + Environment.NewLine);
}
catch (Exception ex)
{
Console.WriteLine("failed - exception " + Environment.NewLine + ex.ToString());
}
//私钥解密
engine.Init(false, privateKey);
try
{
testData = engine.ProcessBlock(testData, 0, testData.Length);

}
catch (Exception e)
{
Console.WriteLine("failed - exception " + e.ToString());
}
if (input.Equals(Encoding.UTF8.GetString(testData)))
{
Console.WriteLine("解密成功");
}
Console.Read();
}
}
}
...全文
325 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Forty2 2015-03-14
  • 打赏
  • 举报
回复
// ... 你的代码 //产生密钥对 AsymmetricCipherKeyPair keyPair = keyGenerator.GenerateKeyPair(); // 我提供的例子就有WritePem: string pem = WritePem(keyPair); File.WriteAllText("文件名", pem);
cqhydz 2015-03-14
  • 打赏
  • 举报
回复
引用 2 楼 Forty2 的回复:
写Pem字符串比较容易,用Org.BouncyCastle.OpenSsl.PemWriter就可以了。格式类似以下的例子:

static void Main(string[] args)
{
    string pem =
        @"-----BEGIN RSA PRIVATE KEY-----
        MIICWwIBAAKBgQCuvrDVWxG0GA3vL8WBeHLS/eH49evvEc/+9cqdNUASeK++O/Ha
        L/BFzNY3EXm7Q0fZaQybp7sUZAS1XY3ySljJFRmNQBcyyVdEe4FUpLnoiO5Je5/v
        3Ok8cSyC6lTjYfM5XDNbPpIP12+rFGtmgsnHLobk/vgoR99OEcVFVkbgDQIBEQKB
        gQCkdz0FCmsD2md3tH2nB/OZZ2tEqzhoiTw7Qa+jBPECU3g6ksWCDwBBsbqOLpCw
        P1KugPzOu/tefECqsmd6oFOOg6Z0+ZZ5pJU6yuGIPW9eQ0WjSQJVmQE57fUZnsP2
        xGIwGL8/99jWHEncJL/o+0oOP9jcZ31zPajc8Pqo76M88QJBAOpCMmW89DtLcneq
        rOyndg6vmo8KKpNKVg1lMCOLDOBrqtyRHOL/n7nWmX6e1y0mc5ZBW0RBbVl6Ur8Q
        EoS1QdECQQC+9n6RKl1PLUOMRwb2zB5SxLFvA0pXDZjW8ueOGaBQ3ztlVwpkPAyf
        ipeuwKfKpKR0bx+MwXB84ZCSqt9S9C19AkEAwOs4kAUFXgHly/X30fNSKjZDDGK5
        pnl0CwgJhq6/T2e54tHbjcN0euz24L8Ljpgi9DXSsK5aDXPLrGeWx6RUUQJAe5Bw
        A5PiBg46xC31coQTnve+GqfGsMyQEp0sawGF2fnbI3SOQNuPsobankBski5MS1b2
        TASyMrASQMjq21K0BQJAEx/dAjP9NtN7x4WJylhtY9RZPAeqDRxHKYNiLTOWB03L
        dCzFm4VLgHjXRkmeuQ/MWmNR/XhXChXh1PWKSrCJmQ==
        -----END RSA PRIVATE KEY-----";
    AsymmetricCipherKeyPair pair = ReadPem(pem);

    var rsa = new RsaEngine();
    rsa.Init(true, pair.Public);
    byte[] encrypted = rsa.ProcessBlock(Encoding.UTF8.GetBytes("hello"), 0, 5);
    rsa.Init(false, pair.Private);
    string decrypted = Encoding.UTF8.GetString(rsa.ProcessBlock(encrypted, 0, encrypted.Length)); // hello

}

static string WritePem(AsymmetricCipherKeyPair pair)
{
    using (TextWriter textWriter = new StringWriter())
    {
        var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(textWriter);
        pemWriter.WriteObject(pair.Private);
        return textWriter.ToString();
    }
}

static AsymmetricCipherKeyPair ReadPem(string pem)
{
    using(TextReader reader = new StringReader(pem))
    {
        var obj = new Org.BouncyCastle.OpenSsl.PemReader(reader).ReadObject();
        return obj as AsymmetricCipherKeyPair;
    }
}
这里不是应用,而是 //RSA密钥构造器的参数 RsaKeyGenerationParameters param = new RsaKeyGenerationParameters( Org.BouncyCastle.Math.BigInteger.ValueOf(3), new Org.BouncyCastle.Security.SecureRandom(), 1024, //密钥长度 25); //用参数初始化密钥构造器 keyGenerator.Init(param); 生成密钥后如何生成pem 格式数据导出成pem文件,而不是用openssl生成。
Forty2 2015-03-13
  • 打赏
  • 举报
回复
写Pem字符串比较容易,用Org.BouncyCastle.OpenSsl.PemWriter就可以了。格式类似以下的例子:

static void Main(string[] args)
{
    string pem =
        @"-----BEGIN RSA PRIVATE KEY-----
        MIICWwIBAAKBgQCuvrDVWxG0GA3vL8WBeHLS/eH49evvEc/+9cqdNUASeK++O/Ha
        L/BFzNY3EXm7Q0fZaQybp7sUZAS1XY3ySljJFRmNQBcyyVdEe4FUpLnoiO5Je5/v
        3Ok8cSyC6lTjYfM5XDNbPpIP12+rFGtmgsnHLobk/vgoR99OEcVFVkbgDQIBEQKB
        gQCkdz0FCmsD2md3tH2nB/OZZ2tEqzhoiTw7Qa+jBPECU3g6ksWCDwBBsbqOLpCw
        P1KugPzOu/tefECqsmd6oFOOg6Z0+ZZ5pJU6yuGIPW9eQ0WjSQJVmQE57fUZnsP2
        xGIwGL8/99jWHEncJL/o+0oOP9jcZ31zPajc8Pqo76M88QJBAOpCMmW89DtLcneq
        rOyndg6vmo8KKpNKVg1lMCOLDOBrqtyRHOL/n7nWmX6e1y0mc5ZBW0RBbVl6Ur8Q
        EoS1QdECQQC+9n6RKl1PLUOMRwb2zB5SxLFvA0pXDZjW8ueOGaBQ3ztlVwpkPAyf
        ipeuwKfKpKR0bx+MwXB84ZCSqt9S9C19AkEAwOs4kAUFXgHly/X30fNSKjZDDGK5
        pnl0CwgJhq6/T2e54tHbjcN0euz24L8Ljpgi9DXSsK5aDXPLrGeWx6RUUQJAe5Bw
        A5PiBg46xC31coQTnve+GqfGsMyQEp0sawGF2fnbI3SOQNuPsobankBski5MS1b2
        TASyMrASQMjq21K0BQJAEx/dAjP9NtN7x4WJylhtY9RZPAeqDRxHKYNiLTOWB03L
        dCzFm4VLgHjXRkmeuQ/MWmNR/XhXChXh1PWKSrCJmQ==
        -----END RSA PRIVATE KEY-----";
    AsymmetricCipherKeyPair pair = ReadPem(pem);

    var rsa = new RsaEngine();
    rsa.Init(true, pair.Public);
    byte[] encrypted = rsa.ProcessBlock(Encoding.UTF8.GetBytes("hello"), 0, 5);
    rsa.Init(false, pair.Private);
    string decrypted = Encoding.UTF8.GetString(rsa.ProcessBlock(encrypted, 0, encrypted.Length)); // hello

}

static string WritePem(AsymmetricCipherKeyPair pair)
{
    using (TextWriter textWriter = new StringWriter())
    {
        var pemWriter = new Org.BouncyCastle.OpenSsl.PemWriter(textWriter);
        pemWriter.WriteObject(pair.Private);
        return textWriter.ToString();
    }
}

static AsymmetricCipherKeyPair ReadPem(string pem)
{
    using(TextReader reader = new StringReader(pem))
    {
        var obj = new Org.BouncyCastle.OpenSsl.PemReader(reader).ReadObject();
        return obj as AsymmetricCipherKeyPair;
    }
}
cqhydz 2015-03-12
  • 打赏
  • 举报
回复
这个作者还写了个后篇,只是保存16进制DER编码格式,而非常见的pem字符串或xml字符串格式,没法用。

110,526

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧