整理了 可汗学院公开课:现代密码学 的一些讲解,感觉很有意思。
有兴趣可以去看看原视频
算术基本原理
我们都知道所有数字可分为两类:质数 和 合数 。
如果把数字按螺旋状排列,将质数点亮:
![](https://i-blog.csdnimg.cn/blog_migrate/c2d0dbbd9bb2106cae158ff7fd5d972c.png)
最后会变成这样:
![](https://i-blog.csdnimg.cn/blog_migrate/45a71888bb6face5b533eca53191c1e2.png)
是不是被数字之美惊艳了!
所以 任何数字都能表示为质数之积
- 10 = 2*5
这就是质因数分解
只要给出一个数字所有的质因数,乘起来就能得到原来的数字,这可以当成一种 “ 锁-钥匙 ”: 任何数字有且只有一种质因数分解
公开密钥密码学
颜色的比喻通俗易懂:
![](https://i-blog.csdnimg.cn/blog_migrate/a2bfbfea7bd085e4a2931f94c9166158.png)
- 混合两种颜色得到第三种颜色很容易
- 得到混合色后,想要知道原来的两种颜色就很难
所以,这就是单向函数:朝一个方向容易,朝反方向很难
![](https://i-blog.csdnimg.cn/blog_migrate/4ae708102a2460f280c82336b5803c78.png)
这里解决策略是:
- Alice和Bob共同选择一个公共颜色,分别选择一个私有颜色
- 将各自的私有颜色与公共颜色混合,传到对方手中
- 再将自己的私有颜色混合到传过来的颜色中
- 就得到了共同的秘密颜色。
离散对数问题
首先引入模运算,又叫时钟运算。
这就是一个单向函数。
![](https://i-blog.csdnimg.cn/blog_migrate/85473a56b9c9b81140fe7c37454ccc17.png)
根颜色比喻一样:
例如 3 ^ x mod 17 = y
- 已知 x 可以很容易得出 y
- 但已知 y 要推出x很困难
单向函数的强度取决于反向过程所需要的时间
迪菲·赫尔曼密钥交换
上述问题的解决策略时:
- Alice和Bob共同选择一个公共质模数和生产元,比如 3 mod 17
- 随机选择各自的私有数字,比如 Alice 15, Bob 13
- Alice 计算 315 mod 17 = 6, 并将结果 6 传给 Bob
Bob 计算 313 mod 17 = 12,并将结果 12 传给 Alice - Alice 计算 1215 mod 17 =10
Bob 计算 613 mod 17 =10 - 10 就是他们的共同密钥
虽然选取私有数字不同,但双方做了相同的运算:
- Alice:(313 mod 17)15 mod 17 = 313*15 mod 17
- Bob:(315 mod 17)13 mod 17 = 315*13 mod 17
这样第三方Eve没有私有数字,就无法求出结果
RSA加密
以上的策略过程都需要双方拥有共同的密钥,如果一个人与多方建立加密交换,都是不同的密钥,那花费会非常巨大。
所以,1970年英国工程师兼数学家 詹姆斯·艾利斯 提出一个简单而又聪明的想法:
- 公开锁, 钥匙保留在Alice这里
- Alice用钥匙将锁打开,并将打开的锁传给Bob
- Bob将信息放进锁里,并锁起来,传给Alice。
- 这样只有Alice拥有打开锁的钥匙,Eve无法盗取。
关键在于将密钥分为两部分:加密密钥和解密密钥
首先了解 欧拉函数 :小于或等于n的正整数中与n互质的数的数目
比如 8 满足条件的数为 1 3 5 7
所以 φ(8)=4
对于质数:
若m,n互质:
以下就是推导出来的钥匙:(建议看视频理解)
![](https://i-blog.csdnimg.cn/blog_migrate/5964f6c57ad5fca40666b931f41a6e57.png)
举个栗子看看过程:
Alice:
- Alice选择两个随机质数:
p1=53 p2=59
则:n=53*59=3127 φ(n)=3016 - 再选择一个公开小指数 e=3
- 根据以上公式算出(取k=2,用来保证d是整数,可随便取值)
d = (2*3016+1)/3 = 2011 - 把 n=3127 和 e=3 留下,组成公开密钥(开着的锁)
Bob:
- Bob想要加密的数 m = 89
- c = me mod n = 893 mod 3127 = 1394
- 将c传给Alice
Alice:
- m = c d mod n