05-密码学(1)
前言
本篇开始,将给大家介绍密码学
相关的知识点,这也是为后面学习安全攻防
前做的准备,只有了解清楚了加密算法
,你才能知道如何去防止破解
,是吧!本篇文章首先会大致介绍密码学的发展史
,接着会重点介绍RSA加密
算法,包括这个算法推算过程
。
一、密码学
什么是密码学?
密码学
是指研究信息加密
,破解密码
的技术科学。
密码学的起源可追溯到2000年前
,而当今的密码学则是以数学为基础的。
发展历史
相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表
👇
![](https://img.haomeiwen.com/i3444487/7dc710483a95a537.png)
上图就好比一个密码本
,如果不知道密码本
,即使截获一段信息也看不懂
。所以,密码本存在两个问题👇
- 密码本
泄漏
- 如果截取
足够多的密文
可以看字母出现的频率,也可以破解,这就是所谓的暴力破解
从凯撒大帝时代
到上世纪70年代
这段很长的时间里,密码学的发展非常的缓慢
,因为设计者基本上靠经验
,没有运用数学原理。当今的密码学是以数学
为基础的👇
- 在1976年以前,所有的加密方法都是同一种模式:
加密、解密
使用同一种算法
。在交互数据的时候,彼此通信的双方就必须将规则告诉对方,否则没法解密。那么加密和解密的规则(简称密钥(同“月”发音)
),它的保护就显得尤其重要。传递密钥就成为了最大的隐患。这种加密方式被成为对称加密算法 (symmetric encryption algorithm)
- 1976年,两位美国计算机学家
迪菲(W.Diffie)
、赫尔曼( M.Hellman )
提出了一种崭新构思,可以在不直接传递密钥
的情况下,完成密钥交换
。这被称为迪菲赫尔曼密钥交换 算法
。开创了密码学研究的新方向。 - 1977年三位麻省理工学院的数学家
罗纳德·李维斯特(Ron Rivest)
、阿迪·萨莫尔(Adi Shamir)
和伦纳德·阿德曼(Leonard Adleman)
一起设计了一种算法,可以实现非对称加密
。这个算法用他们三个人的名字
命名,叫做RSA算法
。
二、RSA
上世纪70年代产生的一种加密算法。其加密方式比较特殊,需要两个密钥
:公开密钥简称公钥(publickey)
和 私有密钥 简称私钥(privatekey)
。公钥加密,私钥解密;私钥加密,公钥解密
。这个加密算法就是伟大的RSA
。
2.1 RSA数学原理
2.1.1离散对数问题
为什么要提到离散对数
这个概念呢?这个和加解密有什么关系?带着这样的问题,我们一步步来看,最理想的加解密情况应该是这样的 👉 加密简单,解密很难
。怎样才能做到这点呢,首先我们来看看mod
运算👇
mod
运算就是求2个数x
和y
的余数
。
例如:如果用质数17做模数
(17就好比y
),x
是3的幂数
,并且它们的余数
是12,求x
到底是3的几次方
?👇
![](https://img.haomeiwen.com/i3444487/d33b4d09eda9e5ce.png)
接着我们按顺序尝试写出来👇
![](https://img.haomeiwen.com/i3444487/d9cc4ced15ab50f0.png)
最终求得是13
次方。根据上图,我们可以发现一个规律👇
3的n次方mod
17结果
永远在1~16之间
,就好比一个时钟👇
![](https://img.haomeiwen.com/i3444487/2e852512c7d7c2b6.png)
所以mod
运算也称作时钟算法
。
这里的3称作是17的原根
,这里的结果是12
,反推n
的话,需要我们一条条的计算出来,根据穷举求n
。假如模数变大,那么反推破解难度也会变的很大,这个就是离散对数问题
。
2.1.2欧拉函数
欧拉函数概念👇
任意给定
正整数n
,在<= n的正整数
之中,有多少个
与n
构成互质关系
?
互质关系
👇
如果两个正整数,
除了1
以外,没有其他公因数
,就称这两个数是互质关系
(coprime
)。
计算多少个
这个值的方式就叫做欧拉函数
,使用φ(n)
(φ
发音同fai三声
)表示。例如👇
- 计算8的欧拉函数,和8互质的 1、3、5、7
φ(8) = 4 - 计算7的欧拉函数,和7互质的 1、2、3、4、5、6
φ(7) = 6 - 计算56的欧拉函数
φ(56) = φ(8) * φ(7) = 4 * 6 = 24
欧拉函数特点
1.当n是质数的时候φ(n)=n-1。
- 如果n可以分解成
两个互质的整数
之积
,如n=A*B
则👇
φ(A*B)=φ(A)* φ(B)
根据以上两点得到:
如果
N
是两个互质数
P1和 P2的乘积
,则 👉φ(N)=φ(P1)* φ(P2)=(P1-1)*(P2-1)
欧拉定理
如果两个正整数m和n互质,那么m的φ(n)次方减去1,可以被n整除。
![](https://img.haomeiwen.com/i3444487/b7a5d40e81017965.png)
费马小定理
欧拉定理的
特殊
情况 👉 如果两个正整数m和n互质,而且n为质数
!那么φ(n)结果就是n-1。
![](https://img.haomeiwen.com/i3444487/60002c9cd04dd40e.png)
验证:m = 6,n = 5(5是质数) --> 6^4%5
--> 24*24%5
-->24*24
的结果看个位数是6
,6%5 = 1
。
公式转换
接着我们公式转换👇
- 欧拉定理 👉 mφ(n) % n ≡ 1 (m和n互质) ,并且 1k % n ≡ 1,我们在mφ(n) % n ≡ 1 两边各乘以1k👇
![](https://img.haomeiwen.com/i3444487/a37e1670b84d589f.png)
- 我们又知道1*m ≡ m,两边各乘以m,那么👇
![](https://img.haomeiwen.com/i3444487/9f003fcaa3d492c0.png)
⚠️注意:这种情况必须满足2个条件
- m和n互质
- m < n
模反元素
如果两个正整数
e
和x
互质
,那么一定可以找到整数d
,使得 ed-1 被x整除
。此时,d
就是e对于x
的 模反元素
。公式如下👇
![](https://img.haomeiwen.com/i3444487/0c46b881c88af18b.png)
假设商为k
则可以得到以下公式👇
![](https://img.haomeiwen.com/i3444487/9fe8c0edab2617b7.png)
当φ(n) == x
时,那么 e * d = k * φ(n) + 1
,k * φ(n) + 1
熟悉不?👇
![](https://img.haomeiwen.com/i3444487/9f003fcaa3d492c0.png)
是不是就等价于👇
![](https://img.haomeiwen.com/i3444487/7ba3014db1467035.png)
验证:m:4 , n:15, φ(15) = 8
通过模反元素,假设 e:3, d是多少?
8k + 1 = 3d --> d = (8k + 1)/3 --> k = 4 时 d = 11,k=7 时d = 19。
小结
整个推导过程如下图👇
![](https://img.haomeiwen.com/i3444487/3b7b8b7c03f58243.png)
2.1.3 迪菲赫尔曼密钥交换
![](https://img.haomeiwen.com/i3444487/3b533ba10f83c53f.png)
上图是结合之前的例子,将数据的传递过程展示出来,基本分为以下几步👇
-
服务端
取随机数15
(保密,不告诉任何人),315%17得到的结果(6)
发送给客户端
。中间三方可能截获6
-
客户端
取随机数13
(保密,不告诉任何人),313%17得到12
发送给服务端。中间三方可能截获12
-
客户端
拿到服务端
发送的6
进行613%17得到数据10
-
服务端
拿到客户端
发送的12
进行1215%17也能得到10
在这个过程中客户端
和服务端
得到了相同的值10
,单中间第三方截获的是6
和12
,这就是 迪菲赫尔曼密钥交换
。客户端和服务端实际
想交换的是数据10
。
整个过程的原理如下图👇
![](https://img.haomeiwen.com/i3444487/3dd50015dc92cbb5.png)
找到了3和17
的原根
,这个时候就相当于进行了拆分
。
2.1.4 RSA
RSA诞生
通过迪菲赫尔曼密钥交换
拆分了me*d % n ≡ m,如下图👇
![](https://img.haomeiwen.com/i3444487/8accd4d7921caa0f.png)
- 加密:me % n = c
- 解密:cd % n = m
- 公钥:n和e
- 私钥:n和d
- 明文: m
- 密文: c
说明
- n 会非常大,长度一般为
1024
个二进制位。(目前人类已经分解的最大整数,232个十进制位,768个二进制位) - 由于需要求出φ(n),所以根据
欧拉函数
特点,最简单的方式n由两个质数相乘得到 👉 质数p1、p2 👉 Φ(n) = (p1 -1) * (p2 - 1) - 最终由φ(n)得到 e 和 d。
总共生成6个数字:p1、p2、n、φ(n)、e、d
关于RSA的安全
除了公钥
用到了n
和e
, 其余的4个数字
是不公开
的。
目前破解RSA
得到d的方式如下:
- 要想
求出私钥 d
。由于e*d = φ(n)*k + 1
,那么必须要知道e
和φ(n)
-
e
是知道的,但是要得到φ(n)
,必须知道p1
和p2
- 由于
n=p1*p2
。只有将n
因数分解才能算出。
这个时候就需要穷举了,很难破解。
2.2 RSA终端命令
由于Mac系统内置OpenSSL(开源加密库)
,我们可以直接在终端
上使用命令进行RSA
操作。OpenSSL
中RSA
算法常用指令主要有三个👇
-
genrsa
👉 生成并输入一个rsa密钥
-
rsautl
👉 使用rsa密钥
进行加密、解密、签名、验算
等 -
rsa
👉 处理rsa密钥格式转换
问题
示例
- 生成RSA私钥,密钥长度为1024bit👇
openssl genrsa -out private.pem 1024
![](https://img.haomeiwen.com/i3444487/cdc0f3de6e1d6b3e.png)
- 从私钥中提取公钥
openssl rsa -in private.pem -pubout -out public.pem
![](https://img.haomeiwen.com/i3444487/64e4a55145d29cb3.png)
- 将私钥转换成为明文
openssl rsa -in private.pem -pubout -text -out private.txt
打开 private.txt
查看👇
![](https://img.haomeiwen.com/i3444487/2320377b63a3ca8b.png)
-
公钥加密
数据 &私钥解密
数据
加密: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
![](https://img.haomeiwen.com/i3444487/226cd4baba4ed2cd.png)
上图中指令的过程👇
-
vi message.txt
新建message.txt
文件,点击按键 i进入插入模式,输入密码:LGPerson
,再点击Esc按键退出编辑模式,再输入":wq"保存退出 -
cat message.txt
查看message.txt
文件内容,确认密码:LGPerson
写进去了 - 使用公钥
public.pem
进行加密,生成加密文件enc.txt
- 查看加密文件
enc.txt
- 使用私钥
private.pem
解密,生成解密文件dec.txt
- 查看解密文件
dec.txt
再看看文件enc.txt
和文件dec.txt
的大小👇
![](https://img.haomeiwen.com/i3444487/43c4bbdf94db5936.png)
![](https://img.haomeiwen.com/i3444487/4b928bd100a29d21.png)
enc.txt
文件128字节
,dec.txt
文件16字节
。
- 反过来,通过
私钥加密
数据 &公钥解密
数据
这个时候就变成了签名
和验证
了👇
签名:openssl rsautl -sign -in message.txt -inkey private.pem -out sign.txt
验证:openssl rsautl -verify -in sign.txt -inkey public.pem -pubin -out verify.txt
以上生成的所有文件的目录👇
![](https://img.haomeiwen.com/i3444487/06c0974b2c63bcb1.png)
总结
- 加密算法都是数学知识!
- 对称加密(传统加密算法,Key)
- RSA (三个人的名字)非对称加密!(现代加密算法)
-
原根 👉
3^n^ %17 = 12
,求n
,此时3就是17的原根
-
欧拉函数
- 任意给定正整数n,在<= n的正整数之中,有多少个与n构成互质关系
- 特点
- 当
n是质数
的时候φ(n)=n-1
。 - 如果n可以分解成
两个互质的整数
之积
,如n=A*B
则φ(A*B)=φ(A)* φ(B)
- 当
-
欧拉定理 👉 如果两个
正整数m和n互质
,那么m
的φ(n)次方
减去1,可以被n整除
-
费马小定理 👉 如果两个
正整数m和n互质
,而且n为质数
!那么φ(n) = n-1
👉 mn-1 -
模反元素 👉 m(e*d) mod n ≡ m
-
迪菲赫尔曼密钥交换
-
![](https://img.haomeiwen.com/i3444487/4783a9a5fa76e6f6.png)
- RSA算法
- RSA:拆解两个(大)质数的乘积很难!所以RSA相对安全!
- 加密 Me mod N = C ,解密 Cd mod N = M
-
密文 C
,明文 M
,公钥 N 和 E
,私钥 N 和 D
- 条件(总共有6个数字!):
-
N
是由两个很大的质数(P1、P2)
相乘得到! - 为了方便求出
φ(N)
👉φ(N) = (P1-1) * (P2-1)
-
D
是E
相对于φ(N)
的模反元素
-
![](https://img.haomeiwen.com/i3444487/6cef675428a9a062.png)