关于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来生成 ...
随机推荐
- Android Service 系统服务
android sdk 提供很多公用的服务,也就是系统服务,开发者可以通过Activity类的getSystemService方法获取指定的服务.系统服务包含音频服务.视频服务窗口服务等.本篇主要讲T ...
- hbase namespace问题
如果遇到进入shell之后HMaster自动挂掉的问题,并且master的log里出现“TableExistsException: hbase:namespace”字样,很可能是更换了Hbase的版本 ...
- 10个简单步骤,完全理解SQL
此文章为转载 1. SQL 是一种声明式语言 首先要把这个概念记在脑中:“声明”. SQL 语言是为计算机声明了一个你想从原始数据中获得什么样的结果的一个范例,而不是告诉计算机如何能够得到结果.这是不 ...
- 【笔记】让DIV水平垂直居中的两种方法
今天写的了百度前端学院春季班的任务:定位和居中问题 由于距离上次学习CSS有点久远了,加上以前木有记笔记的习惯,方法忘得只剩下一种,今天通过网上查阅资料总结了以下两种简单的方法让DIV水平垂直居中. ...
- Spring-----3、Spring的核心机制(依赖注入)
转载自:http://blog.csdn.net/hekewangzi/article/details/41345237
- Django后台管理界面
之前的几篇记录了模板视图.模型等页面展示的相关内容,这篇主要写一下后台admin管理界面的内容. 激活管理界面 Django管理站点完全是可选择的,之前我们是把这些功能给屏蔽掉了.记得上篇中Djang ...
- Looper、Hander、HandlerThread
一.Message .Looper.Handler之间的关系 1.系统发送的Message消息传送给Handler,Handler将Message放入自己的looper队列的底部 然后再从Loop ...
- modbus rtu 协议转DLT645-2007和DLT645-1997电表协议转换器定制,
现场会碰到现场数据为Modbus协议,但是后台系统为DLT645协议系统,本模块支持将工业ModbusRtu协议转换为电表国标协议DLT645协议,支持1997和2007俩种标准,只需要进行简单的配置 ...
- WF编译报错
最近在研究WF的时候,遇到了一个未知的错误,错误信息时这样的 错误 102 扩展“Microsoft.Activities.Build.Validation.ValidationBuildExtens ...
- 【找规律】CodeForce #258 Problem A——Game With Sticks
来源:点击打开链接 非常easy.找规律. 每去掉一个点,点的总数量就减去n+m-1,然后看谁最先减到没有点可减.就能够了. #include <iostream> #include &l ...