循序渐进学加密
副标题[/!--empirenews.page--]
还记得上初二的那年夏天,班里来了一个新同学,他就住在我家对面的楼里,于是我们一起上学放学,很快便成了最要好的朋友。我们决定发明一套神秘的沟通方式,任何人看到都不可能猜到它的真实含义。我们第一个想到的就是汉语拼音,但很显然光把一个句子变成汉语拼音是不够的,于是我们把26个英文字母用简谱的方式从低音到高音排起来,就得到了一个简单的密码本: 把“我们都是好朋友”用这个密码本变换之后就得到了这样的结果: 小时候玩这个游戏乐此不疲,觉得非常有趣。上大学后,有幸听卢开澄教授讲《计算机密码学》,才知道原来我们小时候玩的这个游戏远远不能称之为加密。那么到底什么是加密呢? 什么是加密? 把字符串123456经过base64变换之后,得到了MTIzNDU2,有人说这是base64加密。 把字符串123456经过md5变换之后,得到了E10ADC3949BA59ABBE56E057F20F883E,有人说这是md5加密。 从严格意义上来说,不管是base64还是md5甚至更复杂一些的sha256都不能称之为加密。 一句话,没有密钥的算法都不能叫加密。
在古典加密算法当中,加密算法和密钥都是不能公开的,一旦泄露就有被破解的风险,我们可以用词频推算等方法获知明文。1972年美国IBM公司研制的DES算法(Data Encryption Standard)是人类历史上第一个公开加密算法但不公开密钥的加密方法,后来成为美国军方和政府机构的标准加密算法。2002年升级成为AES算法(Advanced Encryption Standard),我们今天就从AES开始入手学习加密和解密。 准备工具 通常情况下,加解密都只需要在服务端完成就够了,这也是网上大多数教程和样例代码的情况,但在某种特殊情况下,你需要用一种语言加密而用另一种语言解密的时候,最好有一个中立的公正的第三方结果集来验证你的加密结果,否则一旦出错,你都不知道是加密算法出错了,还是解密算法出错了,对此我们是有惨痛教训的,特别是如果一个公司里,写加密的是前端,用的是js语言,而写解密的是后端,用的是java语言或者php语言或者go语言,则双方更需要有这样一个客观公正的平台,否则你们之间必然会陷入永无休止的互相指责的境地,前端说自己没有错,是后端解密解错了,后端说解密没有错,是前端加密写错了,而事实上是双方都是菜鸟,对密码学一知半解,在这种情况下浪费的时间就更多。 在线AES加密解密就是这样的一个工具网站,你可以在上面验证你的加密结果,如果你加密得到的结果和它的结果完全一致,就说明你的加密算法没有问题,否则你就去调整,直到和它的结果完全一致为止。反之亦然,如果它能从一个密文解密解出来,而你的代码解不出来,那么一定是你的算法有问题,而不可能是数据的问题。 我们先在这个网站上对一个简单的字符串123456进行加密。 下面我们对网站上的所有选项逐个解释一下:
好了,现在我们知道按照以上选项设置好之后的代码如果加密123456的话,应该输出DoxDHHOjfol/2WxpaXAXgQ==,如果不是这个结果,那就是加密端的问题。 AES-ECB 1. AES-ECB的Javascript加密 为了完成AES加密,我们并不需要自己手写一个AES算法,不需要去重复造轮子。但如何选择js的加密库是个很有意思的挑战。我们尝试了很多方法,一开始我们尝试了aes-js这个库,但它不支持RSA算法,后来我们看到Web Crypto API这种浏览器自带的加密库,原生支持AES和RSA,但它的RSA实现和Java不兼容,最终我们还是选择了Forge这个库,它天生支持AES的各种子集,并且它的RSA也能和Java完美配合。 (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |