一、RSA算法

RSA是非对称加密算法中的代表,它的重要性不言而喻,为了弄清楚RSA算法,我们一起来完成一项任务:

背景:现在是疫情时代,假如小明和女朋友被迫在两个城市,小明为了表达感情,想发给对方一句蜜语,但是不能让其他任何人知道。

蜜语用计算机语言表达:105 ,32 ,73,111,118,101,32,117,因为明文,所以想用RSA算法加密。如何做呢?

分为三步:

1、先搞清楚RSA的算法步骤

2、对每一个数字加密

3、对方能够解密

下来,我们一起完成帮小明完成心愿。

RSA的算法步骤:

1、随机选两个不相等的质数p和q

2、计算p和q的乘积n

3、计算n的欧拉函数 φ(n)

4、随机选择一个整数e,条件是1<e<φ(n),且e与φ(n)互质

5、计算e对于φ(n)的模反元素d

6、n和e为公钥,n和d为私钥

我们按照步骤,首先生成公钥和私钥

1、选两个质数 13和7

2、n=13*7=91

3、φ(143)=φ(13*7)=φ(13)*φ(7)=12*6=72

4、随机取一个数为5

5、通过扩展欧几里得算法,可以得出d=29

6、公钥:(91,5)   私钥:(91,29)

然后加密

m ^e ≡ c (mod n)

已知:m等于要发送的蜜语,e=5,n=91,求c (c为加密后的信息)

m=105,32 ,73,111,118,101,32,117

加密后的蜜语:14,2, 47,76,27, 82,2,52

最后解密

c ^d ≡ m (mod n)

已知:加密后的蜜语c,d=29,n=91 求m  (m为原始蜜语)

c=14,2, 47,76,27, 82,2,52

解密后:14,32,73,20,27,10,32,26

存在问题:

1、当n比较小的时候,要加密的数比n大时,可能存在解密出来的数和原来的数差一个模。比如111,加密后是76,解密后是20, 20+91=111,其中91是模

2、模反元素求出的结果是负数

负数+模

解决思路:

选n的时候,选大一点,我们学习算法的时候,为了好计算,所以取的值比较小。如果原始数值也很大的时候,就考虑分割加密,比如,我们的n=91,要加密105,就分成两部分加密,比如加密一个10,再加密一个5,解密后,还是105,因为它只不过是字符序列而已。

二、质数

也称素数:大于1的自然数中,除了1和它自身外,不能被其它自然数整除

质数分布规律,随着数字越大,质数分布越稀疏

孪生质数:相差为2的质数对,如(3,5)(5,7)

在这里,我介绍下数学界数论的四大猜想

孪生素数猜想

存在无限个孪生质数对

欧拉:瑞士数学家、自然科学家1707年4月15日~1783年9月18日

13岁读大学、15岁大学毕业、16岁获得硕士学位,18世纪最杰出的数学家之一,不满十岁,就开始自学《代数学》,1766年患白内障,几乎失明。

哥德巴赫:德国的一个中学数学老师,1742年,给欧拉写信,提出了哥德巴赫猜想

哥德巴赫猜想

(a)任何一个>=6之偶数,都可以表示成两个奇质数之和。

(b) 任何一个>=9之奇数,都可以表示成三个奇质数之和。

从 9+9开始,逐步减少每个数里所含质数因子的个数,直到最后使每个数里都是一个质数为止,这样就证明了哥德巴赫猜想。中国的数学家在这个问题上是领先世界的。

华罗庚只有初中学历,由于家庭原因,被迫辍学,但是他的自学能力特别强,出版的数学著作数不胜数,上学的时候学习过他的文章,主要讲统筹,比如,烧水的时候,同时干点别的事情。我只是简单地提下。

陈景润有口吃,被停职,但是他的研究能力很厉害,上帝关了一道门,但是同时开了一扇窗。华罗庚发现了陈景润的才能,被带到研究院,陈景润研究哥德巴赫猜想,证明了1+2,大偶数为一个素数及一个不超过两个素数的乘积之和。迄今为止,是这个问题研究的终结点。

四色猜想

四色问题的内容是:“任何一张平面地图只用四种颜色就能使具有共同边界的国家着上不同的颜色。”用数学语言表示,即“将平面任意地细分为不相重叠的区域,每一个区域总可以用1,2,3,4这四个数字之一来标记,而不会使相邻的两个区域得到相同的数字。”

费马猜想

