前言:

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. iview select filterable属性使用下拉小bug

    今天做项目时候在iview 原生自带的select中设置filterable,下拉时候可进行查询,但是发现选中载打开模态框每次都绑定上一次的值,解决方案就是在关闭弹框时候将this.$refs.sto ...

  2. VUE错误码Attribute ':sizeOpts' must be hyphenated

    Attribute ':sizeOpts' must be hyphenated 因为属性有大写,需要添加 - 来取代 例如 tampData  换成 tamp-data 就可以了

  3. 一、大体认识jspxcms

    声明:jspxcms的license写明,允许将jspxcms用于商业和非商业用途.此处只是作为研究.分享使用心德,并不涉及商用. 使用版本:jspxcms  9.5.0 一.下载源码,并部署到ecl ...

  4. js点击复制剪贴板

    代码用原生写的.工作中用的angular,所以如果有用angular的话,请把js代码copyToClipboard函数中的document.getElementById(elementId).inn ...

  5. Centos 安装Java jdk

    1/ yum search java|grep jdk 2/ yum install java-......... 3/ vi /etc/profile 在最后添上: 4/ source /etc/p ...

  6. Elasticsearch学习笔记(七)document小结

    一.生成document id 1.自动生成document id                 自动生成的id,长度为20个字符,URL安全,base64编码,GUID,分布式系统并行生成时不可能 ...

  7. mysql本地安装

    1.下载地址: https://downloads.mysql.com/archives/community/ 2.安装: 解压目录:D:\mysql\mysql-5.6.36-winx64 2.1. ...

  8. CST2017 安装问题

    1.需要修改破解文件license 中的电脑名称 2.若lincense 中有时间限制  需要把时间都修改   比如  到期为  1-jan-2018   则修改为1-jan-2019   所有的都需 ...

  9. Github 入门(“趣考网络”学习第一步)

    目录 为什么要使用GitHub 下载Github Desktop fork 与 pull request git pull,fetch,merge,push的区别与联系 git clone 与 dow ...

  10. 【转】Spring Boot 构建应用——快速构建 Spring Boot 应用

    Spring Boot 简化了 Spring 应用开发,不需要配置就能运行 Spring 应用,Spring Boot 的自动配置是通过 Spring 4.x 的条件注解 @Conditional 来 ...