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

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

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

/// <summary>
/// 从证书中获取公钥
/// </summary>
/// <param name="cerPath"></param>
/// <returns></returns>
private string GetPublicKeyFromCer(string cerPath)
{
X509Certificate2 pubcrt = new X509Certificate2(cerPath);
RSACryptoServiceProvider pubkey = (RSACryptoServiceProvider)pubcrt.PublicKey.Key; return pubkey.ToXmlString(false);
}

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

/// <summary>
/// 将C#格式公钥转成Java格式公钥
/// </summary>
/// <param name="publicKey"></param>
/// <returns></returns>
public static RsaKeyParameters RSAPublicKeyDotNet2Java(string publicKey)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(publicKey);
BigInteger m = new BigInteger(, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[].InnerText));
BigInteger p = new BigInteger(, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[].InnerText));
RsaKeyParameters pub = new RsaKeyParameters(false, m, p); return pub;
}

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

/// <summary>
/// 公钥解密
/// </summary>
/// <param name="xmlPublicKey">C#格式公钥</param>
/// <param name="strEncryptString">密文</param>
/// <returns></returns>
public static string RSADecryptByPublicKey(string xmlPublicKey, string strEncryptString)
{
//得到公钥
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); return clearText;
}

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

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

原文:http://www.cnblogs.com/similar/archive/2017/05/02/6782785.html

RSA,JAVA私钥加密,C#公钥解密的更多相关文章

  1. C# 与JAVA 的RSA 加密解密交互,互通,C#使用BouncyCastle来实现私钥加密,公钥解密的方法

    因为C#的RSA加密解密只有公钥加密,私钥解密,没有私钥加密,公钥解密.在网上查了很久也没有很好的实现.BouncyCastle的文档少之又少.很多人可能会说,C#也是可以的,通过Biginteger ...

  2. Delphi RSA加解密【 (RSA公钥加密,私钥解密)、(RSA私钥加密,公钥解密)、MD5加密、SHA加密】

    作者QQ:(648437169) 点击下载➨delphi RSA加解密 [Delphi RSA加解密]支持 (RSA公钥加密,私钥解密).(RSA私钥加密,公钥解密).MD5加密.SHA1加密.SHA ...

  3. 【绝迹篇】RSA加密算法(私钥加签公钥验签)

    对于上上篇博客中我讲的一个故事,本文引用: https://www.cnblogs.com/ButterflyEffect/p/9851403.html 故事中提到的关于加密会出现,私钥加密,公钥解密 ...

  4. java RSA实现私钥签名、公钥验签、私钥加密数据、公钥解密数据

    通过OpenSSL生成公私钥文件(如果没有OpenSSL工具建议下载Cmder工具自带OpenSSL指令) 1.生成RSA密钥的方法 genrsa -out private-rsa.key 2048 ...

  5. Openssl生成RSA公私钥以及将公钥转换成C#支持的格式

    Openssl生成RSA公私钥以及将公钥转换成C#支持的格式 1.RSA算法介绍 RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密.RSA ...

  6. Java中使用OpenSSL生成的RSA公私钥进行数据加解密

    当前使用的是Linux系统,已经按装使用OpenSSL软件包, 一.使用OpenSSL来生成私钥和公钥 1.执行命令openssl version -a 验证机器上已经安装openssl 1 open ...

  7. RSA不对称加密和公钥 私钥

    理论上只要有加密的规则 基本都是可以解密的 但是如果解密需要消耗的时间过长 比如1000年 解密过后已经没什么意义了 此时可认为这种算法不能被破解 也就是说此加密可信 MD5 是一种单向操作 加密后不 ...

  8. RSA非对称 私钥加密

    RSA生成公钥和私钥对 /// <summary> /// RSA生成公钥和私钥 /// </summary> /// <returns></returns& ...

  9. Java 前端加密传输后端解密以及验证码功能

    目录(?)[-] 加密解密 1 前端js加密概述 2 前后端加密解密 21 引用的js加密库 22 js加密解密 23 Java端加密解密PKCS5Padding与js的Pkcs7一致 验证码 1 概 ...

随机推荐

  1. Linux -- 利用 ptrace 进行代码注入

    #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h&g ...

  2. Echo团队Alpha冲刺随笔集合

    班级:软件工程1916|W 作业:项目Alpha冲刺(团队) 团队名称:Echo 作业目标:完成项目Alpha冲刺 代码规范.冲刺任务与计划 Day 0: 代码规范.任务及计划 冲刺随笔 Day 1: ...

  3. P4111 [HEOI2015]小Z的房间

    你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时候,相邻的格子之间都有墙隔着.你想要打通一些相邻房间的墙,使得所有房间能够互相到达.在此过程中,你不能把 ...

  4. 关于window.onload()的加载问题

    今天写了个js的demo,遇到了个小问题,后来发现是自己对window.onload()的具体用处不是太清楚,现在跟大家分享一下. <head> <meta http-equiv=& ...

  5. ASP.NET Core MVC中Controller的Action,默认既支持HttpGet,又支持HttpPost

    我们知道ASP.NET Core MVC中Controller的Action上可以声明HttpGet和HttpPost特性标签,来限制可以访问Action的Http请求类型(GET.POST等). 那 ...

  6. 扩展 WPF 动画类

    原文:扩展 WPF 动画类 扩展 WPF 动画类                                                                     Charles ...

  7. BJOI2018简要题解

    BJOI2018简要题解 D1T1 二进制 题意 pupil 发现对于一个十进制数,无论怎么将其的数字重新排列,均不影响其是不是 \(3\) 的倍数.他想研究对于二进制,是否也有类似的性质. 于是他生 ...

  8. Session之Config配置

    <sessionState mode="Off|InProc|StateServer|SQLServer" cookieless="true|false" ...

  9. jackson出现错误 Unrecognized field,几种处理方法

    1.请求的JSON里面字段多余映射的实体类,可以通过在类的顶部添加@JsonIgnoreProperties,2.0版本引入 import org.codehaus.jackson.annotate. ...

  10. C. Meme Problem

    链接 [http://codeforces.com/contest/1076/problem/C] 题意 a+b=d and a⋅b=d. 计算出a和b 分析 ab=a(d-a)=d aa-ad+d= ...