加密的那些事原创
序言
不论是前端还是后端开发中,数字签名、信息加密是经常需要使用到的技术,应用场景包括了用户登入、交易、信息通讯、OAuth 等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的 签名加密算法 来达到业务目标。
# 历史上的密码
早在古罗马时期,加密算法就被应用于战争当中。 在大规模的战争中,部队之间常常需要信使往来,传递重要的军事情报。
可是,一旦信使被敌军抓获,重要的军事情报就完全暴露给了敌方。
甚至,狡猾的敌人有可能篡改军事情报,并收买信使把假情报传递给我方部队。
# 凯撒密码
传送情报过程中,容易遭到中间人攻击,怎样防止这种情况的发生呢? 古罗马时期,凯撒大帝想出了一种非常朴素的加密方法,这套加密方法也被后世称为凯撒密码。加密的原理就像下图这样:
原理其实非常简单,就是把字母表进行移位加密,比如将字母表中的 A 移位加密后变成 C,将字母表中的 B 移位加密后变成 D,以此类推。
凯撒密码在当时是一种有效的加密方法,它是典型的对称加密算法,它的加密和解密密钥用的都是同一个密钥,加密的时候字母表平移了几位,解密的时候只要反向平移就能得到原文。
这也导致凯撒密码的安全性较低,因为只需尝试 26 个不同的位移就能暴力破解。
# 栅栏密码
栅栏密码比凯撒密码年轻了许多,它最早出现在 1861 年至 1865 年的美国南北战争时期。和凯撒密码的代替密码不同,栅栏密码属于置换密码,通过打乱明文字母的位置,使有意义的明文信息变换为无意义的密文乱码。
它的加密的原理就是明文按列写入,密文按行输出。
假设有一明文:HAPPY NEW YEAR,首先给它分栏,把明文一上一下分成 N 个一栏,这里分成两栏
H | P | Y | E | Y | A |
---|---|---|---|---|---|
A | P | N | W | E | R |
把每栏的字母横向连起来,就形成一段看起来毫无意义的密文:HPYEYAAPNWER
解密的时候只要把密文HPYEYAAPNWER从中间分开,再按上下上下的顺序组合起来就能得到明文: HAPPY NEW YEAR
# 斯巴达密码棒
在古希腊,斯巴达军方使用一种叫做密码棒的装置来加密信息,这种装置由一条皮带和一根木棍组成。 在展开时,皮带似乎只是一串随机字符,但如果缠绕在一定大小的木棒上,字母会对齐成单词。
柯南中的密码棒灵感就来源于此。
在古典密码时代,密码学的概念还是比较模糊的,尽管大量被用在军事领域,但加密方式更像是一种艺术行为,反正就一个理念,瞎换乱转,你猜去吧 。
而在我国古代也有藏头诗、藏尾诗,比如广为人知的唐伯虎写的"我爱秋香"
爱晚亭上枫叶愁。
秋月溶溶照佛寺,
香烟袅袅绕经楼。
也有先秦兵书《六韬》中提到的阴符。
阴符的优点:便于携带且不易引起敌方怀疑
阴符的缺点:传递的信息量很少
在《六韬》的龙韬篇中,有记载:
点开查看原文
武王问太公:"率领军队深入敌国境内,国君与主将想要集结兵力,根据敌情进行灵活的机动。用阴符难以说明问题,彼此相距又十分遥远。在这种情况下应该怎么办?"
太公回答:"用阴书,就是把一封书信分为三个部分;然后派三个人送信,每人只有其中的一部分,即使送信的人也不知道书信的内容。这样,即使敌人抓了信使,也是不知道书信的内容。"
武王曰:"高明啊!"
除此之外还有很多好玩的古典密码,这里就不一一细说了,古典密码都有一个共同点,那就是太对称了,这里说的对称有两种含义:
第一种:加密是可逆的,一旦知道怎样加密,就很容易反推出怎么解密。
所以古人只要随便抓个活口就知道密码是怎么玩的,他们并不傻。
另一种对称的意思是:不管你如何对明文进行替换,总会形成一种明文和密文的一一对应关系。
因此不管怎么替换,只要被截获的密文一多,总会被频率分析法拿捏。
# 恩尼格玛机
古典密码的巅峰之作恩尼格玛机,是由德国发明并在二战期间广泛使用的加密和解密机器,又称作哑谜机,或"谜"式密码机。
恩格玛机的伟大之处就在于它在进行高度复杂的加密运算的同时,操作的简易性也几乎做到了极致。
操作者只需像使用打字机一样在键盘上输入消息,加密后的字母就会在灯盘上显示出来,这使得即使是未经专业训练的人员也能快速上手。
而且明文中相同的字母也会被加密成不同的密文,这就很好的防止了频率分析法,另外即使知道其运作原理也很难破解。
这是如何做到的?
首先先看下恩尼格玛机的组成部件
键盘:输入明文或者密文用的
灯盘:在键盘上输入一个字母,灯盘上会有一个字母亮起来,代表键盘上输入的字母加密后的结果
转子:这个是恩格玛机的核心,是加密元件
插线板:这是在转子进行加密后,为了提高安全性而增加的装置
之所以恩尼格玛机在当时很难破解,主要还是因为它的核心元件"转子"。
转子就像是可以旋转的密码锁,比如当你按下"A"键时,"A"通过转子时,它会被替换成另一个字母,比如"D",但是,神奇的地方在于,当你再次按下"A"键时,由于转子已经旋转,它可能变成"E"或另一个字母,而不是"D"。这是因为每次按键后,转子都会转动,改变内部的连接,所以同一个字母可以被替换成不同的字母。
一台恩尼格玛机通常使用了三个转子串联起来,有时更多,当一个转子转完一圈,它会推动下一个转子转动一点。
这意味着,随着输入更多的字母,转子的组合方式会变得极其复杂,使得相同的字母在不同的位置被替换成不同的字母。
由于每个转子都有26个可能的位置,所以三个转子一共可以提供26 X 26 X 26=17576种可能性。
恩格玛机除了转子,还有个重要装置:反射器。
性质一:加密过程是自反的。
解释:假如输入"A"输出"G",反过来,输入"G"将会输出"A",这样既可以用来加密也可以用来解密。
性质二:一个字母加密后的输出结果不会是自己本身。
解释:一个字母如果加密后要还是自己,在图中就会变成"A"从红线进去,然后从红线再返回来,但是经过反射器,导致"A"的返回路径是蓝线,所以字母加密后结果不是其本身。
除此之外,为了保险起见它的外侧还附加一组交换机制"插线板",也就是说如果连通"O"和"E",当按下"O"时,其实相当于按下了"E",这种连线最多可以有六根。
插线板上两两交换6对字母的可能性则是异常庞大,有100,391,791,500种。
最终 17576 X 100391791500 = 1764486127404000 种。
在没有计算机时代,想通过逆向穷举的方式几乎是不可能的!
况且当时的恩尼格玛机每天都会更换一次初始方案
如果当天算不出,第二天就得重新计算,这使得暴力破解又更难了。
但了解二战的小伙伴都知道,恩尼格玛机最终还是被破解了,甚至没等到计算机的诞生。
1940年,计算机之父英国数学家艾伦·图灵就破解了恩尼格玛机。不是说恩尼格玛机没有计算机就无法破解的吗?
说法虽没错,但遭不住德国人太轴又太飘。
不管发啥都要来一句Heil Hitler!
这种严谨又白给的操作,很快就让图灵拿到了明密对应的线索。
依靠这些线索图灵和他的同事戈登·韦尔奇曼发明了叫做"炸弹机"的解密机。
通过"炸弹机"最后硬生生的逆向破解了恩尼格玛机。
所以这又一次说明了像古典密码这样,知道怎么加密就能知道怎么解密的对称加密方法,从根本上来说是肯定会被破解的,只不过是时间问题罢了。
那有没有哪种加密方式,加密和解密方法不一样?
# 现代密码
# 一点历史
1976 年以前,所有的加密方法都是同一种模式:
甲方选择某一种加密规则,对信息进行加密
乙方使用同一种规则,对信息进行解密
由于加密和解密使用同样规则(简称"密钥"),这被称为"对称加密算法" (opens new window)(Symmetric-key algorithm)。
这种加密模式有一个最大弱点:甲方必须把加密规则告诉乙方,否则无法解密。保存和传递密钥,就成了最头疼的问题。
1976 年,两位美国计算机学家 Whitfield Diffie 和 Martin Hellman,提出了一种崭新构思,可以在不直接传递密钥的情况下,完成解密。这被称为"Diffie-Hellman 密钥交换算法" (opens new window)。这个算法启发了其他科学家。人们认识到,加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。
这种新的加密模式被称为"非对称加密算法"。
工作流程
(1)乙方生成两把密钥(公钥和私钥)。公钥是公开的,任何人都可以获得,私钥则是保密的。
(2)甲方获取乙方的公钥,然后用它对信息加密。
(3)乙方得到加密后的信息,用私钥解密。
如果公钥加密的信息只有私钥解得开,那么只要私钥不泄漏,通信就是安全的。
1977年,三位数学家 Rivest(罗纳德·李维斯特)、Shamir(阿迪·萨莫尔) 和 Adleman(伦纳德·阿德曼) 设计了一种算法,可以实现非对称加密。这种算法用他们三个人的名字命名,叫做RSA 算法 (opens new window)。从那时直到现在,RSA 算法一直是最广为使用的"非对称加密算法"。毫不夸张地说,只要有计算机网络的地方,就有 RSA 算法。
下面用一个箱子的对白来理解这个对称加密和非对称加密的流程。