C# RSA 非对称加密
代码:
RSAHelper.cs(RSA加密工具类):

using System;
using System.Security.Cryptography;
using System.Text; namespace Utils
{
/// <summary>
/// RSA加密工具类
/// </summary>
public class RSAHelper
{
/// <summary>
/// RSA加密
/// </summary>
public static string RSAEncrypt_LongContent(string publicKey, string content)
{
byte[] bytes = Encoding.UTF8.GetBytes(content); int pageSize = 117;
int pageCount = (bytes.Length - 1) / pageSize + 1; StringBuilder result = new StringBuilder();
for (int page = 1; page <= pageCount; page++)
{
int start = pageSize * (page - 1); byte[] subBytes = page == pageCount ? new byte[bytes.Length - start] : new byte[pageSize]; Array.Copy(bytes, start, subBytes, 0, subBytes.Length); string strEncrypted = RSAEncrypt(publicKey, Encoding.UTF8.GetString(subBytes));
result.Append(strEncrypted);
} return result.ToString();
} /// <summary>
/// RSA解密
/// </summary>
public static string RSADecrypt_LongContent(string privateKey, string content)
{
int pageSize = 172;
int pageCount = (content.Length - 1) / pageSize + 1; StringBuilder result = new StringBuilder();
for (int page = 1; page <= pageCount; page++)
{
int start = pageSize * (page - 1); string subContent = null;
if (page != pageCount)
{
subContent = content.Substring(start, pageSize);
}
else
{
subContent = content.Substring(start, content.Length - start);
} string strEncrypted = RSADecrypt(privateKey, subContent);
result.Append(strEncrypted);
} return result.ToString();
} /// <summary>
/// RSA加密
/// </summary>
public static string RSAEncrypt(string publicKey, string content)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(publicKey);
byte[] cipherBytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); return Convert.ToBase64String(cipherBytes);
} /// <summary>
/// RSA解密
/// </summary>
public static string RSADecrypt(string privateKey, string content)
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(privateKey);
byte[] cipherBytes = rsa.Decrypt(Convert.FromBase64String(content), false); return Encoding.UTF8.GetString(cipherBytes);
} /// <summary>
/// 创建公钥私钥
/// </summary>
public static RSAKey CreateKey()
{
RSAKey rsaKey = new RSAKey(); using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsaKey.PublicKey_NET = rsa.ToXmlString(false); // 公钥
rsaKey.PrivateKey_NET = rsa.ToXmlString(true); // 私钥 rsaKey.PublicKey_Java = RSAKeyConvert.RSAPublicKeyDotNet2Java(rsaKey.PublicKey_NET);
rsaKey.PrivateKey_Java = RSAKeyConvert.RSAPrivateKeyDotNet2Java(rsaKey.PrivateKey_NET);
} return rsaKey;
}
} public class RSAKey
{
public string PublicKey_NET { get; set; } public string PrivateKey_NET { get; set; } public string PublicKey_Java { get; set; } public string PrivateKey_Java { get; set; }
}
}
RSAKeyConvert.cs(Java .NET RSA密钥格式转换)(需要安装NuGet包BouncyCastle):

