密码工具箱
作者: dkvirus 发表于: 2018-06-25 15:41:00 最近更新: 2018-07-06 12:31:09

去年,在工作中接触了一些新的技术名词:数字签名数字证书Oauth2认证SSL/TLSXOR异或加密RSA算法单钥加密公钥加密三方认证 等。这些名词单独来看就是一个个技术点,相关技术文档也看了很多,但一直无法做到了然于心,运用自如的地步。直到阅读了《图解密码技术》这本图书,发现原来这些东东都属于密码学的范畴,理清关系之后并没有想象中的那么繁琐。
本文打算从三个部分捋一捋这些关系:第一部分介绍信息传递过程中存在的问题,凡事都是先抛出问题,再谈解决方案;第二部分就介绍解决这些问题的方法了,就像学习数学一样,公式啊、定理啊啥的前人已经帮我们做了,我们要做的只是了解它,认识它,所以这部分并不会很难;第三部分为探索阶段,那些 hacker 们是怎么拦截消息的,如何篡改消息内容,又是如何伪装它人身份,这些我很感兴趣,但由于底子薄,探索周期可能会有点长,权当自娱自乐吧………….

一、信息安全因素

1. 机密性

读书的时候喜欢在课堂和好朋友上递小纸条,这过程存在被老师发现的可能性,如果小纸条的内容涉及到说老师的坏话,那被发现少不了一顿批评教育。倘若能对小纸条的内容进行 加密,只有你和你的朋友知道如何 解密 得到正确的内容,这样即使被老师发现,也可以胡邹一些无关紧要的话糊弄过去。

你可以和小伙伴提前商量好 加密 方式,比如:先将汉字写成拼音,再将每个字母往后平移三个字母,像下面这样。

26个小写字母表

明文:老师今天好丑

明文转拼音:lao shi jin tian hao chou

拼音转密文(每个字母往后平移三个字母):dor vkl mlq wldq kdr fkrx

这样即便老师发现了你们的小纸条也不知道你们在说啥,你的朋友在接收到小纸条时先往前平移 3 个字母再将拼音转换为汉字即可得到明文信息。

并不是所有的消息都需要加密,如果你不想你的“秘密”被别人知道,那就加密消息吧。

2. 完整性

计算机病毒破坏软件完整性

在下载一些免费软件的时候,我们很难保证我们下载的软件与作者发布的软件是一模一样的,这中间会不会被一些不怀好意的人植入了病毒,等着我们掉进陷阱。这里被植入病毒就改变了软件的完整性,而这个过程通常是 病毒作者软件作者 (消息发布者)下载软件的用户(消息接受者) 毫不知情的情况下进行的篡改。

消息的完整性

软件作者发布软件好比发送消息,用户下载软件好比接受消息,病毒作者对软件植入病毒就好比在消息传输过程修改了消息的原本内容。

我们想要的是消息保持完整性,现实生活中可以给朋友打个电话询问收到的信件内容是否完整,但在网络世界或其它很多场景是无法做到这种询问的,这需要特定的技术来保证这一点。

3. 认证

不知道你们会不会收到许久不联系的老同学发来的短信:“老同学,借两千块钱”。

Excuse me,请问你是谁?

我每次收到这种消息,第一反应总是会想 这是不是他本人 ,接着问一些只有我和他才知道的秘密来验证他的身份,或者直接打个电话进行确认,毕竟在当今这个社会,社交账号被盗取是很正常的一件事情。

image.png

花道相约晴子妹子出来玩,无奈人晴子只中意阿枫,花道不得已就伪装成阿枫的语气给晴子写信,晴子一看这是 “阿枫” 的信就会立马出来,然后才发现自己被骗了………..

由此可见,消息也存在 伪造发送人身份 这一特性,而 认证 就是一种特殊的手段来判别发送人到底是 本人 还是 不怀好意 的人。

4. 不可否认性

朋友刚来上海这边身无分文,找我借了 ¥5000.00 租房子,因为他和我离得比较远,没办法直接给我写借条,就想着通过电子邮件给我来电一封,记录借款事项。

打欠条

几个月过去了,我想着他也有了钱可以还我了就去找他要钱,结果他狗日的给我耍赖,说自己并没有给我写过信,顿时感觉古人的伟大,知道写完欠条要按个指纹,想赖账还可以根据指纹判断确实你这个人写的。(其实一直有个疑惑,古人没有指纹鉴别仪器,是怎么根据指纹判断人的唯一性??)

伤心的猪

消息的传递存在 诋毁,不承认 的特性,尤其是在互联网上,文字都是印刷版的冷冰冰的。如果需要签订合同都是打印出纸质版本,盖上公司章再邮寄给他人。

不可否认性 又是通过特定手段将消息发送者的身份和消息绑定在一定,现实生活中很方便,比如签字、按指纹、盖章等,网络中出现此问题,也衍生了对应的解决方案。

5. 总结

消息的特性:

  • 机密性
  • 完整性
  • 认证
  • 不可否认性

这些特性在日常生活中也会出现,但有时我们并不在乎它。

我们与他人的日常交流就不需要时时刻刻加密对话内容;我们收到朋友发的微信也没必要打个电话询问内容是否完整;和朋友之间周转个千儿八百的也没打欠条的习惯。

这是因为这些事儿的重要性都不够高,即便存在这些安全性问题也不会对我们造成太大的损失。但是像一些大型公司、银行,如果不注重信息的安全性,就会让那些不会好意的人有机可乘,结果也许会很糟糕。

二、密码工具箱

1. 对称加密

1.1 异或运算

层叠消融

最强大脑有个 层叠消融 的项目,本质上就是属于密码学中的对称加密。

层叠消融 把两个图形重叠在一起,相同的部分会消失,不同的部分会显示。如果这么说不太理解的话,可以看下面的 异或 运算,和 加减 运算一样简单。

