1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > c rsa java私钥_RSA JAVA私钥加密 C#公钥解密

c rsa java私钥_RSA JAVA私钥加密 C#公钥解密

时间:2022-03-09 14:00:35

相关推荐

c rsa java私钥_RSA JAVA私钥加密 C#公钥解密

做这个东西在坑里爬了3天才爬出来,记录下供园友参考。C#程序员一枚,项目需要和Java做数据交互,对方甩了段密文和一个CER证书给我,然后我要对其密文进行解密。 RSA 非对称加密,对方用私钥加密,我用公钥解密。关于证书的一点说明:证书类型有两种 .pfx 和 .cer ,其中 .pfx 证书既包含公钥也包含私钥, 而 .cer 证书只包含公钥。

C#默认RSA只支持公钥加密,私钥解密。而现在的需求正好相反,因此想要直接用C#内置加密类肯定是行不通的。而且C#和Java的RSA加密并不互通。经过多方资料查找,采用第三方类库 BouncyCastle实现了当前需求。具体来看代码,这里贴出主要代码段:

1. 从cer证书中读取公钥。C#中的公钥格式是xml格式的字符串,与java中的公钥格式是不一样的。

///

///从证书中获取公钥///

///

///

private string GetPublicKeyFromCer(stringcerPath)

{

X509Certificate2 pubcrt= newX509Certificate2(cerPath);

RSACryptoServiceProvider pubkey=(RSACryptoServiceProvider)pubcrt.PublicKey.Key;return pubkey.ToXmlString(false);

}

2. 将C#格式公钥转换成Java格式公钥

///

///将C#格式公钥转成Java格式公钥///

///

///

public static RsaKeyParameters RSAPublicKeyDotNet2Java(stringpublicKey)

{

XmlDocument doc= newXmlDocument();

doc.LoadXml(publicKey);

BigInteger m= new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));

BigInteger p= new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));

RsaKeyParameters pub= new RsaKeyParameters(false, m, p);returnpub;

}

3. 公钥解密。因为对方给的密文是经过base64编码的,所以要先解码。而且加密填充模式要设置成和java那边的一致,我这里设置的是 "RSA/ECB/PKCS1Padding"。

///

///公钥解密///

/// C#格式公钥

/// 密文

///

public static string RSADecryptByPublicKey(string xmlPublicKey, stringstrEncryptString)

{//得到公钥

RsaKeyParameters keyParams =RSAPublicKeyDotNet2Java(xmlPublicKey);//参数与Java中加密解密的参数一致

IBufferedCipher c = CipherUtilities.GetCipher("RSA/ECB/PKCS1Padding");//第一个参数 true-加密,false-解密;第二个参数表示密钥

c.Init(false, keyParams);//对密文进行base64解码

byte[] dataFromEncrypt =Convert.FromBase64String(strEncryptString);//解密

byte[] outBytes =c.DoFinal(dataFromEncrypt);//明文

string clearText =Encoding.Default.GetString(outBytes);returnclearText;

}

以上代码都依赖于BouncyCastle 使用前记得先添加引用。为什么这样一个问题在坑里呆了3天呢?原因是Java那边返给我的密文格式是错误的,导致我怎么也解不出来。当时那个急的,还以为Java和C#实现不了互通加解密呢!最后这个问题还是我自己找出来的,丢了张截图给他们

就是这个原因,导致我加了两天班.... 当你解密时遇到 Unknown block type 错误时,很大可能性就是编码的问题,即密文的格式不正确。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。