先说一说普通百姓对数据加密的误解。
误解:很多人觉得,安全的数据加密就是用一种外人不知道的方法给数据加上密,加密算法最好是独家研发的,别人都不知道。
真相:全世界用的加密方法都是统一的且算法公开的(没想到吧)。国际上用美国的加密标准,中国是特例,用国产的标准。
如果有人说“我们的加密算法是独家研发的,绝~对~安~全~!”,这绝对是在撒谎。秃子头上的虱子,明摆着的事儿。再安全,还能比国家层面推行的加密标准安全?!
很多人会问:算法都公开了,还安全吗?
安全。算法都公开了,也没人能破解,这才是真正安全的算法。没错,就是这么牛!
好的加密就像武林高手:公开接收任何人的挑战,还没有人能赢他,这才是真正的高手。如果整天说自己是高手,又不敢跟别人过招,这都是假高手,吹牛的高手。
所以,只要是没有公开算法的加密方法,都是不安全的。
这么说有点绝对,国产的SM1就没有完全公开,总让人觉得掖着藏着不够自信。
今天重点说美国的分组加密算法AES(Advanced Encryption Standard,高级加密标准),这也是美国军方的加密算法。
咱们再来看一个常见的误解。
误解:美国的加密标准AES算法是美国人发明的。
真相:AES算法是两个比利时人发明的。而且美国最新的SHA-3算法也是欧洲人设计的(欧洲意法半导体和恩智浦的密码学家联合设计),且算法公开。
正因为AES不是美国人和美国政府发明的,所以它全球流行,不用担心美国留后门(流行的原因之一)。
2003年6月,美国政府宣布AES算法可以用于加密机密文件和绝密文件。
在之前的文章“戏说密码学(2):密码破译方法”中我们提到过,20世纪70年代时,商业上(尤其是银行业)对数据加密的强烈要求促使美国推出了全球首个数据加密标准DES。
有人问,别的国家用美国的加密算法,还能安全吗?
这是个好问题!
尽管DES算法最初是IBM公司提供的,但美国国家安全局(NSA)“深度”参与了算法的修改。要知道,NSA是美国的特务机构,不是善男信女,要说它没动手脚没留后门,连美国人都不相信。所以人们担心是有道理的。
DES算法从发布到退役,一直都处在舆论的风口浪尖上。它的发布者,美国的标准局,也备受指责,脊梁骨没少被戳。
这也使得美国标准局痛定思痛,决心摆脱NSA这个声名狼藉的猪队友,创造新的发明了AES算法的选择方式——选秀。
你没看错,我也没写错,AES的确是选秀出身,而且是全球选秀。如今国内的娱乐节目中选秀比比皆是,这么看来,美国的标准局还是很有商业头脑的。
和选秀节目不同的是,AES的选秀过程相当漫长。从1997年1月一直选到2000年10月,来来回回选了近4年的时间。
为什么这么长时间?作为DES算法的继任者,AES算法涉及到美国甚至全球金融、军事、商业等领域的安全,不是长得帅、脸蛋儿白、家里有钱就能蒙混过关的。
最初从全球征集了15个候选算法(不用记,大部分算法都是过眼云烟):CAST-256, CRYPTON, DEAL, DFC, E2, FROG, HPC, LOKI97, MAGENTA, MARS,
RC6, Rijndael, SAFER+, Serpent, 和 Twofish。
密码学家们讨论了每个算法的优缺点,不光要安全,还要在软件、硬件(包括各种处理器架构、智能卡等)上易于实现,速度快。有些算法因安全上的缺陷被否定,有些则因为性能不佳被排除。为此美国标准局在1998年和1999年开了两次研讨会,最终选出了5个算法进入决赛:MARS,RC6,Rijndael,Serpent和Twofish(说来也巧,这几个算法的首字母都靠后)。咱们来看看他们进入决赛时的成绩:
第一名:Rijndael,86票赞成,10票反对;
第二名:59票赞成,7票反对。
第三名:31票赞成,21票反对。
第四名:23票赞成,37票反对。(来自RSA公司的RC6)
第五名:13票赞成,84票反对。(来自IBM的Mars)
最终Rijndael算法胜出,成为AES算法,2001年正式成为美国联邦标准。
Rijndael算法并不是美国人发明的,而是两个比利时人发明的。AES算法的安全性以及选举过程,都得到了好评。发明人之一的Joan Daemen后来又参与设计了SHA-3算法(2012),不愧是加密界的高手高手高高手!
AES是全球最流行的对称加密算法,我们计算机的CPU(包括Intel和AMD)里内置了AES指令。
AES算法是公开的,至今为止,尚未找到有效的破解方式,安全性值得信赖。
AES算法有三种:AES-128, AES-192和AES-256,后面的数字表示密钥的位数。很明显,AES-256是最强壮的,密钥空间是2^256. 它们单次能够加密128比特数据,也就是16字节。
嗯?单次只能加密16字节数据?现在手机随便拍张照片也有好几MB,怎么加密?
这又是个好问题。
有人说,这还不简单,无论多大的文件,按16字节一块,划分成多个块,逐块加密,直到把所有数据都加密完为止。
上面的方法看似可行,其实有很大的安全隐患:因为相同的明文加密后会得到相同的密文。
有人会说:当然!相同的明文加密后肯定得到相同的密文,这很正常啊,有问题吗?
有!而且很严重!
举个例子吧。图1中,左边是原始图片(不是QQ,是Linux),中间是用AES逐块加密后的图片(逐块加密模式被称为ECB模式);右边是用改进的AES-CBC模式加密后的图片。看出逐块加密的问题了吧,尽管加了密,仍能看出其中的企鹅。
这是因为白色的背景由相同的数据组成,加密后生成相同的密文。尽管从局部看密文是随机的,但整体上人眼还是能分辨出其中的图案。
用专业的属于讲,问题在于:明文的统计属性在密文中得到了保留。这是加密算法的大忌。
怎么办才能让相同的明文加密成不同的密文呢?
还记得我们在“(3)哈希函数与密码破译”中说到hash算法时提到的“加盐”操作吗?简单的说,同样的两杯水,随机往里加点盐,味道就会不一样。这个方法也可以用到AES加密里(瞧,很多看似高深的理论,通常都来源于日常的生活)。最右边的图就是加盐后的加密图片,完全看不出企鹅图形。
往AES算法里加盐的方法有很多,由此产生了若干个AES加密模式,常用的是CBC模式和XTS模式。
CBC模式在软件加密领域非常流行。CBC模式加密前,先要生成一个随机的盐值(学名叫IV,Initial Value,初始值)。加解密过程如下(用文字不好解释,直接看公式):
加密每个文件时,都产生一个随机的IV,这样即使是相同的文件,由于IV不同,加密后的数据也不同。
CBC模式非常流行,但有个问题:密文数据量比明文要大,为什么呢?
首先,密文里要保存盐值(IV);其次,明文不是16字节的整数倍时,要填充到整数倍,导致密文变大。
这对软件来说不算事儿,但对底层的硬磁盘来说,会带来设计上的麻烦。
如果仔细看公式的话,我们会发现CBC模式无法并行加密,但可以并行解密。
XTS模式是为硬磁盘加密量身定制的:在加密数据时,会把数据的扇区地址和块地址作为盐(因此无需额外的IV),且有更好的数据填充机制,使得明文和密文的大小完全相同,不会造成存储空间的浪费。在硬磁盘中,相同数据的扇区地址和块地址不会完全一样,因此不会得到相同的密文。
Windows 10中的BitLocker,macOS(10.7)中的FileVault2用的都是AES-XTS模式。开源软件TrueCrypt和VeraCrypt也用这种模式,国内有些加密软件是基于VeraCrypt的(这个咱们以后再讲)。
现在市面上的加密移动硬盘和加密U盘大多数使用AES-XTS模式,早期的产品也有使用CBC模式的。Win7和Win8/8.1的BitLocker使用的也是AES-CBC模式。
有人会问:既然XTS模式这么好,为何软件上不用呢?
这是个好问题。
原因是,在软件读写数据时,不会涉及到数据在硬磁盘中的扇区地址和块地址的信息。简言之,XTS模式是为硬件存储设备设计的,不是给软件设计的。
那么,怎样才能破解AES算法呢?
答案就藏在中国功夫的精髓里:天下武功,无坚不破,唯快不破。
重点:火云邪神手里夹的不是烟头,是子弹!
要破解AES-256,需要多长时间呢?
截止到2018年8月11日,全球最快的超级计算机是美国的“顶点”(Summit),峰值速度是20亿亿次/秒(200PLOPS,即2×10^17)。排名第二的中国神威太湖之光的峰值速度是12.5亿亿次/秒。
假设“顶点”每次运算都能破译一个AES秘钥(实际没有这么快),要破解AES-256,需要1.8×10^52年,大约是(18000亿亿亿亿亿亿年)。
全球现在大概有70亿人口,假设每人都有一台“顶点”,一起破解,仍需要257亿亿亿亿亿年。
所有,不要幻想着去暴力破解AES算法。
举个例子吧,还记得2017年爆发的WannaCry勒索病毒吗?攻击了超过150个国家的电脑。它用的就是AES算法。
再说个破解的误区吧。
想破解别人加密的数据,不一定要破解加密算法。
就好比要想入室盗窃,不要想着刨开几十厘米厚的水泥墙。有很多简单的方法,比如偷钥匙、从窗户进入等等。
无数的事实证明,“坑蒙拐骗偷”通常是最有效的方式。只要想办法拿到密码,就大功告成。
当然,政府是不鼓励“坑蒙拐骗偷”的,尽管各国的间谍乐此不疲。
徐红伟@百香果科技