前言:

RSA算法是利用公钥与密钥对数据进行加密验证的一种算法。一般是拿私钥对数据进行签名,公钥发给友商,将数据及签名一同发给友商,友商利用公钥对签名进行验证。也可以使用公钥对数据加密,然后用私钥对数据进行解密。

.Net平台生成的RSA公私钥是xml格式的,java平台下一般是使用der或者pem格式的公私钥,pem格式就是比der格式多了-----BEGIN PUBLIC KEY-----开头及结尾。

.Net平台要使用der/pem公私钥要先转换成xml格式,这需要用到 BouncyCastle.Crypto 这个开源dll,网上已经很多例子。也可以用该dll将.Net生成的公私钥转换成Java平台使用的公私钥。

AES加解密的数据也能在.Net平台和Java平台下互相加解密。

以下.net代码加密的数据皆能在java环境中验证或解密,反之亦然。

---------------------------------------------------------------------------------------------------

     /// <summary>
/// Xml转换成Der,传入公钥文件格式
/// </summary>
/// <param name="publickey"></param>
/// <returns></returns>
private byte[] RSAPublicKeytoJava(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); SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);
byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
return serializedPublicBytes;
}
     /// <summary>
/// Xml转换成Der,传入私钥文件格式
/// </summary>
/// <param name="privateKey"></param>
/// <returns></returns>
private byte[] RSAPrivateKeytoJava(string privateKey)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(privateKey);
BigInteger m = new BigInteger(, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[].InnerText));
BigInteger exp = new BigInteger(, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[].InnerText));
BigInteger d = new BigInteger(, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[].InnerText));
BigInteger p = new BigInteger(, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[].InnerText));
BigInteger q = new BigInteger(, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[].InnerText));
BigInteger dp = new BigInteger(, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[].InnerText));
BigInteger dq = new BigInteger(, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[].InnerText));
BigInteger qinv = new BigInteger(, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[].InnerText)); RsaPrivateCrtKeyParameters privateParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv); var publicKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateParam);
byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
return serializedPublicBytes;
}
     /// <summary>
/// rsa公钥加密
/// </summary>
/// <param name="privateKeyfile"></param>
/// <param name="text"></param>
/// <returns></returns>
private string RsaEncry(string privateKeyfile, string text)
{
var pubKey = File.ReadAllText(this.pubPath); var rsa = new RSACryptoServiceProvider(rsaSize);
rsa.FromXmlString(pubKey); var bytesToEncrypt = Encoding.Unicode.GetBytes(text);
var encrypt = rsa.Encrypt(bytesToEncrypt, false);
return Convert.ToBase64String(encrypt);
}
    /// <summary>
/// RSA私钥解密
/// </summary>
/// <param name="privateKey">私钥文件</param>
/// <param name="text">待解密字符串</param>
/// <returns></returns>
private string RsaDecry(string privateKey,string text)
{
var provider = new RSACryptoServiceProvider(this.rsaSize);
provider.FromXmlString(privateKey);
var bytesEncrypted = Convert.FromBase64String(text);
var bytesPlainText = provider.Decrypt(bytesEncrypted, false);
return Encoding.Unicode.GetString(bytesPlainText);
}
    /// <summary>
/// RSA签名
/// </summary>
/// <param name="text">待加密文本</param>
/// <param name="privateKey">私钥</param>
/// <returns></returns>
private string RsaSign(string text, string privateKey)
{
var bytesToEncrypt = Encoding.UTF8.GetBytes(text);
var rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(privateKey);
var sha = SHA256.Create();
var encrypt = rsa.SignData(bytesToEncrypt, sha);
return Convert.ToBase64String(encrypt);
}
  /// <summary>
/// rsa验证签名
/// </summary>
/// <param name="txt">明文</param>
/// <param name="sign">签名串</param>
/// <param name="pubKey">公钥</param>
/// <returns></returns>
private bool RsaVerifyData(string txt, string sign, string pubKey)
{
var soures = Encoding.UTF8.GetBytes(txt);
var bytes = Convert.FromBase64String(sign); var rsa = new RSACryptoServiceProvider(rsaSize);
rsa.FromXmlString(pubKey);
SHA256 sha = SHA256.Create(); return rsa.VerifyData(soures, sha, bytes);
}
 /// <summary>
/// AES加密
/// </summary>
/// <param name="text">加密字符串</param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
private string AESEncry(string text, string key, string iv)
{
var bytes = Encoding.UTF8.GetBytes(text);
var keyBytes = new byte[];
var pwkBytes = Encoding.UTF8.GetBytes(key);
//注意这段代码,很重要,没有则java验证不通过
var len = pwkBytes.Length;
if (len > keyBytes.Length)
len = keyBytes.Length; Array.Copy(pwkBytes, keyBytes, len);
var rm = new RijndaelManaged
{
Key = keyBytes,
Mode = CipherMode.CBC,
IV = Encoding.UTF8.GetBytes(iv),
Padding = PaddingMode.PKCS7,
};
var tramsform = rm.CreateEncryptor();
var rst = tramsform.TransformFinalBlock(bytes, , bytes.Length);
return Convert.ToBase64String(rst);
}
        /// <summary>