形如xn+yn=zn的方程,当n>2时不可能有整数解。“关于此,我确信已发现了一种美妙的证法 ,可惜这里空白的地方太小,写不下”,费马很有趣,美妙的证法,没法让其他人知道。

费马  1601年8月17日~1665年1月12日, 法国律师和业余数学家

三、欧拉函数

同余类:模m同余的整数构成的集合

完系:在模m同余类中每一个类取一个数构成的集合叫m的一个完全剩余系,简称完系

最小非负完系:0,1,2,... ,m-1

互质是公约数只有1的两个整数,叫做互质整数,互质也称互素。

缩系(既约剩余系):{1,2,...m}中与m互素的数的集合

Φ(m)=s,s为缩系的个数

换句话说,对正整数n,小于n的正整数中与n互质的数的数目

积性函数:f(ab)=f(a)*f(b)

欧拉函数φ(n)是积性函数。如果m,n互素,Φ(m*n)=Φ(m)*Φ(n)

例如,3和5互素,由于φ(3)=2,φ(5)=4,φ(15)=φ(3)*φ(5)=2*4=8

积性函数证明

 

构造了一个nm的矩阵,找到同时与nm互素的元素

GCD(km+r,m)=GCD(r, m),所以每一列的 n 个元素同时与 m 互素,当且仅当 GCD(r,m)=1

与m互素的列共有Φ(m)个,假设第r列与m互素,r,m+r,2m+r,  (n-1)m+r 是mod n的一个完系,在这一列中与n互素的共有Φ(n)个,所以Φ(mm)=Φ(m)*Φ(n)

 

欧拉定理:

mφ(n) ≡ 1 (mod n)

它能做什么?简化幂的模运算,还能做什么,与RSA算法有什么关系?这个后面就会知道

 

欧拉定理证明:

设x1,x2...xφn 与n互质

ax1 (mod n),ax2 (mod n)...axφn ( mod n) 也与n互质,经过排序后与x1,x2...xφn相同

所以aX1 * aX2 *  ... * aXφn ≡  X1 * X2 * ...* Xφn  (mod n)

