密码学之RSA基础
预备数论知识
互质关系
如果两个正整数,除了1
以外,没有其他公因子,那么就称这两个数是互质关系
比如:4和7,13和61
欧拉函数
思考:任意给定整数n
,在小于等于n
的正整数中,有多少个数与n
构成互质关系?
计算这个值的方法即欧拉函数,以\(φ(n)\)表示
第一种情况:
如果n=1
,则\(φ(n)\)=1
,因为1和任何数互质
第二种情况:
如果n
是质数,则\(φ(n)\)=n-1
;易证
第三种情况:
如果n
是质数的某一次方,即:$$n=p^k \quad(p为质数,k为大于1的整数)$$
则:$$φ(pk)=pk-p{k-1}=pk(1-\frac{1}{p})$$
因为只有当一个数的公因数中不包含质数p
,才可能与n
互质,而包含质数p
的数一共有\(p^{k-1}\)个
第四种情况:
如果n
可以分解为两个质数的整数之积,即:$$n=p_1 * p_2$$
则:$$φ(n)=φ(p_1p_2)=φ(p_1k)φ(p_2k)$$
第五种情况:
任意一个大于1的整数都能够因式分解为一系列质数的乘积:$$n=p_1{k1}p_2{k2}···p_m^{km}$$
即:$$φ(n)=φ(p_1{k1})φ(p_2{k2})···φ(p_m^{km}) $$
即:$$φ(n)=n(1-\frac{1}{p_1})(1-\frac{1}{p_2})···(1-\frac{1}{p_m})$$
欧拉定理
如果两个正整数a
和n
互质,则n
的欧拉函数\(φ(n)\)可以使得下面的等式成立:
\]
也就是说,a
的\(φ(n)\)次方被n
除的余数为1。或者说,a
的\(φ(n)\)次方减去1,可以被n
整除。
假设正整数a
与质数p
互质,因为质数p
的\(φ(p)\)等于p-1
,则欧拉定理可以写成
\]
模反元素
如果两个正整数a
和n
互质,那么一定可以找到整数b
,使得 a*b-1
被n
整除,或者说a*b
被n
除的余数是1。
\]
这个时候b
称之为a
的模反元素
RSA算法
RSA是一种公钥密码算法,简单来说就是:
加密:
密文=明文^E mod N
也就是说RSA的密文是代表明文的数字的E次方求mod N得结果
解密:
明文=密文^D mod N
对密文得数字得D次方求mod N就可以得到明文
例:现在Alice
要向Bob
发送信息
选择两个质数
p=63
,q=71
计算
n=p*q=4473
计算
L=lcm(p-1,q-1)
,L是(p-1)
和(q-1)
的最小公倍数,所以求得L=2170
选择一个随机整数\(e (1<e<L)\),并且\(e和L互质\),也就是要找出满足
gcd(e,L)=1
得数e
,也就是e
和L
的最大公约数为1,可以使用伪随机生成器,通过伪随机生成器在1<e<L
得范围内生成e
得侯选数,然后判断是否满足gcd(e,L)=1
,求最大公约数可以使用欧几里得的辗转相除法。这里选
e=13
计算\(e对L的模反元素d\),即\(e*d \equiv1(mod \quad L)\)
即:\(e*d-1=k·L\)
解方程:\(13x-2170y=1\),其中
x
和y
为整数
def ext_euclid(a,b):
d=b//a+1
while(d>0):
if (a*d-1)%b==0:
k=(a*d-1)//b
print("d=%d,k=%d"%(d,k))
d=0
else:
d+=1
if __name__ == '__main__':
ext_euclid(13,2170)
最后求得:(167, 1),所以得到d=167,k=1
将
(e,n)和(d,n)
封装成公钥和私钥,即公钥(13,4473)和私钥(167,4473)明文:
m
(m<n,且为整数),这里假设m=55
,密文为c
\[m^e\equiv c( mod \quad n)
\]即55的13次方除以4473的余数等于
c
,:\[55^{13}\equiv c(mod \quad4473)
\]
得到:c=3331
解密信息
\[c^d \equiv m(mod\quad n)
\]即
m
等于3331的2003次方除以4473的余数:\[3331^{167} \equiv m(mod \quad 4473)
\]求得:
m=55
对RSA的攻击
破译者能够获取的信息:密文(m)、公钥(e,n)
破译者不知道的信息:明文(c)、私钥中的(d)、q、p、L
解密过程如下,也就是说我们只要嫩巩固获得D
,那么就能破译密文了
明文=密文^D mod N
暴力破解获得 D
在有限的时间和有限的计算能力下,只要D的长度在安全范围内,难以实现;
通过e
和n
求出D
e*D mod L=1
要想获得D的值,就得知道L的值是多少
L=lcm(p-1,q-1)
然后得知道p
和q
的值
N=p*q
所以只要能够对N
进行因数分解求出p
和q
,也就能够破译密文了
而目前还未能够有发现对大整数进行质数因数分解的高效算法,目前已知能够分解的最大长度为768位。
中间人攻击
中间人攻击就是主动攻击者混入真正的发送者和接收者之间,对发送者伪装成接收者,对接收者伪装成发送者。
参考:
《图解密码技术》:https://item.jd.com/11942019.html
阮一峰的网络日志:http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
密码学之RSA基础的更多相关文章
- 【密码学】RSA密钥长度、明文长度和密文长度
本文介绍RSA加解密中必须考虑到的密钥长度.明文长度和密文长度问题,对第一次接触RSA的开发人员来说,RSA算是比较复杂的算法,天缘以后还会补充几篇RSA基础知识专题文章,用最简单最通俗的语言描述RS ...
- 【密码学】RSA算法过程-求解密钥
1.密钥的计算获取过程 密钥的计算过程为:首先选择两个质数p和q,令n=p*q. 令k=ϕ(n)=(p−1)(q−1),原理见2的分析 选择任意整数d,保证其与k互质 取整数e,使得[de]k=[1] ...
- 【密码学】RSA公钥密码体制
RSA公钥密码体制是美国麻省理工学院(MIT)的三位科学家Rivest.Shamir.Adleman于1978年提出的,简称RSA公钥秘密系统.实际上,RSA稍后于MH背包公钥密码实用系统,但它的影响 ...
- 【密码学】RSA算法原理
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密. RSA的算法涉及三个参数,n.e1.e2. 其中,n是两个大质数p.q的积,n的二进制 ...
- 【密码学】RSA加密 kotlin实现方法(支持任意字节长度)
这个编辑器不支持kotlin,尴尬了···· 算了,就用Java来弄吧 val 定义常量 var 定义变量 具体kotlin的开发手册详见:http://www.runoob.com/kotlin/k ...
- 跨越千年的RSA算法
转载自http://www.matrix67.com/blog/archives/5100 数论,数学中的皇冠,最纯粹的数学.早在古希腊时代,人们就开始痴迷地研究数字,沉浸于这个几乎没有任何实用价值的 ...
- HTTPS 为什么更安全,先了解一下密码学的这些原理
HTTPS 是建立在密码学基础之上的一种安全通信协议,严格来说是基于 HTTP 协议和 SSL/TLS 的组合.理解 HTTPS 之前有必要弄清楚一些密码学的相关基础概念,比如:明文.密文.密码.密钥 ...
- Java 密码学算法
Java 密码学算法 候捷老师在< 深入浅出MFC 2e(电子版)>中引用林语堂先生的一句话: 只用一样东西,不明白它的道理,实在不高明 只知道How,不知道Why,出了一点小问题时就无能 ...
- 你也可以手绘二维码(二)纠错码字算法:数论基础及伽罗瓦域GF(2^8)
摘要:本文讲解二维码纠错码字生成使用到的数学数论基础知识,伽罗瓦域(Galois Field)GF(2^8),这是手绘二维码填格子理论基础,不想深究可以直接跳过.同时数论基础也是 Hash 算法,RS ...
随机推荐
- shell 根据路径获取文件名和目录
path=/dir1/dir2/dir3/test.txt echo ${path##*/} 获取文件名 test.txtecho ${path##*.} 获取后缀 txt #不带后缀的文件名temp ...
- 因为看见,所以发现:QBotVariant谢绝落幕
互联网给人带来便捷的同时,其公开大量的资源也同样给恶意利用者带了便捷,越来越多公开的恶意程序源码降低了对外攻击.入侵的难度,使得安全问题愈加严重. 阿里云安全团队从今年5月份监测到一BOT家族,其样本 ...
- 微信小程序 摇一摇
本次案例是有一点像微信的那个摇一摇但是没有那么好看,一些APP也有看到摇一摇功能. 小程序虽然没有提供摇一摇API接口,但是也一个加速器API ,加上搜索一些大神的资料,我这里就做了一个dome, ...
- PostgreSQL的约束
约束类型:检查约束.非空约束.唯一约束.主键.外键 1. 检查约束 设置某个字段里的数值必须满足约束表达式的条件. 例:限制人的年龄在0~120之间,语句如下: create table perso ...
- 《ArcGIS Runtime SDK for .NET开发笔记》--在线编辑
介绍 ArcGIS可以发布具有编辑功能的Feature Service.利用Feature Service我们可以实现对数据的在线编辑. 数据制作参考: https://server.arcgis.c ...
- linux shell unzip multiple zip files
find . -name "*.result.zip" | xargs -n 1 unzip - -P password -d ../ext_logs
- 泛微oa系统com.eweaver.base.DataAction文件sql参数sql注入
URL/ServiceAction/com.eweaver.base.DataAction?sql=select%201,2,3,4,5,6,7,8,9,233%20from%20DUAL%20
- promise的基本用法
// Promise 对象,可以保存状态 //Promise 第一步 // 异步代码 写在 Promise的函数中 第二步 const promise = new Promise((resolve, ...
- 把我坑惨的一个MySQL双引号!
来源:For DBA www.fordba.com/mysql-double-quotation-marks-accident.html 一.前言 最近经常碰到开发误删除误更新数据,这不,他们又给我找 ...
- python+tushare获取上市公司财务报表:资产负债表
接口:balancesheet 描述:获取上市公司资产负债表 积分:用户需要至少500积分才可以调取,具体请参阅本文最下方积分获取办法 注:tushare包下载和初始化教程,请查阅我之前的文章 提示: ...