从.pem文件在C#中的私钥与.NET密码库解密 [英] Decrypting with private key from .pem file in c# with .NET crypto library

查看:195
本文介绍了从.pem文件在C#中的私钥与.NET密码库解密的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我知道这是一个类似的问题,以之一,但之前,我低着头Bouncey城堡的路线,没有人知道它可以从一个.pem文件加载一个RSA密钥对,例如:

I know this is a similar question to this one but before I head down the Bouncey Castle route, does anyone know if its possible to load an RSA KeyPair from a .pem file, e.g.:

 -----BEGIN RSA PRIVATE KEY-----
 MIIBOgIBAAJBALKzy66nRuof8Fg0ItatyHS9RiDIKH0m5lorKzKn4y5wR6BXpVUv
 ZwnevrAJWBd6EPr/lcV3hjObxD6+q9vmN8ECAwEAAQJAGNcxWwfZrbXe3QPyS9FA
 aindU7U/G5aKssIJcTMxO0UYpGU+WArJbboKeEIE7bpNfhDOKTL7ZL6kWBR1Svlh
 WQIhAOhtx+xXuSrIot59tmXZaypBDjA4n+Xare0ObFLQxWuvAiEAxNMwm6w33bVr
 FHS9slkOh59Le2mgs0uNT6perHaRP48CIGMyRzrlDY/m5SvTtz6slgIIlceawxNU
 Sxp7J1wI4djdAiA6+BchHNjkCP2a9Fr9OydaRMSFpiDqduFQk/enbiKYSwIhANO3
 SQ51oLFtWN9gX3tfKTXflyO6BV8rgPo980d9CEsb
 -----END RSA PRIVATE KEY-----

直接与.NET 3.5加密库,而不必去到第三方或推出自己的?

directly with the .NET 3.5 crypto library without having to go to a 3rd party or roll my own?

推荐答案

<一个href="http://www.jensign.com/opensslkey/index.html">http://www.jensign.com/opensslkey/index.html

与源在<一个href="http://www.jensign.com/opensslkey/opensslkey.cs">http://www.jensign.com/opensslkey/opensslkey.cs

编辑:摘录有关code:

edit: excerpted relevant code:

首先,提取的---- ---- BEGIN和END ---- ----部分和Base64德code是文成字节数组(参见上面的内容链接),然后将它传递给:

first, extract the text between the ---- BEGIN ---- and ---- END ---- sections, and base64-decode it into a byte array (see link above for details), then pass it to:

//------- Parses binary ans.1 RSA private key; returns RSACryptoServiceProvider  ---
public static RSACryptoServiceProvider DecodeRSAPrivateKey(byte[] privkey)
{
	byte[] MODULUS, E, D, P, Q, DP, DQ, IQ ;

// ---------  Set up stream to decode the asn.1 encoded RSA private key  ------
	MemoryStream  mem = new MemoryStream(privkey) ;
	BinaryReader binr = new BinaryReader(mem) ;    //wrap Memory Stream with BinaryReader for easy reading
	byte bt = 0;
	ushort twobytes = 0;
	int elems = 0;
	try {
		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;
		bt = binr.ReadByte();
		if (bt !=0x00)
			return null;


//------  all private key components are Integer sequences ----
		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) ;

		Console.WriteLine("showing components ..");
		if (verbose) {
			showBytes("\nModulus", MODULUS) ;
			showBytes("\nExponent", E);
			showBytes("\nD", D);
			showBytes("\nP", P);
			showBytes("\nQ", Q);
			showBytes("\nDP", DP);
			showBytes("\nDQ", DQ);
			showBytes("\nIQ", IQ);
		}

// ------- 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) {
		return null;
	}
	finally {
		binr.Close();
	}
}

这篇关于从.pem文件在C#中的私钥与.NET密码库解密的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