using System;
using System.Xml;
using Org.BouncyCastle.Asn1.Pkcs;
using Org.BouncyCastle.Asn1.X509;
using Org.BouncyCastle.Crypto.Parameters;
using Org.BouncyCastle.Math;
using Org.BouncyCastle.Pkcs;
using Org.BouncyCastle.Security;
using Org.BouncyCastle.X509; namespace Utils
{
/// <summary>
/// RSA密钥格式转换
/// </summary>
public class RSAKeyConvert
{
/// <summary>
/// RSA私钥格式转换,java->.net
/// </summary>
/// <param name="privateKey">java生成的RSA私钥</param>
public static string RSAPrivateKeyJava2DotNet(string privateKey)
{
RsaPrivateCrtKeyParameters privateKeyParam = (RsaPrivateCrtKeyParameters)PrivateKeyFactory.CreateKey(Convert.FromBase64String(privateKey)); return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent><P>{2}</P><Q>{3}</Q><DP>{4}</DP><DQ>{5}</DQ><InverseQ>{6}</InverseQ><D>{7}</D></RSAKeyValue>",
Convert.ToBase64String(privateKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.PublicExponent.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.P.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Q.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DP.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.DQ.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.QInv.ToByteArrayUnsigned()),
Convert.ToBase64String(privateKeyParam.Exponent.ToByteArrayUnsigned()));
} /// <summary>
/// RSA私钥格式转换,.net->java
/// </summary>
/// <param name="privateKey">.net生成的私钥</param>
public static string RSAPrivateKeyDotNet2Java(string privateKey)
{
XmlDocument doc = new XmlDocument();
doc.LoadXml(privateKey);
BigInteger m = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Modulus")[0].InnerText));
BigInteger exp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Exponent")[0].InnerText));
BigInteger d = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("D")[0].InnerText));
BigInteger p = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("P")[0].InnerText));
BigInteger q = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("Q")[0].InnerText));
BigInteger dp = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DP")[0].InnerText));
BigInteger dq = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("DQ")[0].InnerText));
BigInteger qinv = new BigInteger(1, Convert.FromBase64String(doc.DocumentElement.GetElementsByTagName("InverseQ")[0].InnerText)); RsaPrivateCrtKeyParameters privateKeyParam = new RsaPrivateCrtKeyParameters(m, exp, d, p, q, dp, dq, qinv); PrivateKeyInfo privateKeyInfo = PrivateKeyInfoFactory.CreatePrivateKeyInfo(privateKeyParam);
byte[] serializedPrivateBytes = privateKeyInfo.ToAsn1Object().GetEncoded();
return Convert.ToBase64String(serializedPrivateBytes);
} /// <summary>
/// RSA公钥格式转换,java->.net
/// </summary>
/// <param name="publicKey">java生成的公钥</param>
public static string RSAPublicKeyJava2DotNet(string publicKey)
{
RsaKeyParameters publicKeyParam = (RsaKeyParameters)PublicKeyFactory.CreateKey(Convert.FromBase64String(publicKey));
return string.Format("<RSAKeyValue><Modulus>{0}</Modulus><Exponent>{1}</Exponent></RSAKeyValue>",
Convert.ToBase64String(publicKeyParam.Modulus.ToByteArrayUnsigned()),
Convert.ToBase64String(publicKeyParam.Exponent.ToByteArrayUnsigned()));
} /// <summary>
/// RSA公钥格式转换,.net->java
/// </summary>
/// <param name="publicKey">.net生成的公钥</param>
public static string RSAPublicKeyDotNet2Java(string publicKey)
{
XmlDocument doc = new XmlDocument();
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); SubjectPublicKeyInfo publicKeyInfo = SubjectPublicKeyInfoFactory.CreateSubjectPublicKeyInfo(pub);
byte[] serializedPublicBytes = publicKeyInfo.ToAsn1Object().GetDerEncoded();
return Convert.ToBase64String(serializedPublicBytes);
}
}
}
C# RSA 非对称加密的更多相关文章
- Atitit RSA非对称加密原理与解决方案
		
Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制 3 1.4. 基于rsa的授权验证机器码 4 1.5. ...
 - CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互
		
