一:非对称加密的由来

RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的所有密码攻击,已被ISO推荐为公钥数据加密标准。RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但那时想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥。RSA算法是第一个能同时用于加密和数字签名的算法,也易于理解和操作。

  RSA是被研究得最广泛的公钥算法,从提出到现在已近二十年,经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。即RSA的重大缺陷是无法从理论上把握它的保密性能如何,而且密码学界多数人士倾向于因子分解不是NPC问题。

二:RSA的缺点主要有:

A)产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。

B)分组长度太大,为保证安全性,n 至少也要 600bits以上,使运算代价很高,尤其是速度较慢,较对称密码算法慢几个数量级;且随着大数分解技术的发展,这个

长度还在增加,不利于数据格式的标准化。目前,SET(Secure Electronic Transaction)协议中要求CA采用2048bits长的密钥,其他实体使用1024比特的密钥。C)RSA密钥长度随着保密级别提高,增加很快。下表列出了对同一安全级别所对应的密钥长度。

保密级别 对称密钥长度(bit) RSA密钥长度(bit) ECC密钥长度(bit) 保密年限
80 80 1024 160 2010
112 112 2048 224 2030
128 128 3072 256 2040
192 192 7680 384 2080
256 256 15360 512 2120

三:算法操作

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; 

四:算法栗子

 //非对称加密
