做这个东西在坑里爬了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 错误时,很大可能性就是编码的问题,即密文的格式不正确。

c rsa java私钥_RSA,JAVA私钥加密,C#公钥解密相关推荐

  1. Java使用RSA的公钥加密,私钥解密;私钥加密,公钥解密

    Java使用RSA的公钥加密,私钥解密:私钥加密,公钥解密 import lombok.extern.slf4j.Slf4j; import org.apache.commons.codec.bina ...

  2. RSA-公钥加密,私钥解密 、私钥加密,公钥解密、私钥加签,公钥验签

    https://blog.csdn.net/qq_31289187/article/details/85234044 一.案例内容: RSA 公钥加密,私钥解密:     RSA 私钥加密,公钥解密: ...

  3. java程序jar包xjar加密及破解解密

    背景 项目要部署到第三方服务器上,于是研究了一下jar包加密的方式,其中在github上有一个项目XJar,挺多使用用户,也搜到了破解的教程,于是研究了一下.详细说下如何加密.破解.这些加密只能说&q ...

  4. signature=c9e077ef93038bf703dbc146dd834bb7,基于RSASignUtil非对称私钥进行字符串加签及公钥解密验证的完整代码示例...

    一.前言 通过之前定义RSAUtil工具类可以生成获取rsa非对称公私钥,基于私钥我们通过将字符串进行加签加密,再通过公钥进行解密验证,详情参见RSASignUtil代码工具类示例. 二.代码示例im ...

  5. rsa java模数_RSA公私钥获取模数和质数

    实际项目中,发现前端在生成公钥对象的时候并不是使用这种方式,而是通过对应的模数跟质数来构造公钥对象的,这样的话,需要进一步将生成的公钥取出对应的模数和质数.openssl.java api都可以将质数 ...

  6. Java使用AES/EBC/PKCS5Padding加密,CryptoJS解密错误

    const key = CryptoJS.enc.Utf8.parse('你的秘钥'); // 这里是需要注意的地方// 其次就是{mode: CryptoJS.mode.ECB},我用的是4.1.1 ...

  7. java pkcs8格式的私钥_RSA加密解密中pkcs1与pkcs8格式私钥互相转换

    net,ios中rsa加解密使用的是pkcs1,而java使用的是pkcs8 如果是按1024取模(通常都是1024),pkcs1格式的私钥长度应该是812.如果是pkcs8的格式的密钥长度为861. ...

  8. java js 非对称加密算法_Java加密技术(四)——非对称加密算法RSA

    Java非对称加密算法rsa 接下来我们介绍典型的非对称加密算法--RSA RSA 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法.它易于理解和操作,也很流行.算法的名字 ...

  9. Java进阶(七)Java加密技术之非对称加密算法RSA

    Java加密技术(四)--非对称加密算法RSA 非对称加密算法--RSA 基本概念 非对称加密算法是一种密钥的保密方法. 非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(priv ...

  10. 1、【java数据安全】数据安全之加密解密(base64、MD、SHA、DES、AES、IDEA、PBE、DH、RSA、EIGamal)、数字签名(DSA、ECDSA)和数字证书介绍、应用示例详细介绍

    java数据安全 系列文章 1.[java数据安全]数据安全之加密解密(base64.MD.SHA.DES.AES.IDEA.PBE.DH.RSA.EIGamal).数字签名(DSA.ECDSA)和数 ...

最新文章

  1. 虚拟机下Linux安装图解之四:VMware Tools 的安装
  2. easyexcel根据模板写入_用 Vue+ElementUI 搭建后台管理极简模板
  3. Objective-C之成魔之路【16-使用文件】
  4. 使用正则表达式模拟读写INI文件
  5. 扎克伯格做了26张PPT
  6. cityscapes数据集_全景分割 UPSNet 源码分析 (1) - 数据格式
  7. P2680 运输计划
  8. 日志长度_Kafka 日志存储详解
  9. Spring @ComponentScan
  10. 在Eclipse上安装pydev开发工具
  11. The 2021 ICPC Asia Regionals Online Contest (I)
  12. UltraEdit 21 for Mac(超好用的高级文本编辑器)
  13. wordpress无法建立目录 是否上级目录没有写权限?解决办法
  14. 基于深度学习的身份证号码识别方法
  15. java版我的世界MITE怎么下_MITE纯新手向教程 - [MITE]MC实在是太简单了 (Minecraft Is Too Easy) - MC百科|最大的Minecraft中文MOD百科...
  16. c51单片机汇编语言1秒延时,51单片机汇编延时程序算法详解
  17. rollup打包工具
  18. 关于UGUI如何自动拓展父物体大小
  19. CF - D. Letter Picking(博弈 + 区间dp)
  20. Java+selenium简单实现web自动化测试

热门文章

  1. iis服务器怎样配置多张证书,IIS配置多个ssl怎么做?怎么配置?
  2. 单列多行转单行单列合并oracle_Oracle - 子查询、TOP - N
  3. lumanager mysql_LuManager单独安装mysqli
  4. c语言最长公共子序列_LCS(最长公共子序列)
  5. python如何调用java写的接口_Python 调用翻译接口
  6. 【转】使用ssh-copy-id 快速的配置免密登录
  7. UVa LA 4253 UVa 1421 Archery 枚举,状态削减,oj错误题目 难度: 1
  8. Jmeter输出完美报告
  9. Redis中的发布与订阅
  10. 在执行方法和Web资源中获取传递过来参数的值