(以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 voi ...
 - RSA非对称加密Java实现
		
原文 加密基础方法类 import java.security.MessageDigest; import sun.misc.BASE64Decoder; import sun.misc.BASE64 ...
 - 前端js,后台python实现RSA非对称加密
		
先熟悉使用 在后台使用RSA实现秘钥生产,加密,解密; # -*- encoding:utf-8 -*- import base64 from Crypto import Random from Cr ...
 - 前后端数据加密传输 RSA非对称加密
		
任务需求:要求登陆时将密码加密之后再进行传输到后端. 经过半天查询摸索折腾,于是有了如下成果: 加密方式:RSA非对称加密.实现方式:公钥加密,私钥解密.研究进度:javascript与java端皆已 ...
 - php  RSA非对称加密 的实现
		
基本概念 加密的意义 加密的意义在于数据的传输过程中,即使被第三方获取到传输的数据,第三方也不能获取到数据的具体含义. 加密方式分为对称加密和非对称加密 什么是对称加密? 对称加密只使用一个秘钥,加密 ...
 - ssh rsa 非对称加密 基本原理
		
我们常用的ssh 免密登陆是用了 非对称加密的rsa算法(最为常用),与对称加密的相比会慢一些,但是更安全.秘钥长度超过768位无法破解. 默认长度是2048位(无法破解,非常安全) ssh-keyg ...
 - RSA 非对称加密,私钥转码为pkcs8 错误总结
		
RSA 非对称加密,私钥转码为pkcs8 错误总结 最近在和某上市公司对接金融方面的业务时,关于RSA对接过程中遇到了一个坑,特来分享下解决方案. 该上市公司简称为A公司,我们简称为B公司.A-B两家 ...
 - JSON 接口如何实现 RSA 非对称加密与签名
		
代码地址如下:http://www.demodashi.com/demo/14000.html 一.概述 1. 数字签名的作用:保证数据完整性,机密性和发送方角色的不可抵赖性,加密与签字结合时,两套公 ...
 - javascript版前端页面RSA非对称加密解密
		
最近由于项目需要做一个url传参,并在页面显示参数内容的需求,这样就会遇到一个url地址可能会被假冒, 并传递非法内容显示在页面的尴尬情况 比如xxx.shtml?server=xxx是坏人& ...
 
随机推荐
- Flask SocketIO 实现动态绘图
			
Flask-SocketIO 是基于 Flask 的一个扩展,用于简化在 Flask 应用中集成 WebSocket 功能.WebSocket 是一种在客户端和服务器之间实现实时双向通信的协议,常用于 ...
 - python01-基础概念与环境搭建
			
学习目标 了解硬件 & 操作系统 & 软件(应用系统)之间的关系. 了解常见的操作系统都有哪些. 了解编译器和解释器的区别和作用. 了解编程语言进行分类 了解Python解释器的种类 ...
 - C#中的并行处理、并行查询的方法你用对了吗?
			
Parallel.ForEach Parallel.ForEach 是一个用于在集合上并行执行迭代操作的强大工具.它通过有效地利用多核处理器的能力来提高性能.Parallel.ForEach 不仅能够 ...
 - 使用Slurm集群进行分布式图计算:对Github网络影响力的系统分析
			
本文分享自华为云社区<基于Slurm集群的分布式图计算应用实践:Github协作网络影响力分析>,作者:yd_263841138 . 1. 引言 Slurm(Simple Linux Ut ...
 - [ABC280F] Pay or Receive
			
Problem Statement There are $N$ towns numbered $1,\ldots,N$ and $M$ roads numbered $1,\ldots,M$. Roa ...
 - Mongodb数据增删改查
			
RDB:数据库 → 表(列) → 行 Mongo:数据库 → 集合 → 文档 SQL和Mongodb的关系映射表(里面还有一些增删改查等等操作与SQL的对应的语句): https://www.mong ...
 - 复现YOLO5所遇到的问题
			
一. 解决方案: 由于没有影响模型继续运行,理解为简单的warning.根据查询问题,推断是由于 pytorch和torchvision的版本原因导致的. 二. 解决方案: 由于没有影响模型继续运行, ...
 - 使用 PostgreSQL 实现 PageRank
			
PageRank 算法  作为 Google 最早的一个网页排名算法,该算法在早期的搜索引擎中是搜索结果最为准确的,同时也是 Google 发家的一个重要算法.尽管这些年来该算法不再是 Google ...
 - Reactor 简介
			
官方的介绍如下: Reactor is a fully non-blocking reactive programming foundation for the JVM, with efficient ...
 - Head First 的学习之道
			
<Head First 设计模式>是一本好书,正如书的封面上说的那样,这是一本重视大脑的学习指南.里面提到了一些学习方法,可以尝试下,看看哪些对你有用: 1. 慢一点,理解的越多,需要记得 ...