RSA算法的概述(个人理解,欢迎纠正)

RSA是一种基于公钥密码体制的优秀加密算法,1978年由美国(MIT)的李维斯特(Rivest)、沙米尔(Shamir)、艾德曼(Adleman)提的。
RSA算法是一种分组密码体制算法,它的保密强度是建立在具有大素数因子的合数其因子分解是困难的(基于大数分解的难度)。
公钥和私钥是一对大素数的函数,从一个公钥和密文中恢复出明文的难度等价于分解两个大素数之积。
RSA得到了世界上的最广泛的应用,ISO在1992年颁布的国际标准X.509中,将RSA算法正式纳入国际标准。

在给大家介绍RSA算法前,先要给大家介绍一下非对称加密和对称加密的概念。

非对称加密:加密和解密需要不同的密钥。for example:小明有两个密钥,一把公钥是公开的,一把私钥是私密的,只有小明一个人知道。小红呢,她可以通过小明公开的公钥去加密这串明文,而小明则可以通过自己的私钥解开这串密文。

对称加密:加密和解密都是用同一个密钥的算法,称作对称加密。举个例子:小明用一种密钥加密一串明文,小红可以通过相同的密钥解密这串明文。

而我们今天要说的RSA算法正是一种非对称算法。那么掌握RSA算法需要有哪些数学基础呢?

这里给大家介绍一下

  1. 欧拉函数
  2. 欧拉定理
  3. 模反元素
  4. 欧几里得扩展算法。

欧拉函数:

定义:任意给定正整数n,计算在小于等于n的正整数之中,有多少个与n构成互质关系。计算这个值的方法叫做欧拉函数。以φ(n)表示。如φ(8)=4,应为在1到8之中,与8形成互质关系的有1,3,5,7。

φ(n)的计算方法并不复杂,我们就分情况分析。

标准分解式:将质因数分解的结果,按照质因数大小,由小到大排列,并将相同质因数的连乘积,以指数形式表示,此种表示法称为标准分解式。如2020的标准分解式是2^2*101。

计算方法:首先我们明白任何大于1的整数都可以写成几个质数的乘积

所以第一步:先将整数n写成以下形式

第二步:我们知道如果n是质数的某一个次方,即n=p^k(p为质数,k>=1),则φ(n)=p^k-p^(k-1),所以我们可以将φ(n)类推成以下形式

举个例子:φ(1323)=φ(3^2*7^2)=1323(1-1/3)(1-1/7)=756

欧拉定理:

定义:若n, a为正整数,且n,a互质,则:a^φ(n)≡1(mod n)

模反元素:

定义:如果两个正整数a和n互质,那么一定可以找到整数b,使得 ab-1 被n整除。举个例子:3和11互质,那么3的模反元素是4,应为3*4-1 可以被11整除。4加减11的整数倍数都是3的模反元素。

欧几里得扩展算法:

欧几里得算法又称辗转相除法,用来求两个正整数的最大公约数。以1997和615为例,用欧几里得算法求解如下:

1997=615∗3+152

615=152∗4+7

152=7∗21+5

7=5∗1+2

5=2∗2+1

2=1∗2+0

得到两个数的最大公因数是1,也就意味着两数互质。

两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数。用数学表示为: gcd(a,b)=gcd(b,amodb)

掌握了这些知识后就可以开始尝试通过RSA算法进行加密和解密。

ok,让我们来进入正题吧

(1)设计密钥

A、在离线方式下,先产生两个足够大的强质数p、q;
B、令n=p*q。计算欧拉函数φ(n)=(p-1)×(q-1);
C、选取一个与φ(n)互素的奇数e,称e为公开指数;
D、根据e×d=1 mod(φ(n)),找出d;
E、舍弃p和q (但绝不能泄露) ,公开(n,e),公钥;
F、保密(n,d) 私钥。

(2)加密

对于明文M,用公钥 (n,e) 加密可得到密文C。 
C = Me mod (n)

(3)解密

对于密文C,用私钥(n,d)解密可得到明文M。
  M = Cd mod (n)

举个例子:

选取p=3, q=5,则n=p*q =15,(n)=(p-1)(q-1)=8
选取e=11(大于p和q的质数);
由d×11=1 mod 8,计算出d =3,
  得到公开密钥:(n,e)=(15,11)
    私有密钥:(n,d)=(15,3)
假定明文M为整数13。则密文
   C=Me mod n=1311 mod 15 = (132)5*13 mod 15 =
(132 mod 15 ) 5 *13 mod 15=4 5 *13 mod 15=7
复原明文M为:
M = Cd mod n= 73 mod 15= 343 mod 15 = 13

