这个作者还写了个后篇,只是保存16进制DER编码格式,而非常见的pem字符串或xml字符串格式,没法用。

解决方案 »

  1.   

    写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;
        }
    }
      

  2.   

    这里不是应用,而是
     //RSA密钥构造器的参数
                RsaKeyGenerationParameters param = new RsaKeyGenerationParameters(
                    Org.BouncyCastle.Math.BigInteger.ValueOf(3), 
                    new Org.BouncyCastle.Security.SecureRandom(), 
                    1024,   //密钥长度
                    25);
                //用参数初始化密钥构造器
                keyGenerator.Init(param);生成密钥后如何生成pem 格式数据导出成pem文件,而不是用openssl生成。
      

  3.   

    // ... 你的代码 
    //产生密钥对
    AsymmetricCipherKeyPair keyPair = keyGenerator.GenerateKeyPair();// 我提供的例子就有WritePem:
    string pem = WritePem(keyPair);
    File.WriteAllText("文件名", pem);