关于RSA加密
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
RSA的算法涉及三个参数,n、e1、e2。
其中,n是两个大质数p、q的积,n的二进制表示时所占用的位数,就是所谓的密钥长度。
e1和e2是一对相关的值,e1可以任意取,但要求e1与(p-1)*(q-1)互质;再选择e2,要求(e2*e1)mod((p-1)*(q-1))=1。
(n及e1),(n及e2)就是密钥对。
RSA加解密的算法完全相同,设A为明文,B为密文,则:A=B^e1 mod n;B=A^e2 mod n;
e1和e2可以互换使用,即:
A=B^e2 mod n;B=A^e1 mod n;
using System.Security.Cryptography;
/// <summary>
/// RSA加密
/// </summary>
/// <param name="publickey"></param>
/// <param name="content"></param>
/// <returns></returns>
public static string RSAEncrypt(string publickey, string content)
{
publickey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(publickey);
cipherbytes = rsa.Encrypt(Encoding.UTF8.GetBytes(content), false); return Convert.ToBase64String(cipherbytes);
} /// <summary>
/// RSA解密
/// </summary>
/// <param name="privatekey"></param>
/// <param name="content"></param>
/// <returns></returns>
public static string RSADecrypt(string privatekey, string content)
{
privatekey = @"<RSAKeyValue><Modulus>5m9m14XH3oqLJ8bNGw9e4rGpXpcktv9MSkHSVFVMjHbfv+SJ5v0ubqQxa5YjLN4vc49z7SVju8s0X4gZ6AzZTn06jzWOgyPRV54Q4I0DCYadWW4Ze3e+BOtwgVU1Og3qHKn8vygoj40J6U85Z/PTJu3hN1m75Zr195ju7g9v4Hk=</Modulus><Exponent>AQAB</Exponent><P>/hf2dnK7rNfl3lbqghWcpFdu778hUpIEBixCDL5WiBtpkZdpSw90aERmHJYaW2RGvGRi6zSftLh00KHsPcNUMw==</P><Q>6Cn/jOLrPapDTEp1Fkq+uz++1Do0eeX7HYqi9rY29CqShzCeI7LEYOoSwYuAJ3xA/DuCdQENPSoJ9KFbO4Wsow==</Q><DP>ga1rHIJro8e/yhxjrKYo/nqc5ICQGhrpMNlPkD9n3CjZVPOISkWF7FzUHEzDANeJfkZhcZa21z24aG3rKo5Qnw==</DP><DQ>MNGsCB8rYlMsRZ2ek2pyQwO7h/sZT8y5ilO9wu08Dwnot/7UMiOEQfDWstY3w5XQQHnvC9WFyCfP4h4QBissyw==</DQ><InverseQ>EG02S7SADhH1EVT9DD0Z62Y0uY7gIYvxX/uq+IzKSCwB8M2G7Qv9xgZQaQlLpCaeKbux3Y59hHM+KpamGL19Kg==</InverseQ><D>vmaYHEbPAgOJvaEXQl+t8DQKFT1fudEysTy31LTyXjGu6XiltXXHUuZaa2IPyHgBz0Nd7znwsW/S44iql0Fen1kzKioEL3svANui63O3o5xdDeExVM6zOf1wUUh/oldovPweChyoAdMtUzgvCbJk1sYDJf++Nr0FeNW1RB1XG30=</D></RSAKeyValue>";
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
byte[] cipherbytes;
rsa.FromXmlString(privatekey);
cipherbytes = rsa.Decrypt(Convert.FromBase64String(content), false); return Encoding.UTF8.GetString(cipherbytes);
}
原文来自:
http://www.cnblogs.com/linzheng/archive/2011/02/20/1959123.html
公钥和密钥的生成:
private void but()
{
//使用默认密钥创建RSACryptoServiceProvider对象
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
//显示包含公钥/私钥对的XML表示形式,如果只显示公钥,将参数改为false即可
Write_Txt(rsa.ToXmlString(false)); //这生成了公钥和密钥
//将被加密的字符串转换为字节数组
byte[] dataToEncrypt = Encoding.UTF8.GetBytes("hello");
try
{
//得到加密后的字节数组
byte[] encryptedData = rsa.Encrypt(dataToEncrypt, false);
this.richTextBox1.AppendText(Encoding.UTF8.GetString(encryptedData)+" \n");
//得到解密后的字节数组
rsaDecrypt(encryptedData);
byte[] decryptedData = rsa.Decrypt(encryptedData, false);
this.richTextBox1.AppendText("解密"+Encoding.UTF8.GetString(decryptedData) + " \n");
}
catch (Exception err)
{
MessageBox.Show(err.Message);
}
}
封装了一下,写到一个类中。加密后的内容写到文件里。解密的时候读取:
public class RSCEN
{ /*
* <RSAKeyValue><Modulus>ql+LrSBSyTeRQJN24dR76iRoNi8kRs7wYlwG0FRLuujGkR62HJTD/YM/7miAxCR0lufVGx6E0Ej46OSwIRsqwQo/C2WUnvjlbs/bGiiXkD7IC9lsmzQQEvVjTyrUMVzs7NQMoXwzvIiGGPUzPrPfuXOuPDtbOD/odr3e4pOP6ts=</Modulus><Exponent>AQAB</Exponent><P>3wM9IzYsOEa3eruVG0qjZ5IL4YleDVsCcTma9LT5cQitx4vAKUhYPuljH7ILl669cEWjmt/xGLw6uuOxD3VpYQ==</P><Q>w5MGBeFi3roc+SszgOJpl3QxinxIhcXsCXA/aXYXOtTMqcXCGuV3atSS+YDaP5zt0Nrvedrr6hHaoLfzMZyRuw==</Q><DP>E9eO7f4Y6xznoETmXFpEtadZ5UQ6mQea7QYKEnGzq+nwxEtb2pB0QYy0ZBKMU3+ZnU6k4te/9Mpyk0RE8bIpoQ==</DP><DQ>T4sZtQSRcOMja5hNj0sHBUmF6LxZxsbUFJapw9v64LuyLg63vra7liC1UnM80QijlQGmytnmf8IZOKr4Z6I1hw==</DQ><InverseQ>yfjwKeVxrr8Docp69gaEkoFFY1IwTw+Jpkf/LXIW+s5IZeqbhT7VoO5AXXMvhEGLi1IreNmzqEbhNVw3CudV6Q==</InverseQ><D>SfvBoMV3ja9WoQ8oQbrOsIdsxZLFEwaL9np17wOb+ydYCu6mMFUdornbCkFRIVufUWSM8wDWtcfqZt/f6BBvCL0P2xwBRuNWLP2fY8Yw/puyIlz5p2M3VcUBQcoZ63tX9NkQ3uaqFAlOKW0VrYDjviKPx5NhcR1glkdgYfDahUE=</D></RSAKeyValue>
* */ #region 钥匙 /// <summary>
/// 公钥
/// </summary>
private static string publickey = @"<RSAKeyValue><Modulus>ql+LrSBSyTeRQJN24dR76iRoNi8kRs7wYlwG0FRLuujGkR62HJTD/YM/7miAxCR0lufVGx6E0Ej46OSwIRsqwQo/C2WUnvjlbs/bGiiXkD7IC9lsmzQQEvVjTyrUMVzs7NQMoXwzvIiGGPUzPrPfuXOuPDtbOD/odr3e4pOP6ts=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
/// <summary>
/// 密钥
/// </summary>
private static string privatekey = @"<RSAKeyValue><Modulus>ql+LrSBSyTeRQJN24dR76iRoNi8kRs7wYlwG0FRLuujGkR62HJTD/YM/7miAxCR0lufVGx6E0Ej46OSwIRsqwQo/C2WUnvjlbs/bGiiXkD7IC9lsmzQQEvVjTyrUMVzs7NQMoXwzvIiGGPUzPrPfuXOuPDtbOD/odr3e4pOP6ts=</Modulus><Exponent>AQAB</Exponent><P>3wM9IzYsOEa3eruVG0qjZ5IL4YleDVsCcTma9LT5cQitx4vAKUhYPuljH7ILl669cEWjmt/xGLw6uuOxD3VpYQ==</P><Q>w5MGBeFi3roc+SszgOJpl3QxinxIhcXsCXA/aXYXOtTMqcXCGuV3atSS+YDaP5zt0Nrvedrr6hHaoLfzMZyRuw==</Q><DP>E9eO7f4Y6xznoETmXFpEtadZ5UQ6mQea7QYKEnGzq+nwxEtb2pB0QYy0ZBKMU3+ZnU6k4te/9Mpyk0RE8bIpoQ==</DP><DQ>T4sZtQSRcOMja5hNj0sHBUmF6LxZxsbUFJapw9v64LuyLg63vra7liC1UnM80QijlQGmytnmf8IZOKr4Z6I1hw==</DQ><InverseQ>yfjwKeVxrr8Docp69gaEkoFFY1IwTw+Jpkf/LXIW+s5IZeqbhT7VoO5AXXMvhEGLi1IreNmzqEbhNVw3CudV6Q==</InverseQ><D>SfvBoMV3ja9WoQ8oQbrOsIdsxZLFEwaL9np17wOb+ydYCu6mMFUdornbCkFRIVufUWSM8wDWtcfqZt/f6BBvCL0P2xwBRuNWLP2fY8Yw/puyIlz5p2M3VcUBQcoZ63tX9NkQ3uaqFAlOKW0VrYDjviKPx5NhcR1glkdgYfDahUE=</D></RSAKeyValue>";
#endregion
/// <summary>
/// 加密保存文件
/// </summary>
public static bool RSAEn(string message)
{
try
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(message.Length*+);
//string ddd= rsa.ToXmlString(true);
rsa.FromXmlString(publickey);
byte[] dataToEncrypt = Encoding.UTF8.GetBytes(message);
byte[] encryptedData = rsa.Encrypt(dataToEncrypt,false);
return Write_Txt(encryptedData);
}
catch (Exception err)
{
return false;
}
}
/// <summary>
/// 获取解密后的文件内容
/// </summary>
/// <returns>-1标示解密过程中出现了异常,-2标示物理文件读取失败</returns>
public static string RSADe()
{
try
{
string temp = Read_txt();
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(temp.Length * + );
rsa.FromXmlString(privatekey); switch (temp)
{
case "-2":
return "-2";
default: byte[] encryptedData = rsa.Decrypt(Convert.FromBase64String(temp), false); return Encoding.UTF8.GetString(encryptedData);
}
}
catch (Exception)
{
return "-1";
}
}
#region 写文件
private static string path = System.Environment.CurrentDirectory + "\\type.data";
/// <summary>
/// 写入文件
/// </summary>
/// <param name="bytes"></param>
/// <returns></returns>
static protected bool Write_Txt(byte[] bytes)
{ try
{
File.WriteAllText(path,Convert.ToBase64String(bytes));
return true;
}
catch (Exception ex)
{ return false;
}
}
#endregion
#region 读文件
/// <summary>
/// 读取文件
/// </summary>
/// <returns></returns>
static string Read_txt()
{
try
{
return File.ReadAllText(path, Encoding.UTF8);
}
catch (Exception ex)
{
return "-2";
}
}
#endregion
}
关于RSA加密的更多相关文章
- “不给力啊,老湿!”:RSA加密与破解
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 加密和解密是自古就有技术了.经常看到侦探电影的桥段,勇敢又机智的主角,拿着一长串毫 ...
- .NET 对接JAVA 使用Modulus,Exponent RSA 加密
最近有一个工作是需要把数据用RSA发送给Java 虽然一开始标准公钥 net和Java RSA填充的一些算法不一样 但是后来这个坑也补的差不多了 具体可以参考 http://www.cnblogs. ...
- Android数据加密之Rsa加密
前言: 最近无意中和同事交流数据安全传输的问题,想起自己曾经使用过的Rsa非对称加密算法,闲下来总结一下. 其他几种加密方式: Android数据加密之Rsa加密 Android数据加密之Aes加密 ...
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- RSA加密例子和中途遇到的问题
在进行RSA加密例子 package test; import java.io.IOException; import java.security.Key; import java.security. ...
- iOS中RSA加密详解
先贴出代码的地址,做个说明,因为RSA加密在iOS的代码比较少,网上开源的也很少,最多的才8个星星.使用过程中发现有错误.然后我做了修正,和另一个库进行了整合,然后将其支持CocoaPod. http ...
- iOS动态部署之RSA加密传输Patch补丁
概要:这一篇博客主要说明下iOS客户端动态部署方案中,patch(补丁)是如何比较安全的加载到客户端中. 在整个过程中,需要使用RSA来加密(你可以选择其它的非对称加密算法),MD5来做校验(同样,你 ...
- Java使用RSA加密解密及签名校验
该工具类中用到了BASE64,需要借助第三方类库:javabase64-1.3.1.jar注意:RSA加密明文最大长度117字节,解密要求密文最大长度为128字节,所以在加密和解密的过程中需要分块进行 ...
- 基于OpenSLL的RSA加密应用(非算法)
基于OpenSLL的RSA加密应用(非算法) iOS开发中的小伙伴应该是经常用der和p12进行加密解密,而且在通常加密不止一种加密算法,还可以加点儿盐吧~本文章主要阐述的是在iOS中基于openSL ...
- 通过ios实现RSA加密和解密
在加密和解密中,我们需要了解的知识有什么事openssl:RSA加密算法的基本原理:如何通过openssl生成最后我们需要的der和p12文件. 废话不多说,直接写步骤: 第一步:openssl来生成 ...
随机推荐
- HDU 3030 - Increasing Speed Limits
Problem Description You were driving along a highway when you got caught by the road police for spee ...
- 出现No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here异常
问题描述: public void save(BaseEntity baseEntity) { Session session = null; try { session = currentSessi ...
- js常用DOM操作
在博客园看到了苏夏写的常用DOM整理文章,地址:http://www.cnblogs.com/cabbagen/p/4579412.html,然后抽时间都试了一下这些常用的DOM操作.在这里记录一下. ...
- Android项目记录点滴2
1.把本机地址广播出去private void sendIP() { try { DatagramSocket dgSocket = new DatagramSocket(8989); byte[] ...
- python计算md5值
from hashlib import md5 m = md5(') print m.hexdigest()
- java改变图片文件尺寸
package test.common; import java.awt.Graphics; import java.awt.Image; import java.awt.image.Buffered ...
- UML--用例图
一.UML概述 1.UML的作用:a 把复杂的问题分解 b 实现了可视化 UML是由Rational公司创建的 2.UML是什么:是一种语言,有属于自己的标准表达规则,是一种分析设计语言, ...
- xml 解析 Xstream
1.概述 json 解析可以使用gson包解为现成的对象,那么xml可以不可以用现成的包解析成java的对象呢? 带着这个问题,查询了一些材料找到了Xstream解析方法,确实可以完成这种思考,只是实 ...
- javascript 汉字拼音排序
定义和用法 用本地特定的顺序来比较两个字符串. 语法 stringObject.localeCompare(target) 参数 描述 target 要以本地特定的顺序与 stringObject 进 ...
- #include <process.h>
1 _beginthread 单进程,单线程,必须干完一件事情后干另一件事情 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #incl ...