加解密算法二:非对称加解密及RSA算法的实现
加密和解密使用不同的密钥的一类加密算法。这类加密算法通常有两个密钥A和B,使用密钥A加密数据得到的密文,只有密钥B可以进行解密操作(即使密钥A也无法解密);
相反,使用密钥B加密数据得到的密文,只有密钥A可以解密。这两个密钥分别称为私钥和公钥。私钥就是你个人保留,不能公开的密钥,而公钥则是公开给加解密操作的另一方的。
根据不同用途,对数据进行加密所使用的密钥也不相同(有时用公钥加密,私钥解密;有时相反用私钥加密,公钥解密)。非对称加密的代表算法是RSA算法。
RSA算法是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。它的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题,至今没有有效的方法予以解决,因此可以确保RSA算法的安全性。
公钥和私钥的产生:
public static void CreatePublicAndPrivateKey(out string publicKey, out string privateKey)
{
//声明一个RSA算法的实例,由RSACryptoServiceProvider类型的构造函数指定了密钥长度为1024位
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(); //实例化RSACryptoServiceProvider后,RSACryptoServiceProvider会自动生成密钥信息
publicKey = rsaProvider.ToXmlString(false);
privateKey = rsaProvider.ToXmlString(true);
}
公钥加密,私钥解密:
public static string RSAEncryptWithPublicKey(string source, string publicKey)
{
if (string.IsNullOrEmpty(source) || string.IsNullOrEmpty(publicKey)) { return ""; }
else
{
try
{
byte[] data = Encoding.Default.GetBytes(source);
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(); //将公钥导入到RSA对象中,准备加密
rsaProvider.FromXmlString(publicKey); int keySize = rsaProvider.KeySize / ;
int bufferSize = keySize - ;
byte[] buffer = new byte[bufferSize];
MemoryStream msInput = new MemoryStream(data);
MemoryStream msOuput = new MemoryStream();
int readLen = msInput.Read(buffer, , bufferSize);
while (readLen > )
{
byte[] dataToEnc = new byte[readLen];
Array.Copy(buffer, , dataToEnc, , readLen);
byte[] encData = rsaProvider.Encrypt(dataToEnc, false);//加密
msOuput.Write(encData, , encData.Length);
readLen = msInput.Read(buffer, , bufferSize);
} msInput.Close();
byte[] result = msOuput.ToArray();//得到加密结果
msOuput.Close();
rsaProvider.Clear();
return Convert.ToBase64String(result);
}
catch (Exception ex)
{
return ex.Message;
}
}
} public static string RSADecryptWithPrivateKey(string source, string privateKey)
{
if (string.IsNullOrEmpty(source) || string.IsNullOrEmpty(privateKey)) { return ""; }
else
{
try
{
byte[] data = Convert.FromBase64String(source);
//byte[] data = Encoding.Default.GetBytes(source);
RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(); //将私钥导入RSA中,准备解密
rsaProvider.FromXmlString(privateKey); int keySize = rsaProvider.KeySize / ;
byte[] buffer = new byte[keySize];
MemoryStream msInput = new MemoryStream(data);
MemoryStream msOuput = new MemoryStream();
int readLen = msInput.Read(buffer, , keySize);
while (readLen > )
{
byte[] dataToDec = new byte[readLen];
Array.Copy(buffer, , dataToDec, , readLen);
byte[] decData = rsaProvider.Decrypt(dataToDec, false);//解密
msOuput.Write(decData, , decData.Length);
readLen = msInput.Read(buffer, , keySize);
}
msInput.Close();
byte[] result = msOuput.ToArray();//得到解密结果
msOuput.Close();
rsaProvider.Clear();
return Encoding.Default.GetString(result);
}
catch (Exception ex)
{
return ex.Message;
}
}
}
加解密算法二:非对称加解密及RSA算法的实现的更多相关文章
- 使用java实现对称加密解密(AES),非对称加密解密(RSA)
对称加密:双方采用同样的秘钥进行加密和解密.特点是速度快,但是安全性没有非对称加密高 非对称加密:接收方生成的公有秘钥公布给发送方,发送方使用该公有秘钥加密之后,发送给接收方,然后接收方使用私有秘钥解 ...
- KMP算法中next数组的理解与算法的实现(java语言)
KMP 算法我们有写好的函数帮我们计算 Next 数组的值和 Nextval 数组的值,但是如果是考试,那就只能自己来手算这两个数组了,这里分享一下我的计算方法吧. 计算前缀 Next[i] 的值: ...
- Prim算法:最小生成树---贪心算法的实现
算法图解: http://baike.baidu.com/link?url=hGNkWIOLRJ_LDWMJRECxCPKUw7pI3s8AH5kj-944RwgeBSa9hGpTaIz5aWYsl_ ...
- C#加解密算法
先附上源码 加密解密算法目前已经应用到我们生活中的各个方面 加密用于达到以下目的: 保密性:帮助保护用户的标识或数据不被读取. 数据完整性:帮助保护数据不被更改. 身份验证:确保数据发自特定的一方. ...
- AES加解密算法Qt实现
[声明] (1) 本文源码 在一位未署名网友源码基础上,利用Qt编程,实现了AES加解密算法,并添加了文件加解密功能.在此表示感谢!该源码仅供学习交流,请勿用于商业目的. (2) 图片及描述 除图1外 ...
- RSA,AES加解密算法的实现
目录 Python实现RSA公钥加密算法 RSA公钥加密算法原理 RSA算法的Python实现 AES加解密算法实现 AES加解密算法原理 AES加解密算法Python实现 参考文献 Python实现 ...
- JAVA常用加密解密算法Encryption and decryption
加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...
- .NET中常见加解密算法
一.MD5不可逆加密 不可逆加密是指将原文加密成密文以后,无法将密文解密成原文. MD5的算法是公开的,无论是哪种语言,只要需要加密的字符串是相同的,那么经过MD5加密以后生成的结果都是一样的. .N ...
- C# 中使用 RSA加解密算法
一.什么是RSA RSA公开密钥密码体制.所谓的公开密钥密码体制就是使用不同的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制. 在公开密钥密码体制中,加密密钥(即 ...
随机推荐
- 深入浅出ECharts系列 (二) 折线图
深入浅出ECharts系列(二) 目标 本次教程的目标是实现“折线图堆叠”折线,实现结果如图: 2. 准备工作 a) 首先下载ECharts插件,你可以根据自己的实际需求选择你想要下载 ...
- Js 替代
替代全部:.replace(/#/g,"/") 替代第一个:.replace("#","/") var regS = new RegE ...
- [转]ODBC连接ORACLE数据库的设置
本文转自:http://www.cppblog.com/edog/articles/1420.html 首先安装Oracle,以Oracle 817为例,作为ODBC开发者的客户端,才能使用Oracl ...
- centos vim 中文乱码解决方案
1.安装中文包:yum -y groupinstall chinese-support 2.修改字符编码配置文件 vi /etc/sysconfig/i18n LANGUAGE="zh_ ...
- git 配置用户名和邮箱
在安装了git for windows之后,个人总是忘记配置git config的命令,以此记录一下: 配置用户名和邮箱的命令 git config --global user.name " ...
- Hadoop源代码分析
http://wenku.baidu.com/link?url=R-QoZXhc918qoO0BX6eXI9_uPU75whF62vFFUBIR-7c5XAYUVxDRX5Rs6QZR9hrBnUdM ...
- mvn常见命令
http://www.cnblogs.com/adolfmc/archive/2012/07/31/2616908.html 创建一个简单的Java工程:mvn archetype:create -D ...
- GWT环境搭建--eclipse
上面下来需求,需要用到GWT,以前没接触过,搭个开发环境研究研究 安装软件我放在百度云盘里了(其他版本自己找,我的版本 eclipse4.4 luna gwt2.7) 链接:http://pan.b ...
- 几个linux命令
常用linux命令: 普通用户命令: 一.文件和目录查看类命令 1. ls (常用参数 -l 和-h) 蓝颜色:表示目录 绿颜色:表示可执行文件 红颜色:表示压缩文件 白颜色:表示普通文件 青色:表示 ...
- .net 中连接mysql
1. 下载mysql驱动.里面包含需要连接mysql的dll.mysql-connector-net 地址:http://dev.mysql.com/downloads/file/?id=463 ...