public class RSAEncrypted
{ /// <summary>
/// RSA产生密钥
/// </summary>
public void RSAKey()
{
try
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
var xmlKeys = rsa.ToXmlString(true);
var xmlPublicKey = rsa.ToXmlString(false);
var str = "明月几时有,把酒问青天,不知道天上今夕是何年";
//1.1有长度限制的加密
var cipherText = RSAEncryptLimitLength(xmlPublicKey, str);
//1.2有长度限制的解密
var txt = RSADecryptLimitLength(xmlKeys, cipherText); //2.1加密
var cipherText1 = RSAEncrypt(xmlPublicKey, str);
var txt1 = RSADecrypt(xmlKeys, cipherText1); //3.1字符串,hash描述表
//var hashTxt = GetHashStr(str);
//3.1文件,hash描述表
var hashTxt = GetHashFile(); //3.2进行签名
var signTxt = SignatureFormatterStr(xmlKeys, hashTxt);
//3.3签名验证
var defSign = SignatureDeformatterStr(xmlPublicKey, hashTxt, signTxt); }
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// 文件,hash描述表
/// </summary>
/// <returns></returns>
public string GetHashFile()
{
try
{
var path = @"C:\xxx\xxxx\xxx\图解HTTP 上野宣著.pdf";
FileStream objFile = new FileStream(path, FileMode.Open);
//从文件中取得Hash描述
HashAlgorithm MD5 = HashAlgorithm.Create("MD5");
//返回字节数组
byte[] HashData = MD5.ComputeHash(objFile);
objFile.Close();//必须有
//返回签名字符串
var result = Convert.ToBase64String(HashData);
return result;
}
catch (Exception ex)
{
throw ex;
}
} #region 字符串的hash描述,签名及验证 /// <summary>
/// 字符串,hash描述表
/// </summary>
/// <param name="strSource">待签名的字符串</param>
/// <returns></returns>
public string GetHashStr(string strSource)
{
try
{
HashAlgorithm MD5 = HashAlgorithm.Create("MD5");
byte[] buffer = Encoding.GetEncoding("GB2312").GetBytes(strSource);
//返回字节数组
var hashData = MD5.ComputeHash(buffer);
//返回string
var hashStr = Convert.ToBase64String(hashData);
return hashStr;
}
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// RSA签名
/// </summary>
/// <param name="strKeyPrivate">私钥</param>
/// <param name="HashbyteSignature">待签名Hash描述</param>
/// <returns></returns>
public string SignatureFormatterStr(string strKeyPrivate, string hashbyteSignatureStr)
{
try
{
byte[] HashbyteSignature = Convert.FromBase64String(hashbyteSignatureStr);
byte[] EncryptedSignatureData;
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.FromXmlString(strKeyPrivate);
RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(RSA);
//设置签名的算法为MD5
RSAFormatter.SetHashAlgorithm("MD5");
//执行签名
//返回字节数据
EncryptedSignatureData = RSAFormatter.CreateSignature(HashbyteSignature);
return Convert.ToBase64String(EncryptedSignatureData); }
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// RSA签名验证
/// </summary>
/// <param name="strKeyPublic">公钥</param>
/// <param name="strHashbyteDeformatter">Hash描述</param>
/// <param name="deformatterDataStr">签名后的结果</param>
/// <returns></returns>
public bool SignatureDeformatterStr(string strKeyPublic, string strHashbyteDeformatter, string deformatterDataStr)
{
try
{
byte[] DeformatterData = Convert.FromBase64String(deformatterDataStr);
byte[] HashbyteDeformatter = Convert.FromBase64String(strHashbyteDeformatter);
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
RSA.FromXmlString(strKeyPublic);
RSAPKCS1SignatureDeformatter RSADeformatter = new RSAPKCS1SignatureDeformatter(RSA);
//指定解密的时候HASH算法为MD5
RSADeformatter.SetHashAlgorithm("MD5");
if (RSADeformatter.VerifySignature(HashbyteDeformatter, DeformatterData))
{
return true;
}
else
{
return false;
}
}
catch (Exception ex)
{
throw ex;
}
} #endregion #region RSA加密
/// <summary>
/// RSA的加密函数
/// </summary>
/// <param name="xmlPublicKey">公钥</param>
/// <param name="encryptString">待加密的字节数组</param>
/// <returns></returns>
public string RSAEncrypt(string xmlPublicKey, string encryptString)
{
try
{
byte[] encrypt = Encoding.Default.GetBytes(encryptString);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(xmlPublicKey);
var cypherTextBArray = rsa.Encrypt(encrypt, false);
return Convert.ToBase64String(cypherTextBArray);
}
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// RSA的解密函数
/// </summary>
/// <param name="xmlPrivateKey">私钥</param>
/// <param name="decryptString">待解密的字节数组</param>
/// <returns></returns>
public string RSADecrypt(string xmlPrivateKey, string decryptString)
{
try
{
byte[] decrypt = Convert.FromBase64String(decryptString);
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(xmlPrivateKey);
var dypherTextBArray = rsa.Decrypt(decrypt, false);
// return (new UnicodeEncoding()).GetString(dypherTextBArray);
return Encoding.Default.GetString(dypherTextBArray); }
catch (Exception ex)
{
throw ex;
}
}
#endregion #region RSA加密,有长度限制
/// <summary>
/// RSA的加密函数,该加密方式有长度限制的
/// </summary>
/// <param name="xmlPublicKey">公钥</param>
/// <param name="encryptString">待加密的字符串</param>
/// <returns></returns>
public string RSAEncryptLimitLength(string xmlPublicKey, string encryptString)
{
try
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(xmlPublicKey);
byte[] plainTextBArray = (new UnicodeEncoding()).GetBytes(encryptString);
byte[] cypherTextBArray = rsa.Encrypt(plainTextBArray, false);
return Convert.ToBase64String(cypherTextBArray); }
catch (Exception ex)
{
throw ex;
}
} /// <summary>
/// RSA的解密函数
/// </summary>
/// <param name="xmlPrivateKey">私钥</param>
/// <param name="decryptString">待解密的字符串</param>
/// <returns></returns>
public string RSADecryptLimitLength(string xmlPrivateKey, string decryptString)
{
try
{
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.FromXmlString(xmlPrivateKey);
byte[] plainTextBArray = Convert.FromBase64String(decryptString);
byte[] dypherTextBArray = rsa.Decrypt(plainTextBArray, false);
return (new UnicodeEncoding()).GetString(dypherTextBArray);
}
catch (Exception ex)
{
throw ex;
}
}
#endregion }

文章参考:http://www.cnblogs.com/linzheng/archive/2011/02/20/1959123.html

http://www.cnblogs.com/sydeveloper/archive/2012/08/11/2633624.html

加密算法之非对称加密RSA的更多相关文章

  1. Crypto++应用:非对称加密RSA

    1,非对称加密RSA: (1)乙方生成两把密钥(公钥和私钥).公钥是公开的,任何人都可以获得,私钥则是保密的. (2)甲方获取乙方的公钥,然后用它对信息加密. (3)乙方得到加密后的信息,用私钥解密. ...

  2. 非对称加密RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。使用最广泛的是RSA算法

          非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey).公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密:如果用私 ...

  3. 非对称加密RSA的应用及在C#中的实现

    quote: http://www.cnblogs.com/happinessCodes/archive/2010/07/27/1786404.html   一说到数据的加密,常常会涉及到这几个单词: ...

  4. Asp.Net 常用工具类之加密——非对称加密RSA算法

    踏入程序员这个行业也有几年了,几年中有收获(技术加强),有付出(时间和亚健康状态).当然喏,并不后悔,代码路还长!!! On The Way,永不止步!!! 开发过程中也积累了一些自己的经验.代码块和 ...

  5. 非对称加密RSA的C#实现

    1.对称加密算法 对称加密是最快速.最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key). 对称加密有很多种算法,由于它效率很高,所 ...

