RAS数学原理
密码学
概念
- 密码学是指研究信息加密,破解密码的技术科学。密码学的起源可追溯到2000年前。而当今的密码学是以数学为基础的。
发展历史
- 密码学的历史大致可以追溯到两千年前,相传古罗马名将凯撒大帝为了防止敌方截获情报,用密码传送情报。凯撒的做法很简单,就是对二十几个罗马字母建立一张对应表。这样,如果不知道密码本,即使截获一段信息也看不懂。
- 从凯撒大帝时代到上世纪70年代这段很长的时间里,密码学的发展非常的缓慢,因为设计者基本上靠经验。没有运用数学原理。
外面的一圈是秘文, 中间的一圈是明文。 * 破解方式: * 拿到密码本 * 统计字母出现的频率
- 在1976年以前,所有的加密方法都是同一种模式:加密、解密使用同一种算法。在交互数据的时候,彼此通信的双方就必须将规则告诉对方,否则没法解密。那么加密和解密的规则(简称密钥),它保护就显得尤其重要。传递密钥就成为了最大的隐患。这种加密方式被成为对称加密算法(symmetric encryption algorithm)
- 对称加密密钥的保护非常重要
- 1976年,两位美国计算机学家迪菲(W.Diffie)、赫尔曼( M.Hellman )提出了一种崭新构思,可以在不直接传递密钥的情况下,完成密钥交换。这被称为“迪菲赫尔曼密钥交换”算法。开创了密码学研究的新方向
- 迪菲赫尔曼密钥交换目的是为了保护密钥
- 1977年三位麻省理工学院的数学家 罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起设计了一种算法,可以实现非对称加密。这个算法用他们三个人的名字命名,叫做RSA算法。
RSA数学原理 难点
离散数学问题
-
思考题一:加密容易,破解很难数学运算?
- 方案 取模运算 也叫时钟算数
- 比如时钟是1到12, 共12格, 有一根绳子长13格, 绕着时钟转1圈,余出1个格子。如果绳子的长度是14格,绕着时钟转1圈,余出2个格子。 这就是取模运算早期的算法。
-
质数 只有1和自己可以被整除
- 如果使用质数做模数,比如17;
- 再找一个比17小的数字,比如3
- 3的n次方模上17 就会出现下面这张表。会发现等号右边的结果都不一样,3的1到16次方的结果都会落到1到16
- 使用python计算的结果
>>> 3**1%17 3 >>> 3**2%17 9 >>> 3**3%17 10 >>> 3**4%17 13 >>> 3**5%17 5 >>> 3**6%17 15 >>> 3**7%17 11 >>> 3**8%17 16 >>> 3**9%17 14 >>> 3**10%17 8 >>> 3**11%17 7 >>> 3**12%17 4 >>> 3**13%17 12 >>> 3**14%17 2 >>> 3**15%17 6 >>> 3**16%17 1 >>> 3**17%17 3 >>> -
将3称为17的原根
-
3的n次方模以17,结果就会落到1到16之间, 但是知道结果,反推出n的值是比较麻烦的。比如结果是12,并且也知道算法,但是反推n的值.n会有多个值,12、29等,然后一个一个的去尝试
-
那个一数字变大会加大反推的难度?17 质数变大会加大反推的难度。如果质数是长度是几百位的,想要反推回来几乎不可能。这就被称为离散对数问题
欧拉函数φ
互质关系
- 如果两个正整数,除了1以外,没有其它公因数,我们就称这两个数是互质关系
- 比如3和5 3和7 5和6
欧拉函数
- 任意给定一个正整数n, 请问在小于等于n的正整数之中,有多少个与n构成互质关系?
- 计算这个值的方式叫做欧拉函数,使用:Φ(n)表示 如: 计算8的欧拉函数,和8互质的 1、3、5、7 φ(8) = 4 计算7的欧拉函数,和7互质的 1、2、3、4、5、6、7 φ(7) = 6 计算56的欧拉函数 φ(56) = φ(8) * φ(7) = 4 * 6 = 24
欧拉函数特点
- 一、当n是质数的时候,φ(n)=n-1。
- 二、如果n可以分解成两个互质的整数之积,如n=A*B, 则φ(A*B)=φ(A)* φ(B)
- 三、根据以上两点得到:如果N是两个质数P1 和 P2的乘积则 φ(N)=φ(P1)* φ(P2)=(P1-1)*(P2-1)
根据欧拉函数的特点,计算56的欧拉函数 φ(56) = φ(8) * φ(7) = 4 * 6 = 24 φ(35)= φ(5)* φ(7)= 4 * 6 = 24
欧拉定理
- 如果两个正整数m和n互质,那么m的φ(n)次方减去1,可以被n整除。
费马小定理
- 欧拉定理的特殊情况:如果两个正整数m和n互质,而且n为质数!那么φ(n)结果就是n-1。
公式转换
迪菲赫尔曼密钥交换
- 服务端取一个随机数 3^15 mod 17 = 6 15就是随机数,15只有服务器知道
- 将6传给客户端 三方可以窃取到6
- 客户端用同样的算法 3^13 mod 17 = 12,取一个随机数 13
- 将12发送给服务器 三方可以窃取到12
- 客户端拿到服务端发送的6 6^13 mod 17 = 10
- 服务端拿到客户端发送的12 12^15 mod 17 = 10
- 客户端和服务端都会得到10 服务端和客户端想交换的数字是10
原理
RSA的诞生
- m和n既要互质, 又要m是n的原根
- 公钥 n和e一起是公钥
- 私钥 n和d一起是私钥
RSA算法
RSA终端命令
-
由于mac系统内置OpenSSL(开源密码库), 所以我们可以直接在终端使用命令来玩RSA。OpenSSL中RSA算法常用指令主要有三个
命令 含义 genrsa 生成并输入一个RSA私钥 rsaatl 使用RSA密钥进行加密、解密、签名和验证等运算 rsa 处理RSA密钥的格式转换等问题 -
生成RSA私钥, 密钥的长度为1024bit
openssl genrsa -out private.gem 1024
-
从私钥中提取公钥
openssl rsa -in private.gem -pubout -out public.gem
PS: 公钥比私钥小很多
- 生成的文件如下
-
将私钥转换成为明文
// 转化为明文信息 openssl rsa -in private.gem -text -out private.txt // 查看文本信息 cat private.txt -
通过公钥加密数据, 私钥解密数据
// 生成明文文件 vi message.txt // 查看文件内容 cat message.txt // 通过公钥加密数据 openssl rsautl -encrypt -in message.txt -inkey public.gem -pubin -out enc.txt // 通过私钥解密数据 openssl rsautl -decrypt -in enc.txt -inkey private.gem -out dec.txt
发现加密之后的文件会变大
-
通过私钥加密数据, 公钥解密数据
// 通过私钥加密数据 也叫签名 openssl rsautl -sign -in message.txt -inkey private.gem -out enc.txt // 通过公钥解密数据 解密变成了签名验证 openssl rsautl -verify -in enc.txt -inkey public.gem -pubin -out dec.txtPS: 私钥加密数据 也叫签名. 公钥解密数据, 解密变成了签名验证 PS: iOS 中使用的是p12和der,p12就是私钥
RSA代码演示 openssl
总结
- 加密算法都是数学知识
- 对称加密 又叫传统加密算法
- RSA非对称加密 (现代加密算法)RSA是三个人的名字
- 原根
- 欧拉函数,欧拉定理(费马小定理)
- 模反元素
- m ^(e * d)mod n ≡ m
- 迪菲赫尔曼密钥交换
- RSA算法
- RSA 拆解两个(大)质数的乘积很难,所以RSA相对安全
- 加密:M ^ E % N = C
- 解密: C ^ D % N = M
- 密文: C 明文: M
- 公钥: N 和 E
- 私钥: N 和 D
- 条件
- N是由两个很大的质数(P1、P2)相乘得到,为了方便求出φ(N)
- D 是 E (65537) 相对于φ(N)的模反元素
- M < N
PS 什么是填充模式?