白话解析 RSA 加密算法的数学原理
从自然数开始,一直讲明白了 RSA 非对称式加密的细节。
前不久 Jason 同学邀请复旦大学数学系的梅同学给希望了解 Web3 的朋友们上了 5 节硬核的数学课。从自然数开始,一直讲明白了 RSA 非对称式加密的细节。我再回顾一下,尝试解释这个其实还挺复杂的事儿。
(前方数学预警,但是我保证努力限制在小学数学知识范围以内)
大数无法分解
3 * 7 算出 21 容易吗?容易。反过来,21 是哪两个数的乘积?也不难,但肯定比算 3 * 7 麻烦。
同理 967 * 379 = 366493 容易。反过来,366493 是哪两个数乘积?难多了。
随着乘积的不断变大,算乘法的难度略微增大,算是这个数是由哪两个数相乘的难度陡峭的增加。
一个一百位数字的数和一百位数字的数相乘,手工算不容易,但对计算机来说不难,结果是一个大约两百位数字的数字。
反过来,把这个 200 位的数字分解?基本上现在能想到的办法就是近似于一个一个的试。别说算乘法了,光从一数到 80 位的数字,按照现在的计算水平,就要消耗掉一个中等恒星一生的能量了。所以,简单结论是,超级大的数字做分解不可能。
就利用这个简单的原理,加上听起来故弄玄虚的欧拉定理,就是一个精妙绝伦的 RSA 加密算法。
n 进制取个位
这个东西的数学名称叫「取模」,就是算「一个数除以 n 以后的余数是几」。
不过我们不用这个名字。我自己发明的一个混杂了数学和计算机的概念,叫做 n 进制取个位。比如 n = 8,八进制下只取个位,超过的十、百、千位数就直接扔掉,那么 15 这个数本来八进制就是 17,只取个位,就是 7。所以,我们规定,15 在八进制个位模式下,就等于 7。同样,23,31 等,在 8 进制取个位下,都等于 7。这个「等于」,不是绝对数字的相等,而是经过了 n 进制取个位,我们用 ≡ 表示这种特殊的等于 (正规说法叫做「模 n 同余」,可以忽略) 。
这样,如果 n 是 4 万公里的话,数字的世界变成像地球一样,是一个循环。在赤道上可以向东走 1 万公里,和向西走 3 万公里结果是一样的,甚至向西走 7 万,11 万,15 万公里的终点是一样的,就是一圈一圈的转就是了。所以 4 万进制取个位, 1 万 ≡ -7 万 ≡ -11 万 ≡ -15 万。注意,毕竟走 7 万公里和走 11 万公里不相等 ( = ),但是在地球赤道上走,他们的效果相等 ( ≡ )。
例子:比如在 20 进制取个位下,3 * 7 的结果就是 1 (本来是 21,结果走过头了, 又绕回来,回到了 1 )。
连着乘两个数就是它本身
这有啥用呢?神奇的事情在于,在 20 进制取个位下,任何数乘以 3 再乘以 7,就相当于乘以 1,就是这个数本身!
比如 12 * 3 = 36 ;36 % 20 = 16; 16 * 7 = 112; 112 % 20 = 12
变回原来了。神奇吗?
在 20 进制取个位下,你把一个数乘以 3,我不用除以 3,而是继续乘以 7 ,就是原来那个数。不仅仅是 7,我把乘 3 的数字乘以 67,127,或者 187。。。。它都会回到原来那个数,只是转的圈数多了些。
这就使得,如果两个数在一个 n 进制取个位下乘积为 1,这两个数不就是一个很好的加密和解密的工具吗?
比如数字大一点,在 366492 进制取个位下,任何数乘以 967 得到的数再乘以 379,就是它本身。
公钥和密钥
如果我把 e = 967 当做公钥,d = 379 当做密钥,我只需要告诉别人( e = 967, n = 366492)这两个数字,别人乘积以后交给我,我再乘以 d ,然后。。。。
不过有一个小问题,如果给出了(e = 967, n = 366492)这两个数,别人除以 e 不就得到了我的秘钥 d 吗?毕竟,你可以算乘法,别人就可以算除法,而且难度差不多。我们把这个办法成为露馅儿加密法。
接下来要做的事情,就是想办法把这自己的密钥藏起来,让别人拿到 n 进制数,还有公钥 e,没有办法算出我的密钥,但是依然可以用 e 加密,我可以用私钥 d 解密不就好了?
欧拉定理
我们引入 φ(n) 。它的定义可厉害了,是「小于 n 的正整数中和 n 互质的数的个数」。这个定义忽略就好,只要知道,如果 n 是两个素数 p, q 的乘积的话, φ(n) = (p-1)(q-1)。
欧拉发现了一个惊天大秘密,居然在 n 进制取个位下,如果 m 和 n 互为质数,m 的 φ(n) 次方 居然等于 1:
m ^ φ(n) ≡ 1
两边都取 k 次方:
m ^ (k * φ(n)) ≡ 1
两边都乘以 m :
m ^ (k * φ(n) + 1) ≡ m
k * φ(n) + 1 是啥意思?就是这是一个「除以 φ(n) 余数为 1 」的数字。也就是说,只要找到 e*d 这两个数,使得他们的乘积除以 φ(n) 余数为 1 就好。这个好找,有一个叫做辗转相除法的方法,不过这里先略过。我们一般常常把 e 固定的设为 65537,然后就可以找到一个满足的 d。
最后,也就是最惊艳的一步,如果我们能够找到这样的 e, d,我们把 e 和 n 告诉整个世界,让他们在 n 进制取个位下,把要加密的数字 m 取 e 次方发给我,我对这个数再进行 d 次方,我就能得到 m。
(m ^ e) ^ d ≡ m
重新梳理
到现在大家应该已经无一例外的晕厥了。这很正常。我们再理一下就清楚了。
就是说,如果我能无论用什么方法,找到一个进制 n,在这个 n 进制取个位下,能够找到两个数字 e 和 d,e 公开给整个世界,d 留给自己,同时还能让任何数字 m 的 e 次方的 d 次方还等于原来这个 m,加密解密算法不就成立了吗?就跟最早我说的那个乘以一个数,再乘以另一个数,总等于原来的数字一样?
但露馅儿加密法两个乘法的算法的明显的漏洞在于,e 和 n 给出了,d 也就给出了。
在这个新的算法中,e 给出了。n 给出了,但 e * d ≡ 1 的进制,不是简单地 n,而是和 n 同源,但是不同的 φ(n) 。正因为进制改了,所以也不能用露馅儿加密法里面的两次乘法,而借用欧拉的惊天发现,做了两次幂运算。
从 n 能不能算出来 φ(n) 呢?如果有能力分解 n 当然 φ(n) 唾手可得,把两个因子各自减一再乘起来就好。
但是从 n 能不能轻易地找到 p 和 q 呢?根据最早的大数不可分解,要想找到 100 个太阳烧掉都不够用,p 和 q 好像是脚手架,算出来 n,算出来 φ(n) 就扔掉了。 那么 φ(n) 就是一个秘密。如果 φ(n) 是个秘密,有了 e 也找不到 d。
所以,整个算法是无比精巧的安全。
举例子
我们找两个脚手架数字:p = 2, q = 7,算出 n = 2 * 7 = 14, φ(n) = (2 - 1) * (7 - 1) = 6 。那两个脚手架数字 p, q 在算出 n 和 φ(n) 后就退休了。找在 6 进制取个位下,e * d ≡ 1 好办,e = 5, d = 11 就行 ( 5 * 11 = 55 = 6 * 9 + 1 ≡ 1)。
这样,公布给全世界的数字就是 (e = 5, n = 14),保留给自己的就是 d = 11。φ(n) 千万也不能告诉任何人。φ(n) 就如同总统,n 如同他的影子。世界只能看到他的影子,看不到总统本人。好在影子在世间行走不怕暗杀,总统躲在防空洞里是安全的。
我们来试一下,在 14 进制个位模式下,如果要传递的数字 m = 2,别人把 m ^ e 算出来,就是 2 ^ 5 = 32 = 2 * 14 + 4 ≡ 4
现在,4 就可以大大咧咧的在互联网上随便传输了。只有我知道有一个秘密是 11 。我拿到以后,算 4 的 11 次方,4 ^ 11 ≡ 4,194,304 % 14 ≡ 2 ,不就是别人要给我的那个数字吗?前提是,我们认为 别人从 n = 14 无法分解成 2 * 7,否则就全露馅了。
14 肉眼可以看出等于 2 * 7。
这个数 n:
8244510028552846134424811607219563842568185165403993284663167926323062664016599954791570992777758342053528270976182274842613932440401371500161580348160559
是 p
91119631364788082429447973540947485602743197897334544190979096251936625222447
乘以 q
90480063462359689383464046547151387793654963394705182576062449707683914045697
计算机眼也看不出来。 p 和 q 如同两位门神,死死的守住了获取它们后面的秘密的入口。但是从 p,q 算出 φ(n) ,以及 e,d,却都是举手之劳。
如果知道 n 的组成是 p,q,我们按照上面的算法可以选出来 e 和 d:
65537
2545549238258797954286678713888152865623498585866759298032549597771444725977268190722532488574321463855938811396613702406984581214587037347197409962813953
也就是说,这个游戏,任何人要把一个数字 m 传给我,只需要在 n 进制取个位下,对它进行 65537 次幂(m ^ 65537),我再把它进行 d 次幂,我就拿回了原来的数字。
这个精巧的算法,就是 RSA 加密算法。
希望有人能够看明白。我真的是尽力了。
原文标题:《用吃奶的劲试着解释加密算法的数学原理》
撰文:王建硕
来源:ForesightNews
Pepe (PEPE) Consolidates Around $10 Billion Market Cap, Could It Run To Over $100 Billion In 2025?
The post Pepe (PEPE) Consolidates Around $10 Billion Market Cap, Could It Run To Over $100 Billion I...
Bloomberg ETF Analyst Hints Dogecoin Spot ETF Filing Under Trump Presidency
The post Bloomberg ETF Analyst Hints Dogecoin Spot ETF Filing Under Trump Presidency appeared first ...
BlackRock Reveals XRP ETF Plans, Ethereum Price Aims For $10,000, As Yeti Ouro Tops Presale Charts With Unique Utility
The post BlackRock Reveals XRP ETF Plans, Ethereum Price Aims For $10,000, As Yeti Ouro Tops Presale...