密码学是研究编制密码和破译密码的技术科学。在现代特别指对信息以及其传输的数学性研究,常被认为是数学和计算机科学的分支,和信息论也密切相关。html
在这里简述一下密码学的发展历史。算法
在1976年之前,全部的加密方法都是同一种模式:加密、解密使用同一种规则(密钥)。在交互数据的时候,彼此通讯的双方就必须将规则告诉对方,不然无法解密。这种加密方式被称为 对称加密算法(symmetric encryption algorithm)。安全
1976年,两位美国计算机学家 迪菲(Whitfield Diffie)、赫尔曼(Martin Hellman) 提出了一种创建密钥的方法,其产生的密钥可用于加密、密钥管理或任何其它的加密方式。这被称为“迪菲赫尔曼密钥交换”算法,简称 D-H算法。D-H算法启发了其余科学家。人们意识到,加密和解密可使用不一样的规则,只要这两种规则之间存在某种对应关系便可,这样就避免了直接传递密钥。bash
1977年三位麻省理工学院的数学家 罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir) 和 伦纳德·阿德曼(Leonard Adleman) 一块儿设计了一种算法,能够实现非对称加密。(所谓非对称,就是指该算法须要一对密钥,即公钥(public key) 和 私钥(private key),且两密钥不一样,使用其中一个加密,则须要用另外一个才能解密)。这个算法用他们三我的的名字命名,叫作 RSA算法。网络
RSA算法的影响是巨大的,绝不夸张地说,只要有计算机网络的地方,就有RSA算法。这种算法很是可靠,密钥越长,它就越难破解。函数
接下来,咱们须要学习几个数学概念,这有助于咱们理解RSA加密算法。学习
即求余运算,是在整数运算中求一个整数A除以另外一个整数B的余数的运算,且不考虑运算的商。在计算机程序设计中也有mod运算,其格式为: mod(A, B),便是两个数值做除法运算后的余数。ui
注意:加密
- 当A、B为同号时,即同为正整数或负整数时,mod运算与咱们熟悉的%运算相同,可看成是%运算;
如,3 mode 17 = 3 % 17 = 3;-5 mod -3 = -5 % -3 = -2- A、B异号时,mod运算与%运算不一样,在这里不做详细赘述,感兴趣的同窗可自行查阅相关资料。
若是两个正整数,除了1以外,没有其它公因数,咱们就称这两个数存在互质关系,即这两个数互质。
关于互质关系,不可贵到如下几个结论:spa
- 任意两个 不一样的质数 互质。好比11和23互质,11和11不互质。
- 一个是质数,另外一个只要不是前者的倍数,二者就构成互质关系。好比5和12互质。
- 一个质数与任意一个比它小的数互质。好比11和8。
- 1和任意一个大于1的天然数互质。好比1和99。
- p是大于1的整数,则p和p-1互质。好比10和9。
注意: 两个正整数互质,意思是这两个整数存在互质关系,即没有1以外的其它公因数,并不意味着这两个数是质数。好比9和10互质,可是9和10均为合数。
对于一个正整数n,小于n且和n互质的正整数的个数,计算这个值的方法叫作欧拉函数,记作:φ(n)。欧拉函数通式为
其中,p1、p2、...、pk为n的质因数。
如12=2*2*3,2和3为12的质因数,则φ(12)=12*(1-1/2)(1-1/3)=4。 关于欧拉函数,一样有几个推论:
- 特别声明,若是n=1,则φ(1)=1,由于1与任何数(包括它自己)造成互质关系。
- 当n是质数的时候,φ(n)=n-1。如φ(7)=6,即一、二、三、四、五、6均与7互质。
- 若是n能够分解成两个互质的整数之积,如n=a*b,则φ(n)=φ(a)*φ(b)。 如φ(56)=φ(7)*φ(8)=24; 注意,φ(49)≠φ(7)*φ(7) => φ(49)≠36,由于7与7不互质。事实上,φ(49)=42。
- 由2和3能够获得,若是n=a*b,且a、b均为质数,则φ(n)=(a-1)*(b-1)。如φ(35)=φ(5)*φ(7)=24;
- 若是n=pk(其中p为质数,k为大于1的整数),则φ(n)=φ(pk)=pk-pk-1=(p-1)pk-1。如φ(49)=φ(72)=(7-1)*71=42。
欧拉定理指的是,若是两个互质的正整数m和n,那么m的φ(n)次方减去1,能够被n整除。即,
如7和3互质,7φ(3) mod 3 = 72 mod 3 = 1
- 费马小定理:当n为质数的时候,则有 mn-1 mod n ≡ 1
- 欧拉定理是RSA算法的核心,理解了这个定理,就理解了RSA算法。
若是两个正整数m和n互质,那么必定能够找到整数d,使得md-1能被n整除,那么d就是m相对于n的模反元素。即
由上式,可得 d=(kn+1)/m。
欧拉定理能够证实上式。因为m和n互质,那么m和n必知足欧拉定理,即 mφ(n) mod n ≡ 1, 令d=mφ(n)-1,即得证!
如,3和5互质,当,k为大于等于1的整数,不难求出当k=4时,获得d=3,即3(d)就是11(e)相对于8(x)的一个模反元素。
介绍完以上几个数学概念,咱们详细介绍一下RSA加密算法。
RSA使用不一样的加密密钥与解密密钥,是一种“由已知加密密钥推导出解密密钥在计算上是不可行的”密码体制。其原理是基于大数难以分解,即两个大素数相乘容易,但逆向获得一个由两个大质数相乘获得的更大数的因子则很困难。除了暴力破解,目前尚未其它有效的方法。换而言之,RSA加密算法的可靠性,取决于对极大整数作因式分解的难度。假若有人找到一种快速因数分解的算法(或者量子计算机技术快速发展?),那么RSA的可靠性就会极度降低。但就目前而言,1024位RSA基本安全,2048位是极其安全的。
举例来讲,你能够对33进行因式分解(3*11),可是你无法对下面这个整数进行因式分解
12301866845301177551304949
58384962720772853569595334
79219732245215172640050726
36575187452021997864693899
56474942774063845925192557
32630345373154826850791702
61221429134616704292143116
02221240479274737794080665
351419597459856902143413
复制代码
它等于这样两个质数的乘积:
33478071698956898786044169
84821269081770479498371376
85689124313889828837938780
02287614711652531743087737
814467999489
×
36746043666799590428244633
79962795263227915816434308
76426760322838157396665112
79233373417143396810270092
798736308917
复制代码
咱们经过一个例子,来理解RSA加密算法。假如甲和乙两人进行通讯。其流程以下:
- 甲选择两个不相等的质数p和q,甲选择了3和11,即p=3,q=11。
注意:实际应用中,这两个质数越大,就越难破解。- 甲计算获得p和q的乘积n,即n=33
n的长度就是密钥长度,33写成二进制是100001,一共有6位,因此这个密钥是6位。- 甲计算n的欧拉函数φ(n),获得φ(n) = (p-1)(q-1) = 20
- 随机选一个整数e,知足1 < e < φ(n),且e与φ(n)互质。甲选择了13。
- 再计算e相对于φ(n)的模反元素d。将e、φ(n)代入公式ed=kφ(n)+1,获得13d=20k+1,此二元一次方程能够用 “扩展欧几里得算法” 求解,此处省略过程。总之,甲算出一组整数解为(d,k)=(17,11),即d=17
- 将n和e封装成公钥,n和d封装成私钥。即公钥是(33,13),私钥是(33,17) 注意:实际应用中,公钥和私钥的数据都采用 ASN.1 格式表达。
上述步骤共出现6个数字:p:三、q:十一、n:3三、φ(n):20、e:1三、d:17。其中,公钥用了两个,即(n和e),其他四个数字不公开。这些数字中最关键的是d,由于n和d组成了私钥,一旦d泄露,就等于私钥泄露。
讨论:在已知公钥(n,e)的状况下,推导d
因为d是e相对于φ(n)的模反元素,知足ed mod φ(n) ≡ 1,要想求出d,必须知道e和φ(n)。
又由φ(n) = (p-1)(q-1),只有知道p和q,才能求出φ(n)。
而n = pq,只有将n因式分解,才能算出p和q。
结论:若是n能够被因式分解,d就能够算出,也就意味着私钥被破解。所以,RSA加密算法的可靠性,取决于对极大整数作因式分解的难度。
有了公钥和私钥,就能够进行通讯了。
- 假设乙要向甲发送信息m,他须要用甲的公钥(n,e)即(33,13)对m进行加密,获得密文c。加密规则为:me mod n ≡ c,假设m为6,则c=18。因而,乙将18发给了甲。
- 甲收到了乙发送过来的信息,即18,也就是c的值,并用本身的私钥(n,d)即(33,17)进行解密。解密规则为:cd mod n ≡ m,即m=6。所以,甲知道了乙发送过来的原文是6。
至此,“加密-解密”的过程就完成了。
思考:为何解密规则是 cd mod n ≡ m ?
根据加密规则 me mod n ≡ c,获得 c ≡ me - kn
将其代入咱们要证实的解密规则,可获得:
(me - kn)d mod n ≡ m
它等同于证实: med mod n ≡ m
又因为d为e相对于φ(n)的模反元素,故ed mod φ(n) ≡ 1,即ed = k*φ(n)+1,将ed代入上式得:
mkφ(n)+1 mod n ≡ m,(k为大于等于1的整数)
所以,上式得证则解密规则成立!
在此,咱们再梳理一下加-解密过程当中的这几个数字:p:三、q:十一、n:3三、φ(n):20、e:1三、d:1七、明文m:六、密文c:18。
- n为两个质数p和q的乘积,则n与以上除了p、q、n以外的任意数互质。(实际运用中,p和q为大质数,从而保证了n被破解的难度很大);
- e知足1 < e < φ(n),而且与φ(n)互质,d为e相对于φ(n)的模反元素,即
ed=kφ(n)+1
接下来,分红两种状况证实解密。
- 根据欧拉定理,mφ(n) mod n ≡ 1
- 因为
1^k≡1
和1*m≡m
,对两边表达式进行k次幂运算后,再各乘以m,获得 mkφ(n)+1 mod n ≡ m,得证!- 即m和n互质时,解密规则成立。
- 因为n为两个质数(p和q)的乘积,故m必为其中一个质数的倍数,在此取
m=kp
。- 根据欧拉定理,有 (kp)φ(q) mod q ≡ 1
- 因为
1^[hφ(p)]≡1
和1*(kp)≡kp
,获得 (kp)hφ(n)+1 mod q ≡ kp- 又
ed=kφ(n)+1
,代入上式可得 (kp)ed mod q ≡ kp,故 (kp)ed ≡ tq + kp(思考t和p的关系)
t和p的关系:由上式获得 (kp)ed mod t ≡ kp ,显然,t必然能被p整除,即t=t'p
。- 所以,(kp)ed ≡ t'pq + kp,因为
m=kp
和n=pq
,因此 med mod n ≡ m,得证!即,m和n不互质时,解密规则也成立!
综上,不管明文m是什么内容,都能经过加密规则:me mod n ≡ c 生成密文c,再由解密规则:cd mod n ≡ m 获得明文m。
经过对RSA算法原理、流程的验算分析,不可贵出如下几个结论:
- RSA算法不须要进行密钥传递,安全性高。
- RSA算法的加密解密效率不高,通常应用于处理小数据。
如加密KEY、数字签名等。
讲了半天RSA算法的理论知识,是时候展现真正的技术了。接下来,咱们用终端来玩一下RSA吧。
因为Mac系统内置OpenSSL(开源加密库),因此咱们能够直接在终端上使用命令来玩RSA。
OpenSSL中RSA算法的经常使用指令主要有三个:genrsa,生成并输入一个RSA私钥
rsautl,使用RSA密钥进行加密、解密、签名和验证等运算
rsa,处理RSA密钥的格式转换问题。
操做流程以下:
openssl genrsa -out private.pem 1024
复制代码
结果以下:
openssl rsa -in private.pem -text -out private.txt
复制代码
自行打开private.txt文件便可,这里不做文件内容说明。
openssl rsa -in private.pem -pubout -out public.pem
复制代码
结果以下:
假设明文文件内容是
对明文文件进行 公钥加密 和 私钥解密
经过公钥进行加密
openssl rsautl -encrypt -in message.txt -inkey public.pem -pubin -out enc.txt
复制代码
经过私钥进行解密
openssl rsautl -decrypt -in enc.txt -inkey private.pem -out dec.txt
复制代码
结果以下:
注意:也可用 私钥加密 和 公钥解密,如:
1). 经过私钥进行加密
openssl rsautl -sign -in message.txt -inkey private.pem -out enc.txt
2). 经过公钥进行解密
openssl rsautl -verify -in enc.txt -inkey public.pem -pubin -out dec.txt