大家可以看到对于可以分解成两个小素数的n,RSA加密就很容易被破解,所以RSA算法的安全性极大依赖我们所设置的私钥。

再给大家用字符串举个例子:

1、加密字串举例:若有明文public key encryptions
2、先将明文分块为两个一组(此处为简化计算考虑):
   pu bl ic ke ye nc ry pt io ns
3、将明文数字化令a,b…,z 分别为00,01,…,25 得
   1520 0111 0802 1004 2404
   1302 1724 1519 0814 1318
4、利用加密可得密文
   0095 1648 1410 1299 1365
   1379 2333 2132 1751 1324
5、解密后又得到明文

加密过程:

C=Me mod n=152013 mod 2537
= (15202)6*1520 mod 2537
∵15202 =1730 mod 2537
∴C= (1730)6*1520 mod 2537
= (17302)3*1520 mod 2537
∵17302 =1777 mod 2537
∴C= (1777)3*1520 mod 2537
= (1777)2*1777*1520 mod 2537
∵17772 =1701 mod 2537
∴C=1701*(1777*1520) mod 2537
=1701*1672 mod 2537 =95(密文)

解密过程:

M = Cd mod n= 95937 mod 2537
= (952)468*95 mod 2537
 = (1414)468*95 mod 2537
= (14142)234*95 mod 2537
= (240)234*95 mod 2537
………
= (625*25)*(341*788)*95 mod 2537
=230*2323 mod 2537
= 1520 mod 2537 =1520(明文)

优点:

是第一个能同时用于加密和数字签名的算法,也易于理解和操作,也是被研究得最广泛的公钥算法,二十年来经历了各种攻击的考验,逐渐为人们接受,普遍认为是目前最优秀的公钥方案之一。

该算法的加密密钥和加密算法分开,使得密钥分配更为方便。特别符合计算机网络环境。

对于网上的大量用户,可以将加密密钥用电话簿的方式印出。如果某用户想与另一用户进行保密通信,只需从公钥簿上查出对方的加密密钥,用它对所传送的信息加密发出即可。

对方收到信息后,用仅为自己所知的解密密钥将信息解密,了解报文的内容。

缺点:

缺点:
(1)产生密钥很麻烦,难以做到一次一密。
(2)RSA的安全性依赖于大数的因子分解,但并没有从理论上证明破译RSA的难度与大数分解难度等价。目前人们已能分解140多位十进制位的大素数,这就要求使用更长的密钥,速度更慢。而且目前人们正在积极寻找攻击RSA的方法。
(3)速度太慢, RSA的分组长度太大。为了速度问题,目前人们广泛使用单、公钥密码结合使用的方法,优缺点互补:单钥密码加密速度快, 用它来加密较长的文件,然后用RSA来给文件密钥加密,极好的解决了单钥密码的密钥分发问题。

就介绍到这里了,作为一个新人,肯定有很多说不到位的地方欢迎大家来纠正我的错误,提供指导,谢谢各位的阅读。

 
 
 

最新文章

  1. SQL 2008 R2下载 升级R2 SP1或者SQL 2008从10.50.1600升级10.5.2500
  2. phonegap 3.3教程 地理信息api教程
  3. 转:怎样在VMware ESXi上 克隆虚拟机
  4. HDOJ ——统计难题
  5. jQuery Callback 函数
  6. opennebula 自定义安装目录
  7. 【javascript基础知识】javascript中的转义序列和特殊数值常量
  8. mac安装GNU命令行工具
  9. php 字符串
  10. 8 cocos2dx加入场景切换效果,控制场景切换彻底完毕之后再运行动画
  11. winform 实现选择的城市名单
  12. 开源的许可证GPL、LGPL、BSD、Apache 2.0的通俗解释
  13. centos7下编译安装mysql
  14. java利用iTextWorker生成pdf
  15. mac 配置 ssh 到git (Could not resolve hostname github.com, Failed to connect to github.com port 443 Operation timed out)
  16. kafka笔记9(监控)
  17. Web性能优化系列(1):Web性能优化分析
  18. Activiti Modeler初探实践
  19. php实现cookie加密解密
  20. Python:字典操作总结

热门文章

  1. 题解0012:剪花布条(KMP)
  2. 好客租房39-react组件基础总结
  3. Android Studio中一套代码多版本打包
  4. django三板斧与request对象方法与ORM
  5. Linux版 MySql57安装教程
  6. 清明欢乐赛(USACO选题)
  7. 2021年第十二届蓝桥杯javaA组省赛部分题目
  8. Android Proguard混淆对抗之我见
  9. 阶段性总结 GDOI 2022 PJ
  10. 李呈祥:bilibili在湖仓一体查询加速上的实践与探索