  6. python 加密 解密 签名 验证签名 公钥 私钥 非对称加密 RSA

    加密与解密,这很重要,我们已经可以用pypcap+npcap简单嗅探到网络中的数据包了.而这个工具其实可以嗅探到更多的数据.如果我们和别人之间传输的数据被别人嗅探到,那么信息泄漏,信息被篡改,将给我们 ...

  7. PHP非对称加密-RSA

    对称加密算法是在加密和解密时使用同一个密钥.与对称加密算法不同,非对称加密算法需要两个密钥--公开密钥(public key)和私有密钥(private key)进行加密和解密.公钥和密钥是一对,如果 ...

  8. openssl 非对称加密 RSA 加密解密以及签名验证签名

    1. 简介 openssl  rsa.h 提供了密码学中公钥加密体系的一些接口, 本文主要讨论利用rsa.h接口开发以下功能 公钥私钥的生成 公钥加密,私钥解密 私钥加密,公钥解密 签名:私钥签名 验 ...

  9. javascript版前端页面RSA非对称加密解密

    最近由于项目需要做一个url传参,并在页面显示参数内容的需求,这样就会遇到一个url地址可能会被假冒, 并传递非法内容显示在页面的尴尬情况 比如xxx.shtml?server=xxx是坏人& ...

随机推荐

  1. zynq linux驱动之PL-PS中断【转】

    转自:https://blog.csdn.net/h244259402/article/details/83993524 PC:Windows 10 虚拟机:ubuntu 16.04 vivado:2 ...

  2. WYSIWYG WebBuilder 所见即所得工具

    WYSIWYG WebBuilder  所见即所得工具: http://www.wysiwygwebbuilder.com/

  3. telnetlib 中各种 read 函数的意义

    基本原理 要明白 telnetlib 中各个 read 函数的意义,首先要了解 telnetlib 的工作原理. telnetlib 首先通过 socket 连接从网络接收数据,把数据存储到自己的 r ...

  4. Holedox Eating HDU - 4302 2012多校C 二分查找+树状数组/线段树优化

    题意 一个长度$n<=1e5$的数轴,$m<=1e5$个操作 有两种一些操作 $0$  $x$ 在$x$放一个食物 $1$ 一个虫子去吃最近的食物,如果有两个食物一样近,不转变方向的去吃 ...

  5. 鸟哥Linux私房菜基础学习篇学习笔记1

    鸟哥Linux私房菜基础学习篇学习笔记1 第三章 主导分区(MBR),当系统在开机的时候会主动去读取这个区块的内容,必须对硬盘进行分区,这样硬盘才能被有效地使用. 所谓的分区只是针对64Bytes的分 ...

  6. epoll机制详解

    epoll机制详解 大牛的详解 epoll详解 什么是epoll? epoll是为处理大批量句柄而作了改进的poll, 是性能最好的多路I/O就绪通知方法; 只有三个系统调用: epoll_creat ...

  7. 洛谷P3247 [HNOI2016]最小公倍数 [分块,并查集]

    洛谷 思路 显然,为了达到这个最小公倍数,只能走\(a,b\)不是很大的边. 即,当前询问的是\(A,B\),那么我们只能走\(a\leq A,b\leq B\)的边. 然而,为了达到这最小公倍数,又 ...

  8. jenkins自动发布java代码

    注:本文来源于<KaliArch> jenkins笔记 一.相关概念 1.1 Jenkins概念: Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台. ...

  9. java.lang.NumberFormatException 错误及解决办法

    package com.geelou.test; public class ErrTest { public static void main(String[] args) { String numS ...

  10. Confluence 6 从生产环境中恢复一个测试实例

    请参考 Restoring a Test Instance from Production 页面中的内容获得更多完整的说明. 很多 Confluence 的管理员将会使用生产实例运行完整数据和服务的 ...