(aφ(n-1)X1 * X2 * ...* Xφn ≡ 0 (mod n)

因为X1 * X2 * ...... * Xφn与n互质,所以 (aφ(n-1)|n  即 aφ(n) ≡ 1 (mod n)

 

费马小定理:

引理1:

若a,b,c为任意3个整数,m为正整数,且(m,c)=1,则当a·c≡b·c(mod m)时,有a≡b(mod m)

引理2:

设m是一个整数且m>1,b是一个整数且(m,b)=1。如果a[1],a[2],a[3],a[4],…a[m]是模m的一个完全剩余系,则b·a[1],b·a[2],b·a[3],b·a[4],…b·a[m]也构成模m的一个完全剩余系。

构造一个p的完全剩余系

P={1,2,3,...,p-1}

因为 (a,p)=1,由引理2可得

A={a,2a,3a,...,(p-1)a},也是p的一个完全剩余系。由完全剩余系的性质

a*2a*3a*...*(p-1)a≡1*2*3*...*(p-1) (mod p)

所以1*2*3*...*(p-1)*ap-1≡1*2*3*...*(p-1) (mod p)

(p-1)! *ap-1≡(p-1)! (mod p)

((p-1),p)=1,两边同时约去 (p-1)!

ap-1≡1(mod p)

它是欧拉定理的一个特殊情况,当p为质数时,φ(p) =p-1

四、模反元素

ed ≡ 1 mod φ(n),已知e和φ(n),求d,用扩展欧几里得算法

欧几里得是古希腊雅典著名的数学家,他著有《几何原本》,是当时的一本教科书,是欧式几何学的开创人。

欧几里得算法,就是碾转相除法,求两个正整数的最大公约数,已知a,b  求gcd(a,b)=gcd(b,a mod b),编程中经常用递归去计算

扩展欧几里得算法

ed=kφ(n)+1

ed-kφ(n)=1

符合ax+by=1,求解x

裴蜀定理:对于任何整数a、b和gcd(a,b)=d,则一定存在整数x,y,使得ax+by=d

推论,a,b互质的充分必要条件是存在整数x,y,使得ax+by=1

a*x+b*y = gcd(a , b)

= gcd(b , a mod b)

= b * x1 + (a mod b) * y1

= b * x1 + (a - a / b * b) * y1 即

a*x+b*y = b * x1 + (a - a / b * b) * y1

化简上式,得

a*x+b*y = a*y1 - b*a/b*y1 + b*x1 , 即

a * x + b * y

= a * y1 + b * (x1-a/b*y1)

所以

x=y1

y=x1 - a/b*y1

用代码表示:

void exgcd(int a, int b, int &d, int &x ,int &y)
{ if ( !b )
{      d = a; x = 1; y = 0; return;
} int x1,y1; exgcd( b , a % b , d , x1 , y1 ); x = y1; y = x1 - ( a / b ) * y1; return ;
}

中国剩余定理,也叫孙子定理

《孙子算经》中有这样一个问题:有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何?

x  mod 3=2

x  mod 5=3

x  mod 7=2

直接解决,似乎很困难,但是每一项分开求,就简单了

x1 mod 3=2

x2 mod 5=3

x3 mod 7=2

针对同余方程组,我们假设 x=x1+x2+x3,于是可以推出

x2+x3  mod 3 = 0

x1+x3  mod 5 = 0

x1+x2  mod 7 = 0

两个数之和可以被3整除,姑且认为每个数都可以被3整除,简化问题,通过观察上面的式子就会发现,x1是5和7的公倍数,取最小公倍数35,x2和x3同理。同余方程组变为:

35m1 ≡2 (mod 3)

21m2 ≡3(mod 5)

15m3≡ 2(mod 7)

根据引理1,可知被除数和余数同时缩小相同的倍数, 同余方程不变

35w1 ≡1 (mod 3)

21w2 ≡1(mod 5)

15w3≡ 1(mod 7)

问题转换到求逆元,求出w1,w2,w3后,在依次计算

已知 m1=2w1,m2=3w2, m3=2w3  ,求出 m1,m2,m3,

已知 x1=35m1  ,x2=21m2   ,x3=15m3 ,求出x1,x2,x3

已知 x=x1+x2+x3,求出x

求出x的最小值

介绍中国剩余定理的目的,一方面是因为它在数论里很重要,另一方面,是它可以用扩展欧几里得求解。

可是中国古人在研究这个问题的时候,欧几里得扩展法是否已广为人知。

五、解密证明

已知模反元素,证明解密

已知me ≡ c (mod n)  ,证明cd ≡ m (mod n)

me= kn+c

c=me-kn

(me-kn)d ≡ m (mod n)

展开后,med≡ m (mod n)

因为ed ≡ 1 mod φ(n)

ed=hφ(n)+1

mhφ(n)+1 ≡ m (mod n)

 

假设m,n互质

根据欧拉定理 mφ(n) ≡ 1 (mod n)

(mφ(n))h  *m ≡ m (mod n)

m,n 不互质的情况,这里不再陈述,我觉得比较繁琐。

已知加解密过程,倒推模反元素

me ≡ c (mod n)    cd ≡ m (mod n)

med ≡ m (mod n)

med-1 ≡ 1 (mod n)

由欧拉定理可知  kφ(n)=ed-1

ed=kφ(n)+1

后记:

1、第一部分的例子中,由于n选的不够大,所以导致加密比n的数字后,解密出来后就不准了。这个问题,希望真正想学习RSA算法的益友,可以换个稍微大一点的n,再手动走一遍算法。

2、网上参考的文章都是先介绍数学知识,然后很多人可能连算法的全貌没有看到,直接退出去了,因为数学知识不容易懂。所以我反其道而行之,先体验加密解密的过程,然后再去弄懂算法背后的数学知识。

3、为了搞清楚RSA算法,我准备了好几周,补习数学知识,这些知识是算法的基石。RSA算法的可靠性,建立在大数难以分解的数学原理之上。

4、例子要传输的原文是 i love u的ASCII码,包括中间的空格

主要参考文章:

https://www.cnblogs.com/zylAK/p/9569668.html

https://zhuanlan.zhihu.com/p/58241990

https://zhuanlan.zhihu.com/p/48249182

https://zhuanlan.zhihu.com/p/103394468

RSA算法之学习的更多相关文章

  1. RSA算法、SSL协议学习笔记

    最近学习计算机网络,涉及到SSL协议,我想起了去年密码学课程讲过的非对称加密RSA算法,结合阮老师的博客,写写学习笔记,这里再回忆一下. RSA算法 RSA算法是一种非对称密码算法,所谓非对称,就是指 ...

  2. RSA算法学习

    package com.test.rsa; /* * 为了选择公钥和私钥,Bob必须执行如下步骤: * 1)选择两个大素数p和q.那么p和q应该多大呢?该值越大,RSA越难于破解,但是执行加密和解密所 ...

  3. 跨越千年的RSA算法

    转载自http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...

  4. RSA算法小记

    学习来源:http://www.cnblogs.com/vamei/p/3480994.html 小记: 一.数学基础: 欧拉Phi函数:Φ(n)=总数(从1到n-1中与n互质的整数) (1)欧拉定理 ...

  5. SSH原理与运用(一)和(二):远程登录 RSA算法原理(一)和(二)

    SSH原理与运用(一)和(二):远程登录  RSA算法原理(一)和(二) http://www.ruanyifeng.com/blog/2011/12/ssh_remote_login.html ht ...

  6. 非对称加密技术- RSA算法数学原理分析

    非对称加密技术,在现在网络中,有非常广泛应用.加密技术更是数字货币的基础. 所谓非对称,就是指该算法需要一对密钥,使用其中一个(公钥)加密,则需要用另一个(私钥)才能解密. 但是对于其原理大部分同学应 ...

  7. 更多细节的理解RSA算法

    一.概述 RSA算法是1977年由Ron Rivest.Adi Shamir 和 Leonard Adleman三人组在论文A Method for Obtaining Digital Signatu ...

  8. RSA算法原理——(2)RSA简介及基础数论知识

    上期为大家介绍了目前常见加密算法,相信阅读过的同学们对目前的加密算法也算是有了一个大概的了解.如果你对这些解密算法概念及特点还不是很清晰的话,昌昌非常推荐大家可以看看HTTPS的加密通信原理,因为HT ...

  9. SSH加密原理、RSA非对称加密算法学习与理解

    首先声明一下,这里所说的SSH,并不是Java传统的三大框架,而是一种建立在应用层和传输层基础上的安全外壳协议,熟悉Linux的朋友经常使 用到一 个SSH Secure Shell Cilent的工 ...

随机推荐

  1. Terraform状态State管理,让变更有记录

    我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 简介 最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人. Terraform系列文章如下: Ter ...

  2. SystemVerilog 中的相等运算符:== or === ?

    1. 四值逻辑的逻辑运算 在对比SystemVerilog中的相等运算符之前,先来看一下三种最基本的逻辑运算符,下文中以·表示与运算,以+表示或运算,以'表示非运算.我们都知道在逻辑代数中,只有0和1 ...

  3. release模式下打断点调试 配置选项

    最近调试一个离职的同事留下的工程,DEBUG模式下顺利,RELEASE的时候就崩溃了,显示为"帧不在模块中"--简直一头雾水 于是我修改配置,为了能够在Release模式中打断点调 ...

  4. 5.15、tomcat下部署JPress

    1.说明: jpress类似于wordpress,wordpress是php语言开发的国外开源软件,jpress是java语言 开发的国内开源软件: 2.下载软件包: [root@slave-node ...

  5. salesforce零基础学习(一百零四)Salesforce Optimizer

    本篇参考: https://admin.salesforce.com/blog/2017/analyzing-org-salesforce-optimizer-webinar-recap 假设你在做一 ...

  6. Spring中的<context:annotation-config/>配置

    当我们需要使用BeanPostProcessor时,直接在Spring配置文件中定义这些Bean显得比较笨拙,例如: 使用@Autowired注解,必须事先在Spring容器中声明AutowiredA ...

  7. PHP中“简单工厂模式”实例讲解(转)

      ? 1 2 3 4 5 6 7 8 原创文章,转载请注明出处:http://www.cnblogs.com/hongfei/archive/2012/07/07/2580776.html   简单 ...

  8. Bootstrap-table 显示行号

    趁热打铁,使用bootstrap-table时,想要显示每行的行号,再网上查了查,网上给的显示行号的大部分方法,只要一翻页,行号就会又从1开始计算, 也许没有碰到想要的,自己试着解决了这个问题,本人初 ...

  9. openjudge走迷宫(DFS)

    题目: 描述 一个迷宫由R行C列格子组成,有的格子里有障碍物,不能走:有的格子是空地,可以走. 给定一个迷宫,求从左上角走到右下角最少需要走多少步(数据保证一定能走到).只能在水平方向或垂直方向走,不 ...

  10. 从新建文件夹开始构建ShadowPlay Engine游戏引擎(3)

    本篇序言 各位可能看到博文的名字换了,也就是引擎名字换了,其实是在下想到了一个更棒的名字:皮影戏(ShadowPlay),取这个名字的含义是因为,游戏中的角色(Puppet)不也是由于我们的操作而动起 ...