C# RSA加解密与验签,AES加解密,以及与JAVA平台的密文加解密
前言:
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平台的密文加解密的更多相关文章
- 支付接口中常用的加密解密以及验签rsa,md5,sha
一.常用加密类型分类 1.对称加密:采用单钥对信息进行加密和解密,即同一个秘钥既可以对信息进行加密,也可以进行解密.此类型称之为对称加密.特点速度快,常用于对大量数据信息或文件加密时使用.常用例子:D ...
- RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密
原文:RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密 C#在using System.Security.Cryptograph ...
- RSA后台签名前台验签的应用(前台采用jsrsasign库)
写在前面 安全测试需要, 为防止后台响应数据返给前台过程中被篡改前台再拿被篡改后的数据进行接下来的操作影响正常业务, 决定采用RSA对响应数据进行签名和验签, 于是有了这篇<RSA后台签名前台验 ...
- js rsa sign使用笔记(加密,解密,签名,验签)
你将会收获: js如何加密, 解密 js如何签名, 验签 js和Java交互如何相互解密, 验签(重点) 通过谷歌, 发现jsrsasign库使用者较多. 查看api发现这个库功能很健全. 本文使用方 ...
- Java RSA 加密 解密 签名 验签
原文:http://gaofulai1988.iteye.com/blog/2262802 import java.io.FileInputStream; import java.io.FileOut ...
- 数据安全管理:RSA加密算法,签名验签流程详解
本文源码:GitHub·点这里 || GitEE·点这里 一.RSA算法简介 1.加密解密 RSA加密是一种非对称加密,在公开密钥加密和电子商业中RSA被广泛使用.可以在不直接传递密钥的情况下,完成加 ...
- IdentityServer4之JWT签名(RSA加密证书)及验签
一.前言 在IdentityServer4中有两种令牌,一个是JWT和Reference Token,在IDS4中默认用的是JWT,那么这两者有什么区别呢? 二.JWT与Reference Token ...
- C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServic
C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider DESCryptoS ...
- RSA加密解密及RSA加签验签
RSA安全性应用场景说明 在刚接触RSA的时候,会混淆RSA加密解密和RSA加签验签的概念.简单来说加密解密是公钥加密私钥解密,持有公钥(多人持有)可以对数据加密,但是只有持有私钥(一人持有)才可以解 ...
随机推荐
- SSIS - 1.简介
一.什么是SSIS? 1)SSIS全称为Microsoft SQL Server Integration Services. 2)ETL全称为Extraction, Transformation an ...
- popwindow+动画
布局: main: <Button android:id="@+id/btn" android:layout_width="match_parent" a ...
- Python学习小纪
1.打包发布*.py文件---"文件路径下打开命令行 d:\python\python.exe setup.py sdist" eg:打包发布f:\C\python\print_l ...
- MTQQ 物联网
这个是学校的SRP项目.去年12月做了大概3周. 直接摘个人总结报告如下: 在本次“学生研究计划”项目,研究课题是“基于JAVA的智能家居公众号”.根据课题要求之一:以微信作为媒介,实现智能设备的远程 ...
- Google Adsense Google判断广告点击作弊的方式和数据 数据分析
Google判断广告点击作弊的几种方式和数据 - 王庆东mas - 博客园 http://www.cnblogs.com/x-poior/p/5581327.html 作弊广告点击的CTR数据太高网上 ...
- [git] git怎样fork一个repo
描述 我定制了一下strongswan的工程.然后想把我自己的定制变成一个repo push到远端git.tong.com与大家分享. 这个时候,应该怎么做? 如果你用过github的话.那么你可以理 ...
- dlib编译成静态库及被其它程序调用
一.git下载:https://github.com/davisking/dlib 官网:http://dlib.net/ 二.vs中编译成静态库 1.在vs2015中创建静态库工程(vs2015以上 ...
- C# .net 语言加密方案
C# .net 语言加密方案 方案背景 当前C# .net语言的应用范围越来越广泛,IIS 的服务器架构后台代码.桌面应用程序的 winform .Unity3d 的逻辑脚本都在使用.C# .net ...
- DS1-14
#include <stdio.h> #define MAXSIZE 10000 int MaxSubseqSum4(int List[], int N); int main() { in ...
- 连接oracle数据库
一.连接oracle数据库 一.windows环境 oracle windows客户端下载地址:http://www.oracle.com/technetwork/topics/winx64soft- ...