C# 使用BouncyCastle生成RSA PEM格式公钥私钥(PKCS#1,PKCS#8)

一.简单了解下RSA非对称加密

RSA是一种广泛使用的非对称加密算法,用于加密和签名数据。在RSA中,有两种常见的格式:PKCS#1和PKCS#8。
PKCS#1是一种RSA密钥的标准格式,PKCS#8是一种更通用的密钥格式,它可以用来表示RSA、DSA、DHP、ElGamal和其他非对称密钥。


二.代码

1.生成PEM密钥对

            // 创建RSA密钥对生成器
            RsaKeyPairGenerator generator = new RsaKeyPairGenerator();
            generator.Init(new KeyGenerationParameters(new SecureRandom(), 1024));
            AsymmetricCipherKeyPair keyPair = generator.GenerateKeyPair();

            // 生成PKCS1格式的私钥
            using (var textWriter = new StringWriter())
            {
                var pemWriter = new PemWriter(textWriter);
                pemWriter.WriteObject(keyPair.Private);
                pemWriter.Writer.Flush();

                string pkcs1PrivateKey = textWriter.ToString();
                Console.WriteLine("PKCS#1 Private Key: \n{0}", pkcs1PrivateKey);
            }

            // 生成PKCS8格式的私钥
            using (var textWriter = new StringWriter())
            {
                Pkcs8Generator pkcs8 = new Pkcs8Generator(keyPair.Private);
                var pemWriter = new PemWriter(textWriter);
                pemWriter.WriteObject(pkcs8.Generate());
                pemWriter.Writer.Flush();

                string pkcs8PrivateKey = textWriter.ToString();
                Console.WriteLine("PKCS#8 Private Key: \n{0}", pkcs8PrivateKey);
            }

            // 生成PKCS1格式的公钥
            using (var textWriter = new StringWriter())
            {
                var pemWriter = new PemWriter(textWriter);
                pemWriter.WriteObject(keyPair.Public);
                pemWriter.Writer.Flush();

                string pkcs1PublicKey = textWriter.ToString();
                Console.WriteLine("Public Key: \n{0}", pkcs1PublicKey);
            }

利用BouncyCastle库生成PE密钥对,注意这里的PemWriter用此Org.BouncyCastle.OpenSsl.PemWriter命名空间,对WriterObject封装的重载。

2.用私钥加密数据

            var rsa = new RSACryptoServiceProvider();
            try
            {
                rsa.ImportFromPem(PrivateKey);
            }
            catch (ArgumentException ex)
            {
                MessageBox.Show("私钥错误!");
                return;
            }
            byte[] data = ne byte[]
            {
              xx
            }; ...//写入需加密的数据
            var dataLen = data.Length;
            var dataLenByte = new byte[] { (byte)(dataLen >> 8), (byte)dataLen };
            var dataSigned = rsa.SignData(data, new SHA512CryptoServiceProvider());
            var dataCombined = new byte[dataLenByte.Length + data.Length + dataSigned.Length];
            dataLenByte.CopyTo(dataCombined, 0);
            data.CopyTo(dataCombined, dataLenByte.Length);
            dataSigned.CopyTo(dataCombined, dataLenByte.Length + data.Length);
            //签名
            var dataSigned = rsa.SignData(data, new SHA512CryptoServiceProvider());
            var license = Convert.ToBase64String(data);//转成加密字符码

3.用公钥钥解密数据

            var rsa = new RSACryptoServiceProvider();
            try
            {
                rsa.ImportFromPem(PublicKey);
            }
            catch (ArgumentException)
            {
                MessageBox.Show("公钥错误!");
                return;
            }
            byte[] licenseDecode;
            try
            {
                licenseDecode = Convert.FromBase64String(License);
            }
            catch (Exception e) 
            {
               MessageBox.Show("激活码错误!");
                return;
            }
             // 头两个字节是授权信息的长度
            var dataLen = (licenseDecode[0] << 8) + licenseDecode[1];
            // 授权信息
            var data = licenseDecode[2..(dataLen + 2)];
            // 授权信息的签名
            var dataSigned = licenseDecode[(dataLen + 2)..];
            // 验证签名与原始信息是否匹配
            //这里的字节流结构与上文私钥加密相匹配
             if (!rsa.VerifyData(data, new SHA512CryptoServiceProvider(),dataSigned))
            {
                MessageBox.Show("激活码错误!请检查激活码后重试");
                return;
            }
            //根据业务对授权信息data再验证
            .....

记录一下,防止后面再花时间找。

■Generation and parsing of PKCS#12 files. ■X.509: Generators and parsers for V1 and V3 certificates, V2 CRLs and attribute certificates. ■PBE algorithms supported by PBEUtil: PBEwithMD2andDES-CBC, PBEwithMD2andRC2-CBC, PBEwithMD5andDES-CBC, PBEwithMD5andRC2-CBC, PBEwithSHA1andDES-CBC, PBEwithSHA1andRC2-CBC, PBEwithSHA-1and128bitRC4, PBEwithSHA-1and40bitRC4, PBEwithSHA-1and3-keyDESEDE-CBC, PBEwithSHA-1and2-keyDESEDE-CBC, PBEwithSHA-1and128bitRC2-CBC, PBEwithSHA-1and40bitRC2-CBC, PBEwithHmacSHA-1, PBEwithHmacSHA-224, PBEwithHmacSHA-256, PBEwithHmacRIPEMD128, PBEwithHmacRIPEMD160, and PBEwithHmacRIPEMD256. ■Signature algorithms supported by SignerUtilities: MD2withRSA, MD4withRSA, MD5withRSA, RIPEMD128withRSA, RIPEMD160withRSA, RIPEMD256withRSA, SHA-1withRSA, SHA-224withRSA, SHA-256withRSAandMGF1, SHA-384withRSAandMGF1, SHA-512withRSAandMGF1, SHA-1withDSA, and SHA-1withECDSA. ■Symmetric key algorithms: AES, Blowfish, Camellia, CAST5, CAST6, DESede, DES, GOST28147, HC-128, HC-256, IDEA, NaccacheStern, RC2, RC4, RC5-32, RC5-64, RC6, Rijndael, Serpent, Skipjack, TEA/XTEA, Twofish, and VMPC. ■Symmetric key modes: CBC, CFB, CTS, GOFB, OFB, OpenPGPCFB, and SIC (or CTR). ■Symmetric key paddings: ISO10126d2, ISO7816d4, PKCS#5/7, TBC, X.923, and Zero Byte. ■Asymmetric key algorithms: RSA (with blinding), ElGamal, DSA, ECDSA. ■Asymmetric key paddings/encodings: ISO9796d1, OAEP, and PKCS#1. ■Digests: GOST3411, MD2, MD4, MD5, RIPEMD128, RIPEMD160, RIPEMD256, RIPEMD320, SHA-1, SHA-224, SHA-256, SHA-384, SHA-512, Tiger, and Whirlpool. ■Signer mechanisms: DSA, ECDSA, ECGOST3410, GOST3410, ISO9796d2, PSS, RSA. ■Key Agreement: Diffie-Hellman and EC-DH. ■Macs: CBCBlockCipher, CFBBlockCipher, GOST28147, HMac, and ISO9797 Alg. 3. ■PBE generators: PKCS#12, and PKCS#5 - schemes 1 and 2. ■OpenPGP (RFC 4880) ■Cryptographic Message Syntax (CMS, RFC 3852), including streaming API. ■Online Certificate Status Protocol (OCSP, RFC 2560). ■Time Stamp Protocol (TSP, RFC 3161). ■TLS/SSL Client with support for client side authentication.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>