密码学是网络安全、信息安全、区块链等产品的基础,常见的非对称加密、对称加密、散列函数等,都属于密码学范畴。
密码学有数千年的历史,从最开始的替换法到如今的非对称加密算法,经历了古典密码学,近代密码学和现代密码学三个阶段。密码学不仅仅是数学家们的智慧,更是如今网络空间安全的重要基础。
古典密码学
在古代的战争中,多见使用隐藏信息的方式保护重要的通信资料。比如先把需要保护的信息用化学药水写到纸上,药水干后,纸上看不出任何的信息,需要使用另外的化学药水涂抹后才可以阅读纸上的信息。
再比如把需要保护的信息写到送信人的头皮上,等头发长出来后,把送信人送达目的地,再剃光头发阅读信息。
这些方法都是在保护重要的信息不被他人获取,但藏信息的方式比较容易被他人识破,例如增加哨兵的排查力度,就会发现其中的猫腻,因而随后发展出了较难破解的古典密码学。
替换法
替换法很好理解,就是用固定的信息将原文替换成无法直接阅读的密文信息。例如将b替换成w,e替换成p,这样bee单词就变换成了wpp,不知道替换规则的人就无法阅读出原文的含义。
替换法有单表替换和多表替换两种形式。单表替换即只有一张原文密文对照表单,发送者和接收者用这张表单来加密解密。在上述例子中,表单即为:abcde-swtrp。
多表替换即有多张原文密文对照表单,不同字母可以用不同表单的内容替换。
例如约定好表单为:表单1:abcde-swtrp、表单2:abcde-chfhk、表单3:abcde-jftou。
规定第一个字母用第三张表单,第二个字母用第一张表单,第三个字母用第二张表单,这时bee单词就变成了(312)fpk,破解难度更高,其中312又叫做密钥,密钥可以事先约定好,也可以在传输过程中标记出来。
移位法
移位法就是将原文中的所有字母都在字母表上向后(或向前)按照一个固定数目进行偏移后得出密文,典型的移位法应用有“恺撒密码”。
例如约定好向后移动2位(abcde-cdefg),这样bee单词就变换成了dgg。
同理替换法,移位法也可以采用多表移位的方式,典型的多表案例是“维尼吉亚密码”(又译维热纳尔密码),属于多表密码的一种形式。
古典密码破解方式
古典密码虽然很简单,但是在密码史上是使用的最久的加密方式,直到“概率论”的数学方法被发现,古典密码就被破解了。
英文单词中字母出现的频率是不同的,e以12.702%的百分比占比最高,z只占到0.074%,感兴趣的可以去百科查字母频率详细统计数据。如果密文数量足够大,仅仅采用频度分析法就可以破解单表的替换法或移位法。
多表的替换法或移位法虽然难度高一些,但如果数据量足够大的话,也是可以破解的。以维尼吉亚密码算法为例,破解方法就是先找出密文中完全相同的字母串,猜测密钥长度,得到密钥长度后再把同组的密文放在一起,使用频率分析法破解。
近代密码学
古典密码的安全性受到了威胁,外加使用便利性较低,到了工业化时代,近现代密码被广泛应用。
恩尼格玛机
恩尼格玛机是二战时期纳粹德国使用的加密机器,后被英国破译,参与破译的人员有被称为计算机科学之父、人工智能之父的图灵。
恩尼格玛机使用的加密方式本质上还是移位和替代,只不过因为密码表种类极多,破解难度高,同时加密解密机器化,使用便捷,因而在二战时期得以使用。
恩尼格玛机共有26个字母键和26个带有字母的小灯泡,当按下键盘上的键时,加密后的密文字母所对应的小灯泡就会亮起来,依次记录密文发送给接收者就实现了密文传输。接收者也用相同的恩尼格玛机,依次输入密文并获取原文。
密码机内装有“转子”装置,每按下键盘上的一个字母,“转子”就会自动地转动一个位置,相当于更换了一套密码表。最开始“转子”只有6格,相当于有6套密码表,后来升级到了26格,即有26套密码表。
如果仅仅是26套密码表,和维尼吉亚密码没有安全方面的突出特点,后来恩尼格玛机由一个“转子”升级到了多个“转子”,是密码表套数成指数级增长。例如当有2个“转子”时,密码表套数为26的平方,676种。德国二战期间用的最高水准恩尼格玛机具有8个“转子”,密码表套数为26的8次方,达到了2000多亿种。
恩尼格玛机由6套密码表,升级到676套,甚至到2000多亿套密码表,密码表数量如此之大,在当时靠人工的方法是无法穷尽破解的。看过电影《模仿游戏》的都知道,破解的办法是采用了类似现代计算机的机械机器。
现代密码学
散列函数
散列函数,也见杂凑函数、摘要函数或哈希函数,可将任意长度的消息经过运算,变成固定长度数值,常见的有MD5、SHA-1、SHA256,多应用在文件校验,数字签名中。
MD5可以将任意长度的原文生成一个128位(16字节)的哈希值,于2004年被王小云教授宣布破译,证明MD5具有抗碰撞性不足的安全弱点,可快速对文件进行修改而保持哈希值不变,对MD5算法的应用形成了挑战。
SHA-1可以将任意长度的原文生成一个160位(20字节)的哈希值,2017年Google公司公告宣称他们与阿姆斯特丹CWI研究所,共同创建了两个有着相同的SHA-1哈希值但内容不同的PDF文件,这代表SHA-1算法已被正式攻破。
对称密码
对称密码应用了相同的加密密钥和解密密钥。对称密码分为:序列密码(流密码),分组密码(块密码)两种。流密码是对信息流中的每一个元素(一个字母或一个比特)作为基本的处理单元进行加密,块密码是先对信息流分块,再对每一块分别加密。例如原文为1234567890,流加密即先对1进行加密,再对2进行加密,再对3进行加密……最后拼接成密文;块加密先分成不同的块,如1234成块,5678成块,90XX(XX为补位数字)成块,再分别对不同块进行加密,最后拼接成密文。前文提到的古典密码学加密方法,都属于流加密。
流密码算法的代表有A5和RC4,A5是GSM规定的加密算法,RC4被应用在1999年的安全传输层协议(TLS)。
块密码算法的代表有DES,3DES,AES,相对于流密码更为常见。DES算法使用的密钥是64位(实际用到了56位,第8、16、24、32、40、48、56、64位是校验位),把64位的原文输入块变为64位的密文输出块。单层DES算法于1999年被RSA公司以22小时35分钟破解。
3DES(即Triple DES),由3支DES长度的密钥组成(或2支,第一支密钥和第三支密钥相同),加密过程为:用第一支密钥对原文进行加密,再使用第二支密钥对第一步操作后的信息进行解密,最后使用第三支密钥对第二步操作后的信息进行加密得到最终密文。
解密过程与加密过程相反:采用第三支密钥对密文进行解密,再采用第二支密钥进行加密,最后采用第一支密钥解密得到原文。
AES,密钥长度可为128、192、256比特三种,可以抵抗各种已知攻击,目前为止还没有公开的对AES有威胁的攻击方法。
非对称密码
对称密码的密钥安全极其重要,加密者和解密者需要提前协商密钥,并各自确保密钥的安全性,一但密钥泄露,即使算法是安全的也无法保障原文信息的私密性。
在实际的使用中,远程的提前协商密钥不容易实现,即使协商好,在远程传输过程中也容易被他人获取,因此非对称密钥此时就凸显出了优势。
非对称密码有两支密钥,公钥(publickey)和私钥(privatekey),加密和解密运算使用的密钥不同。用公钥对原文进行加密后,需要由私钥进行解密;用私钥对原文进行加密后(此时一般称为签名),需要由公钥进行解密(此时一般称为验签)。公钥可以公开的,大家使用公钥对信息进行加密,再发送给私钥的持有者,私钥持有者使用私钥对信息进行解密,获得信息原文。因为私钥只有单一人持有,因此不用担心被他人解密获取信息原文。
私钥对信息的加密(此时一般称为签名),可以确保私钥持有者对信息的认可,大家持有公钥即可验证信息是由私钥持有者发出的,表明私钥持有者认可了信息的内容,实现了对信息进行数字签名的效果。
常见的非对称密码有RSA和SM2。RSA于1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的,三人姓氏开头字母拼成RSA,迄今为止应用十分广泛。SM2基于椭圆曲线公钥密码算法,为我国商用密码体系中用于替换RSA的算法。
非对称密码不仅可以应用于签名、加密中,还可以和对称密码组合形成数字信封,兼顾对称加密技术和非对称加密技术两者的优点,既发挥了对称加密算法速度快的优点,又发挥了非对称加密算法的高安全、无需提前协商的优势。
对称密码算法中加密和解密采用了相同密钥,一但加密者或解密者有一方造成密钥泄露,或在密钥分配传输时泄露,都将对信息安全造成影响。非对称密码算法的提出,解决了这个问题,公钥公开,私钥个人管理,采用非对称密码算法在一定程度上可以简化密钥管理的难题。但由于公钥在分发过程中可能被截取后篡改,接收方也无从核查接收到的公钥所对应私钥的持有者身份,因而非对称密码算法也并不宜大范围使用。
为解决非对称密码算法不宜大范围应用的问题,引入了权威机构CA(certificate authority,数字证书认证机构),由CA负责用户的身份核实,并向用户颁发数字证书,有效地形成公私钥与持有者身份的映射关系,避免了公钥在分发过程中可能被他人偷换的问题,增强了信任性。关于CA、数字证书等相关概念的介绍,将会在后续的文章中详细展开。
如何设置密码才安全
互联网服务提供商为了降低数据脱库后的影响,密码在数据库中多以HASH方式存储。例如用户密码123456在数据库中会存储其SHA-1值(7c4a8d09ca3762af61e59520943dc26494f8941b),验证时用户输入原文123456,程序会自动将原文转为SHA-1值再同数据库中的值进行比对。
因为HASH算法是不可逆的,不能通过密文转换成原文,上述的方法即使脱库,表面上看也不会造成用户密码的泄露。但HASH算法的密文值是固定的,也就是说123456采用SHA-1运算后,值永远是7c4a8d09ca3762af61e59520943dc26494f8941b,破译者如果有一张常用密码对照表,根据获取的SHA-1值仍然可以对应出原文。
互联网服务提供商为了降低被上述方式破解的风险,有时会采用加盐HASH的方式,即在用户密码前或者密码后补充一个固定值,例如用户密码为123456,但服务提供商在存储时会在密码后面补充固定盐值,如PMtoolbox,这样存储时就会以123456PMtoolbox的SHA-1值(39fcbe1100c9b0c5a065b625098cab680f6b0e27)进行存储。一但盐值和补充规则泄露,风险与直接存储SHA-1值是相同的,常用密码仍然无法防御被破解的风险。
因此在互联网上设计密码时,建议:
1、密码不要太常见,不要使用类似于123456式的常用密码。
2、各应用软件密码建议不同,避免出现一个应用数据库被脱库,全部应用密码崩塌,可在设置密码时增加注册时间、注册地点、应用特性等方法。例如tianjin123456,表示在天津注册的该应用。