1
2
3
4
0 XOR 0 = 0;
0 XOR 1 = 1;
1 XOR 0 = 1;
1 XOR 1 = 0;

XOR+- 都是数学里面的运算符号,叫做 异或运算符。它的规则是相同的数字做运算之后结果为 0,不同的数字做异或运算之后结果为 1。这里即可看出 层叠消融 的本质即异或运算。

1.2 对称加密的核心就是异或运算

随机生成两个相同位数的数字 01001100 和 10101010,对第一个数字记做 A,第二个数字记做 B,对它两进行异或运算。

1
2
3
0 1 0 0 1 1 0 0        // A
1 0 1 0 1 0 1 0 // B
1 1 1 0 0 1 1 0 // 结果

将结果 11100110 在与 B 做一次异或运算。

1
2
3
1 1 1 0 0 1 1 0         // 结果
1 0 1 0 1 0 1 0 // B
0 1 0 0 1 1 0 0 // 第二次的结果 === A

第一次对 A 和 B 做 异或运算 可以看成是 加密行为

1
2
3
4
// 加密过程
0 1 0 0 1 1 0 0 // A:消息
1 0 1 0 1 0 1 0 // B:密钥
1 1 1 0 0 1 1 0 // 结果:密文,加密之后看不懂的东东

第二次对第一次运算的结果再与 B 做 异或运算 可以看成是 解密行为

1
2
3
4
// 解密行为
1 1 1 0 0 1 1 0 // 结果:密文
1 0 1 0 1 0 1 0 // B:密钥
0 1 0 0 1 1 0 0 // A:密文通过密钥处理之后又得到密文 A

电脑里的视频,图片,文本文件等如果要做加密,都是先转化为计算机识别的二进制数据,也就是 0 和 1 组成的数据,然后再做异或运算。

密钥

这个过程 B(密钥) 及其重要,加密时候使用它进行加密,解密也要使用它进行解密,如果你的密钥泄露了,那么别人就可以轻而易举的破解你的加密信息。

1.3 当前使用的对称加密算法

异或运算只是对称加密的最底层,实际使用的对称加密算法都是在这基础上发展的,并且要复杂的多,这里介绍这个是为了以后吹逼的时候增加光环属性。

前面介绍了异或运算加/解密消息,那么加密算法如何理解呢。比如有个算法对消息进行 16 次异或操作,这是一种算法,另一个将消息拆分两半,只对其中一半进行加密,这又是一种加密算法。

个人总结:加密算法就是加密的具体行为。比如上面使用异或运算加密中,异或加密这个行为就是个算法。对于消息加密,只有同时知道 加密算法密钥 这两个东东才能正确得到明文。

  • DES 对称加密算法

DES 加密算法是 1977 年美联邦使用的标准,在那个年代被政府和银行广泛使用。

老外整出了加密算法之后,为了验证加密算法的安全性,会定期举办个密码比赛邀请全世界的密码学大师来破译加密算法。在 1999 年举办的 DES challenge 第三次比赛中被人用了 22 个小时就给破译了(在 1997 年举办的 DES challenge 第一次比赛就被人用 96 天给破译了),自此之后安全性存在严重问题,新的加密算法应运而生。

  • 三重 DES 对称加密算法

由于 DES 存在安全性问题,不久 三重 DES 加密算法 就诞生了,在 DES 基础上做细微修改,并且重复三次 DES 加密,所以叫 三重

当然,DES 底层做了 16 次异或运算,三重 DES 也就做了 48 次异或运算(不仅仅做异或运算,还有其它行为),运算次数变得更复杂,导致加/解密速度并不高。有了不爽的东西人们就会寻求替代品。

  • AES 对称加密算法

1997 年的时候,米国标准化机构 NIST 对外海选新的加密算法,以求替代 DES 带来的尴尬境遇。并提前指定了新的密码算法的名称就叫做 AES

直到 2000 年,在世界各地的密码学专家竞争中,最终筛选出 15 个最终可能选择的加密算法;这 15 个加密算法经过又一轮的生死搏杀,最终比利时密码学家带来的加密算法 Rijndael 成为 AES 的最终选择。

最在用的最多的对称加密算法还是 AES,当然没有绝对安全的算法,被破解也是时间问题,只不过这个时间来的会比较晚一点。

1.4 对称密码实际应用中的缺陷

办公室

你将用对称密码加密后的纸条扔给你的同事,他需要知道密钥才能解密出明文,由于你们都在一个办公室里,可以很方便的告诉他密钥是什么(这里举例好傻,都能告诉他密钥是啥了,怎么不直接告诉他明文信息,只是举例而已~~)。

如果你在上海,你的好朋友在北京,你用对称加密给他写了封信,你的好朋友需要密钥,你只好将密钥与信件一起塞进信封寄给好朋友。这样又显得很傻,信件被任何人拿到都可以通过密钥得到明文,加密失去意义。

很不爽,去叫人

最初看到这个场景的时候,我没忍住破口大骂,花了十分钟读到这里原来是个自相矛盾的东东,纯属浪费时间。对称加密的密钥传递是个老大难的问题,但可以通过其它技术弥补

2. 公钥加密(也叫非对称加密)

公钥加密,私钥解密。

3. 单向散列函数

3.1 什么是单向散列函数

是个函数,有一个输入值和一个输出值,输入值不管是什么,输出值总是固定长度的字符串,而且不可逆向推理。不管是对称加密还是公钥加密,加密后的密文都是可以解密得到明文的,但是单向散列函数处理之后得到的值是不可能反向推理的,这一特点决定了它在特定场景的用处。

4. 消息认证码

5. 数字签名

6. 数字证书

首页
友链
归档
dkvirus
动态
RSS