转https://zhuanlan.zhihu.com/p/24967009
我们在互联网上留下很多秘密,聊天记录、微信密码等等,这些“秘密”我们并不想让别人知道。 但是说来,互联网其实没有秘密。为啥?因为我们要联网,手机连接wifi,wifi是通过路由器,路由器连接外网,而外网也分布着各种的路由设备,我们这些秘密随时都可以被监听到。 2013年爆发的斯诺登棱镜门事件给我们敲响了警钟,我们所处的网络时刻被人监听着。 不过,事实上我们所处的网络环境也还没有这么差,因为我们大多数使用到的服务都是加密传输的,也就是要给我们的发送的内容加一把“锁”,任何人都能看到加密的内容,但是需要一把对应的“钥匙”才能看到实际的内容(也就是明文)。 这样,只要我们把“锁”设计的复杂一些,然后把“钥匙”给接收者就可以了。 事实上,真实的互联网并没有这么简单,因为我们要接触很多不同的人,就像我们的微信上有很多陌生人好友一样,我们不能把“钥匙”就这样都交给这些陌生人好友。为了保险起见,我们需要设计很多“锁”和“钥匙”,然后记住这些锁和钥匙的对应关系,最可怕的是每次建立一个新联系,还要新建一把“锁”,这显然是不可能的。 所以我们需要设计一套简洁的安全来保证在公开的网络和陌生人安全传输加密内容。乍一看,要做到这一点似乎不可能,不过计算机科学家们用数学解决了这个问题。 为了简单讲解这个数学问题,我们设想一个颜料混合的游戏,“传输内容”转化成“传输颜料”。 现在假设我、张三和李四呆在一个房间内,每个人都有大量不同的颜料桶,而且都有相同的颜色的颜料选择。 这个游戏的规则就是,我们三个人分别站在房屋的不同角落的小隔间内,每个人都可以在别人看不到的情况下混合颜料。这时候,我要给李四“沟通”,也就是传送颜料,然后放在房屋中间,每个人都可以看到我要传送的颜料,我们假设放在房屋中间的颜色可以被复制很多份,李四只要拿走颜料就相当于了解我要说的“内容”,当然张三也能看到我要做的颜料。 这种情况就很像我们生活中的互联网了,有秘密但是秘密传输在公开的渠道上,每个人都有可能得到传送信息的相同备份。 游戏规则分为四步: 1. 我和李四各自选择一中“私人颜料”,因为颜色太多了,我和李四选择同一种颜色可能基本为零。 2. 选择新的一种不同于“私人颜料”的颜料,并且公开宣布,我们称之为“公开颜料”,也就是每个人都可以知道我有什么“公开颜料”。 3. 我和李四沟通时,只要各自选择一桶公开颜料和一桶私人颜料混合然后放在房屋中间就可以了。我们传送信息也就是传送的“公开-私人混合颜料”。这个颜料每个房间内的人都能得到相同的复制。这种混合操作对于一个人而言基本是不可逆的单向操作。我们很容易混合了颜料,但是很难再把颜料分开。 4. 李四得到我的“公开-私人混合颜料”的时候,然后加入自己的“私人颜料”。而我也重复相同的步骤,这样子我和李四得到相同的混合颜料。而张三只知道我和李四各自的公开颜色和我们的混合颜色,无论如何,张三也不可能得到我和李四看到共同的混合颜料。 当然张三可以猜测,不断重复的试错,计算机科学称之为“暴力破解”,不过张三需要更多的体力和时间破解我们可能过时的信息,这对于张三而言实在得不偿失。 看到这里,你就明白“公钥加密”算法的核心了,因为计算机传输的是二进制编码,混合颜料也就变成了混合数字,尽量让加密的过程不可逆的就是公钥加密的核心。混合颜料的4个步骤也就变成了混合数字。 为了简单解释这个过程,我们假设所有人只会乘法不会除法。当然这个假设非常不合理,我们会在最后面解释公钥加密的核心。 1. 每个人各自选择一个私人数字,当然数字重复的可能性也很低,假设我选择4,李四选择8。 2. 我和李四各自一个公开数字,每个人都能看到,假设我和李四达成一致选择5。 3. 我和李四传输信息想混合颜料一样,我把信息,也就是(4×5=)20放到房屋中间,李四把(8×5=)35放到中间。 4. 再次说明,我们假设每个人都不会除法。那么我和李四就能得到相同的数字700,而张三因为不会除法,或者很难用除法得到我和李四相同的数字。 这基本就是公钥加密算法的核心。 如果你对公钥加密算法的核心如何让数字混合尽可能不可逆感兴趣,那么你可以继续往下看。 如果要理解这个不可逆过程,我们需要理解三个基本的数学概念——质数和钟算以及幂运算。 在大于1的自然数中,除了1和它本身以外不再有其他因数的数称为质数,其它的称之为合数。任何一个合数都可以用几个不同的质数相乘得到,比如30=2×3×5。质数还有有个特点就是分布基本没有任何规律,人们通过超级计算机也没得到质数的分布规律,钟大小我们一般去质数,这样子钟算的结果就没有规律的分配在每个位置了。 钟算就是求余计算,指一个数除以另一个数,不够除的部分就是余数的过程,5÷3=1余2,2就是结果,这里的3我们称之为钟大小。 幂运算,举个例子,写下6 × 6 × 6 × 6不同的是,你可以写成6^{4} ,这就是指6乘以本身4次,这里的6我们称之为基数。 我们做一张钟算表,每个人都能简单的得出来这张表 n 2^{n} 3^{n} 6^{n} 1 2 3 6 2 4 9 3 3 8 5 7 ....(省略4~10的钟算,需要注意的是每一个钟算结果都没有任何规律的分布着) 类似之前的过程,还是四步 1. 每个人各自选择一个私人数字,当然数字重复的可能性也很低,假设我选择8,李四选择9,分别作为指数。 2. 我和李四各自一个公开数字,不过我们这时达成一致,都选择11作为钟大小,2作为基数。 3. 我和李四传输信息,我把钟算结果,也就是3放到房屋中间,李四把6放到房屋中间。 我:2^8%11=3;李四:2^9%11=6。百分号就是求余计算,这个计算根据表格能轻松得到。 4. 混合信息,我和李四把对方的对方的钟算结果作为基数,各自的私人数字为基数再做一次计算,那么我们就得到相同的数字为4,同样的张三实际上也很难获得相同的数字。 我:(2^8%11)^9%11=4;李四:(2^9%11)^8%11=4; 第4步,很多都很困惑,钟算和指数运算有个规律。 比如说,2的3次方的2次方等于2的6次方,也就是指数相乘,对于钟算根部不影响指数的运算。 也就是说上述公式可以转化为: 我:(2^8)^9%11=4;李四:(2^9)^8%11=4; 为了举例我们把钟大小和私人数字、公开数字设置的很小,实际上的公钥加密数字特别大,并且都选择了质数。 有个规律就是,两个质数的乘积很容易,但是合数的质因数分解就很难了,把私人数字和公开数字设置为很大的质数,这样看起来就是加密很简单,解密很难。 当然实际上,还远不止这么简单,足够安全的底层技术也是区块链被赞为下一代互联网基础设施的一大原因。 在区块链技术中许多曾经被认为是冗余设计的错误,后来被证明都是正确的,比如精心挑选的Koblitz曲线,避开了美国国安局在加密标准中暗藏的后门。比如在椭圆曲线数字签名算法加密的基础上,再哈希两次,足以应付量子计算机的威胁… 公钥加密算法,就是比特币区块链技术所使用的加密算法的一种,就是这样的技术保护着我们的隐私。