- 从明文通信到对称加密
- 非对称加密(公钥加密)
- 混合密码系统
- 单向散列函数——文件被修改了吗?
- 消息认证码——消息是伪装者发的吗?
- 数字签名——消息到底是谁写的
- 证书——公钥合法了
从明文通信到对称加密
明文通信
为什么要加密呢?不妨先看看明文通信
Eve 可以直接窃听到Alice与Bob的通信过程,通过抓包就可以查看到通信内容,如果邮件内容是羞答答的,怎么可以被其他人看到呢?(邪魅微笑)
在逼格满满的咖啡厅,你正在愉快的刷着微博,逛着知乎,浏览豆瓣,你以为你连着免费WiFi爽歪歪,
图,喝咖啡,玩手机
然后其实被他笔记本造的WiFi,
图,黑客
顺便一提,关于抓包,现成的抓包工具很多,如 wireshark,charles 等,这里有一篇使用charles抓APP包的文章,要不要 看看
开始加密
凯撒密码(字母代换)
将一个字母表向指定方向平移N位,解密反之,N为密钥 。
密钥只可能是0-25共26个,用1-25每个数作为密钥尝试解密,很容易发现明文,从而得出密钥是几。(暴力破解)
简单替换密码
两个字母表中字母之间随机一一对应, 密钥是替换表。
密钥空间是 26!= 2^88。所以考虑使用(频率破解)。
对称密码标准
- DES(Data Encryption Standard)(不再推荐)
- AES(Advanced Encryption Standard) (应该使用)
AES
目前采用的是Rijndael
算法,Rijndael
的分组长度可以是以32bit为单位在128到256范围内选择。目前AES 规定分组长度只能有128,192,256三种。
AES 一轮的步骤:
- 加密:SubBytes —> ShiftRows —> MixColumns —> AddRoundKey
- 解密:AddRoundKey —> InvMixColumns —> InvShiftRows —> InvSubBytes
其中步骤的含义为:
- SubBytes: 每个字节的值(0-255的任意值)为索引,从一张拥有256个值的替换表(S-Box)中查找对应的值处理。将一个1字节的值替换成另一个1字节的值。
- ShiftRows:将4个字节为单位的行(Row)按照一定的规则左平移。
- MixColumns:将一个4字节的值进行比特运算,变成另一个4字节的值。
- AddRoundKey :将MixColumns的输出与轮密钥XOR。
对称加密
Alice 和 Bob 使用相同的秘钥来加解密消息,也就是对称加密,上面提到的加密算法都是对称加密。
这样,即使第三者 Eve 窃听到通信过程,那么 Eve 也只能看到奇奇怪怪符号组成的密文
这样Alice和Bob就可以放心的互相通信了吗?对啊!当然不是,这只是解决了机密性的问题,对称加密的密钥需要被发送给对方,对方才能解密,但直接发送,秘钥也会被窃听,这就是秘钥配送问题。
解决秘钥配送
- 事先当面将秘钥给对方,不通过网络传输秘钥,避免了被窃听的机会;
- 通过密钥分配中心解决;
- 通过 Diffie-Hellman 密钥交换来解决;
- 通过公钥密码来解决。
非对称加密(公钥加密)
简述
公钥加密又叫非对称加密,这类加密算法中存一对秘钥:
- 公钥——用来加密信息,公开给任何人
- 私钥——用来解密信息,自己私藏
公钥和私钥匙是天生一对,一个确定的公钥加密的信息,只有他的私钥才能解密信息。
使用公钥加密对信息进行加密通信的流程如下:
公钥算法——RSA
RSA是一种非对称加密算法,是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的,并以他们名字的首字母命名。
name | VALUE |
---|---|
秘钥 | 数 E 和 数 N |
秘钥 | 数 D 和 数 N |
加密过程 | $$ 密文 = (明文^E) mod(N )$$ |
解密过程 | $$ 明文 = (密文^D) mod (N )$$ |
原理详情:
缺陷
加密运算强度大,费时间,比如RSA加密过程是对明文求指数运算后再取模,这显然比AES运算量要大。有何优化方案吗?有,结合对称加密与公钥加密。
混合密码系统
加密
解密
单向散列函数——文件被修改了吗?
概述
网络下载软件,或者传输文件,如何验证没有被第三方篡改呢?即是数据的的完整性(intergrity),也称一致性。
单项散列函数就是生成文件“指纹”的方法。单项散列函数也称为消息摘要函数(message digest function
),哈希函数,杂凑函数。
性质
- 根据任意长度的消息计算出固定长度的散列值。
- 能快速计算出散列值。
- 抗碰撞性,消息不同,散列值也不同。
- 具备单向性,根据散列值无法计算出消息。
举例
MD5
MD5(Message Digest):一般128位的MD5散列被表示为32位十六进制数字,例如
9e107d9d372bb6826bd81d3542a419d6 = MD5("The quick brown fox jumps over the lazy dog");
其强抗碰撞性已经被攻破,已经不再安全。
SHA-1/2/3 (Secure Hash Algorithm)
sha1: 已经被列为“可谨慎运用的密码清单”,为了保持兼容性才使用;其强抗碰撞性已经 被攻破。
sha2:由 SHA-256 和 SHA-512衍生出6种版本,显然鉴于内部状态,SHA-256系列更适合32位CPU。
名称 | 输出长度 | 内部状态长度 | 备注 |
---|---|---|---|
SHA-224 | 224 | 32 * 8 = 256 | 将SHA-256的结果截掉32比特 |
SHA-256 | 256 | 32 * 8 = 256 | |
SHA-521/224 | 224 | 64 * 8 = 512 | 将SHA-512的结果截掉288比特 |
SHA-512/256 | 256 | 64 * 8 = 512 | 将SHA-512的结果截掉256比特 |
SHA-384 | 384 | 64 * 8 = 512 | 将SHA-512的结果截掉128比特 |
SHA-512 | 512 | 64 * 8 = 512 |
sha3:2012年选拔出名为Keccak的算法作为sha3,结构完全不同sha-2,适用各种设备,硬件上实现性能高,更安全。
不能解的问题
使用单向散列函数能实现完整性的检察,但是有些如果主动攻击者Mallory伪装成Alice,向Bob同时发送了消息和散列值。这时Bob能通过单向散列函数检察消息的完整性,但是却没能识别出这条消息是Mallory伪装成Bob发送的,无法被认证。
消息认证码——消息是伪装者发的吗?
消息认证码(Message Authentication Code) 是一种与密钥相关联的单项散列函数。
-
要计算MAC值必须持有共享密钥,MAC正是利用这一性质确认完整性的。
-
只有通信双方才能持有共享密钥,密钥配送问题可以使用公钥密码,Diffie-Hellman密钥交换,密钥分配中心等来解决。
无法解决的问题
重放攻击
消息认证码解决了完整性与伪装问题,仍然无法解决“对第三方证明”和“防否认”问题。这就需要数字签名来解决。
数字签名——消息到底是谁写的
概述
设想要防否认,只要签名只能由消息发送者生产就OK了。
数字签名对签名者的秘钥和验证者的秘钥进行了区分,使用验证签名无法生产签名。签名秘钥只由签名者持有。
这和公钥密码有点相似了。事实上,签名就是公钥密码“反过来”实现的。
对于消息签名,速度太慢,因为每个消息的散列值是不一样的,所以一般只需要对消息的散列值进行签名就可以了。
应用举例
- 信息安全公告。
- 软件下载。
- 公钥证书。(得到合法的公钥)
- SSL/TLS。
无法解决的问题
通过对散列值签名我们可以解决完整性,篡改,伪造问题,但是用于验证签名的公钥是否是真正的发送者的呢?中间人可以用自己的私钥签名,并把自己的公钥发送给接受者。
为验证公钥是否合法,我们需要使用证书。
证书——公钥合法了
证书就是我们信任的第三方对发送者的公钥加上了他们的数字签名。相当于身份证一样的东西。这里的第三方包括例如赛门铁客等机构,也可以是自己组织内部成立的一个机构。
证书主要包含:
- 证书序号。
- 证书颁发机构。
- 公钥所有者。
- SHA-1 指纹。
- MD5指纹。
- 证书ID。
- 有效期起始时间。
- 有效期结束时间。
- 散列算法。
- 秘钥ID。
- 秘钥用途。