zoukankan      html  css  js  c++  java
  • C# RSA PEM解密字符

    1、第一步先用openssl将pem的key转换为der的key //bin>openssl.exe rsa -in rsakeydec.pem -outform der -out pri.der 
    2、调用下面的程序直接读取der转换为c#所需要的xml Key,之后进行密文解密 

    using System;
    using System.IO;
    using System.Security.Cryptography;
    using System.Text;
    
    namespace ConsoleApplication3 {
    
    
        class Program {
            private static int GetIntegerSize(BinaryReader binr) {
                int count;
                var bt = binr.ReadByte();
                if(bt != 0x02)        //expect integer
                    return 0;
                bt = binr.ReadByte();
    
    
                if(bt == 0x81)
                    count = binr.ReadByte();    // data size in next byte
                else
                    if(bt == 0x82) {
                    var highbyte = binr.ReadByte();
                    var lowbyte = binr.ReadByte();
                    byte[] modint = { lowbyte,highbyte,0x00,0x00 };
                    count = BitConverter.ToInt32(modint,0);
                } else {
                    count = bt;        // we already have the data size
                }
    
    
                while(binr.ReadByte() == 0x00) {    //remove high order zeros in data
                    count -= 1;
                }
                binr.BaseStream.Seek(-1,SeekOrigin.Current);        //last ReadByte wasn't a removed zero, so back up a byte
                return count;
            }
    
    
            /// <summary>
            /// e.g:"D:\pri.der";
            /// </summary>
            /// <param name="filePath"></param>
            /// <returns></returns>
            public static RSACryptoServiceProvider DecodeRsaPrivateKey(string filePath) {
    
                byte[] MODULUS, E, D, P, Q, DP, DQ, IQ;
    
                FileStream fs = new FileStream(filePath,FileMode.Open,FileAccess.Read);
    
                BinaryReader binr = new BinaryReader(fs);    //wrap Memory Stream with BinaryReader for easy reading
                try {
                    var twobytes = binr.ReadUInt16();
                    if(twobytes == 0x8130) //data read as little endian order (actual data order for Sequence is 30 81)
                        binr.ReadByte();        //advance 1 byte
                    else if(twobytes == 0x8230)
                        binr.ReadInt16();       //advance 2 bytes
                    else
                        return null;
    
    
                    twobytes = binr.ReadUInt16();
                    if(twobytes != 0x0102) //version number
                        return null;
                    var bt = binr.ReadByte();
                    if(bt != 0x00)
                        return null;
    
                    var elems = GetIntegerSize(binr);
                    MODULUS = binr.ReadBytes(elems);
    
    
                    elems = GetIntegerSize(binr);
                    E = binr.ReadBytes(elems);
    
    
                    elems = GetIntegerSize(binr);
                    D = binr.ReadBytes(elems);
    
    
                    elems = GetIntegerSize(binr);
                    P = binr.ReadBytes(elems);
    
    
                    elems = GetIntegerSize(binr);
                    Q = binr.ReadBytes(elems);
    
    
                    elems = GetIntegerSize(binr);
                    DP = binr.ReadBytes(elems);
    
    
                    elems = GetIntegerSize(binr);
                    DQ = binr.ReadBytes(elems);
    
    
                    elems = GetIntegerSize(binr);
                    IQ = binr.ReadBytes(elems);
                    // ------- create RSACryptoServiceProvider instance and initialize with public key -----
                    RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                    RSAParameters rsAparams = new RSAParameters();
                    rsAparams.Modulus = MODULUS;
                    rsAparams.Exponent = E;
                    rsAparams.D = D;
                    rsAparams.P = P;
                    rsAparams.Q = Q;
                    rsAparams.DP = DP;
                    rsAparams.DQ = DQ;
                    rsAparams.InverseQ = IQ;
                    rsa.ImportParameters(rsAparams);
                    return rsa;
                } catch(Exception e) {
                    Console.WriteLine(e.Message + e.StackTrace);
                    return null;
                } finally {
                    binr.Close();
                }
            }
    
            /// <summary>
            /// 导出私钥XML解密格式
            /// </summary>
            /// <returns></returns>
            public static string  PrivateKeyDecXml() {
                RSACryptoServiceProvider rsaProvider = DecodeRsaPrivateKey(@"D:\pri.der");
                var privateKey = rsaProvider.ToXmlString(true);
                return privateKey;
            }
    
    
            /// <summary>
            /// RSA解密
            /// </summary>
            /// <param name="privatekey"></param>
            /// <param name="content"></param>
            /// <returns></returns>
            public static string RsaDecrypt(string privatekey,string content) {
    
                RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
                byte[] cipherbytes;
                rsa.FromXmlString(privatekey);
                cipherbytes = rsa.Decrypt(Convert.FromBase64String(content),false);
    
                return Encoding.UTF8.GetString(cipherbytes);
            }
    
        
    
            static void Main(string[] args) {
            
            var str= PrivateKeyDecXml();
    
                var s = RsaDecrypt(str,
                    "jB6EKo9Oakc8MYMlKorZmj415+s8Qf1sHr1MIPjZcybaFhRQDVb+MBZ734p45lc2RlEJUDsy5HRH8I4LvcGSNE0kJu+ge2yy9E8xOD3dWUTU9/30vv7cEbQ5WSHtjl0MyvhTX51x3vrW/oqubH0H3p827GF3c+ALPlxrvG1gHTc=");
            }
        }
    }
  • 相关阅读:
    CCNP路由实验(4) -- BGP
    CCNP路由实验(3) -- 路由控制
    CCNP路由实验(2) -- OSPF
    什么是依赖注入
    java中接口的定义与实现
    火炬之光模型导出(Unity载入火炬之光的模型)
    【创新培育项目】为什么要组队參加比赛?及如何寻找一个合适的选题?
    oracle中schema指的是什么?
    介绍自己上架的第一个游戏
    unity 打包资源及网络请求资源包
  • 原文地址:https://www.cnblogs.com/flyfish2012/p/5691470.html
Copyright © 2011-2022 走看看