/// AES解密
/// </summary>
/// <param name="text">解密字符串</param>
/// <param name="key"></param>
/// <param name="iv"></param>
/// <returns></returns>
private string AesDecry(string text, string key, string iv)
{
var bytes = Convert.FromBase64String(text); var keyBytes = new byte[];
var pwkBytes = Encoding.UTF8.GetBytes(key);
var len = pwkBytes.Length;
if (len > keyBytes.Length)
len = keyBytes.Length;
Array.Copy(pwkBytes, keyBytes, len); var rm = new RijndaelManaged()
{
Key = keyBytes,
Mode = CipherMode.CBC,
IV = Encoding.UTF8.GetBytes(iv),
Padding = PaddingMode.PKCS7
};
var transform = rm.CreateDecryptor();
var rst = transform.TransformFinalBlock(bytes, , bytes.Length);
return Encoding.UTF8.GetString(rst);
}

这有一篇数字证书的原理文章写得比较清楚:数字证书原理(ssl,https)

C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密的更多相关文章

  1. 支付接口中常用的加密解密以及验签rsa,md5,sha

    一.常用加密类型分类 1.对称加密:采用单钥对信息进行加密和解密,即同一个秘钥既可以对信息进行加密,也可以进行解密.此类型称之为对称加密.特点速度快,常用于对大量数据信息或文件加密时使用.常用例子:D ...

  2. RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密

    原文:RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 C#在using System.Security.Cryptograph ...

  3. RSA后台签名前台验签的应用(前台采用jsrsasign库)

    写在前面 安全测试需要, 为防止后台响应数据返给前台过程中被篡改前台再拿被篡改后的数据进行接下来的操作影响正常业务, 决定采用RSA对响应数据进行签名和验签, 于是有了这篇<RSA后台签名前台验 ...

  4. js rsa sign使用笔记(加密,解密,签名,验签)

    你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...

  5. Java RSA 加密 解密 签名 验签

    原文:http://gaofulai1988.iteye.com/blog/2262802 import java.io.FileInputStream; import java.io.FileOut ...

  6. 数据安全管理:RSA加密算法,签名验签流程详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.RSA算法简介 1.加密解密 RSA加密是一种非对称加密,在公开密钥加密和电子商业中RSA被广泛使用.可以在不直接传递密钥的情况下,完成加 ...

  7. IdentityServer4之JWT签名(RSA加密证书)及验签

    一.前言 在IdentityServer4中有两种令牌,一个是JWT和Reference Token,在IDS4中默认用的是JWT,那么这两者有什么区别呢? 二.JWT与Reference Token ...

  8. C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic

    C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider DESCryptoS ...

  9. RSA加密解密及RSA加签验签

    RSA安全性应用场景说明 在刚接触RSA的时候,会混淆RSA加密解密和RSA加签验签的概念.简单来说加密解密是公钥加密私钥解密,持有公钥(多人持有)可以对数据加密,但是只有持有私钥(一人持有)才可以解 ...

随机推荐

  1. nregistering JMX-exposed beans

    https://blog.csdn.net/yang474231561/article/details/81738632 https://stackoverflow.com/questions/507 ...

  2. LeetCode 34 - 在排序数组中查找元素的第一个和最后一个位置 - [二分][lower_bound和upper_bound]

    给定一个按照升序排列的整数数组 nums,和一个目标值 target.找出给定目标值在数组中的开始位置和结束位置. 你的算法时间复杂度必须是 O(log n) 级别. 如果数组中不存在目标值,返回 [ ...

  3. SAP中的一些简称及简要介绍

    SAP-(System Applications and Products) 基础部分: R/3系统内核.数据库.支持各类平台的接口.ABAP(Advanced Business Applicatio ...

  4. TCP断开那些事

    继上一篇后,我们再来看一下四次挥手的过程 这里其实没有必要过多阐述,一张图胜过千言万语. 与三次握手一样,四次挥手的过程中也有许多扩展问题. 当然问的最多的还是:为什么要四次握手?为什么要等待2MSL ...

  5. webapi 利用webapiHelp和swagger生成接口文档

    webapi 利用webapiHelp和swagger生成接口文档.均依赖xml(需允许项目生成注释xml) webapiHelp:微软技术自带,仅含有模块.方法.请求-相应参数的注释. swagge ...

  6. FSPageContentView这个库需要修改源码才能用,否则有黑屏bug

    去掉 - (instancetype)initWithFrame:(CGRect)frame childVCs:(NSArray *)childVCs parentVC:(UIViewControll ...

  7. AIROBOT系统 之 私人存储 和 DLNA 智能电视云

    需求背景 工作多年之后发现有太多的电子资料到处存放.个人电脑是Mac,硬盘都不大,放不了太多东西.并且有时候想随时随地存放一些东西.所有就有了大家一个私有存储的需求 个人休息在家经常喜欢看电影电视剧, ...

  8. scrapy爬虫框架和selenium的配合使用

    scrapy框架的请求流程 scrapy框架? Scrapy 是基于twisted框架开发而来,twisted是一个流行的事件驱动的python网络框架.因此Scrapy使用了一种非阻塞(又名异步)的 ...

  9. P1368 工艺 SA/最小表示法

    正解:SA/最小表示法 解题报告: 传送门! 听说正解是最小表示法,,,O(n)然后常数还挺小的,,, 但是我不会QAQ! 所以先写下SA的做法趴,,,等get了最小表示法再来写正解QAQ 就这种题算 ...

  10. CF653F Paper task

    题目链接:洛谷 首先我们不考虑本质不同这个限制. 既然不能直接用栈乱搞,我们就可以用一个前缀和的套路了. 我们将(设为1,将)设为-1,记前缀和为$s_i$,则$[i,j]$这一段是回文子串当且仅当 ...