加密算法
哈希函数和 SHA256
哈希函数(Hash),也称为散列函数或散列算法,是一种从任何一种数据中创建小的数字 “指纹” 的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。
原始数据 --- 输入 --> 哈希函数 --- 输出 --> 数据指纹
一般的,
- 哈希函数是一种数据转换函数,将输入(原数据)映射成输出(索引)
- 设计良好的哈希函数,对不同的输入,会得到不同的输出
- 哈希函数能压缩输入数据,生成固定长度的输出
- 计算过程不可逆,是输入到输出的单向函数
哈希函数的概念非常宽泛,是一类算法的统称,常见的哈希函数有 MD5、SHA 等。
SHA(Secure Hash Algorithm,安全散列算法)是一个密码散列函数家族,由美国国家安全局(NSA)设计,并由美国国家标准与技术研究院(NIST)发布,是美国的政府标准。SHA 家族包括 SHA-0、SHA-1、SHA-2 和 SHA-3 四个函数系列。SHA256 是 SHA-2 系列的函数。
对于 SHA256,
- 无论输入多长,都输出 64 个字符,共 32 字节(byte),256 位(bit)
- 输出只包含数字 0 ~ 9 和字母 A ~ F, 大小写不敏感
非对称加密和签名认证
现代密码学中,加密算法包括两部分。
- 算法,一组规定如何进行加解密的规则,描述加解密的具体操作步骤。为了方便使用及保证算法可靠性,算法都是公开的
- 密钥,用于算法的 秘密参数
在对称加密中,无论加密还是解密,都使用同一个密钥。因此,
- 对密钥的保护十分重要,泄露则意味着通信密文不再安全
- 通信双方在交换密钥时,特别是在公开的、不可信的链路(互联网)上交换密钥时,要确保密钥从未泄露(Diffie-Hellman 密钥交换算法)
受 Diffie-Hellman 密钥交换算法的启发,人们意识到加密和解密可以使用不同的密钥,只要这对密钥有某种对应关系即可。
这种新的加密模式被称为 非对称加密 ,
- 有两把密钥,一把是公开的公钥,还有一把是不公开的私钥
- 公钥和私钥一一对应,有一把公钥就必然有一把与之对应的、独一无二的私钥,反之亦成立
- 同时生成公钥和私钥应该相对容易,但从公钥推算私钥应是极其困难或是不可能的
- 所有的密钥对(公钥和私钥)都是不同的
- 用私钥可以解开公钥加密的消息,反之亦成立
加密和解密
韩梅梅事先生成好了一对密钥,并只公开了自己的公钥。
李雷想加密发送给韩梅梅的消息,需要
- 用韩梅梅的公钥,加密要发给韩梅梅的信息,将密文发送给韩梅梅
- 韩梅梅收到密文后,用自己的私钥解密
这段密文只有用对应的私钥(韩梅梅的私钥)才可以解密。只要韩梅梅的私钥没有泄露,这段密文就只有韩梅梅能解开,即使其他人获得密文,也无法解密。
常用的非对称加密算法有 RSA、ElGamal、ECC 等。
摘要和签名
举个栗子。李雷写了一张纸条,让同桌传给韩梅梅,纸条内容为
韩梅梅,我是李雷,我喜欢你。
对通信的双方,
- 要保证纸条在传递过程中未经改动(内容的完整性)。当内容被篡改时,接收方可以发现
- 接收方能确定纸条来自发送方,而不是他人冒充(授权和身份认证)
用更简单些的文字来描述整个过程,通信的双方都知道,
- 发送方认可消息的内容
- 接收方能确定消息来源
- 消息在整个通信过程中未经改动
为了实现上述需求,李雷需要
- 将纸条内容 哈希(Hash),得到 摘要 (Digest)
- 用自己的私钥 “加密” 摘要,得到 签名 (Signature)
- 让同桌传递纸条和签名
韩梅梅收到纸条和签名后,
- 用李雷的公钥,对签名 “解密”,得到摘要 [1]
- 将纸条内容哈希,得到摘要 [2]
- 比较摘要 [1] 和 摘要 [2] 的内容是否一致
如果内容相同,则说明纸条确实由李雷所写,且内容未经改动。这是因为,
- 李雷的私钥只有他自己拥有,用私钥(李雷的私钥)“加密” 的内容(签名)只有用对应的公钥(李雷的公钥)才能解开(身份认证)
- 哈希函数的特性保证,如果纸条内容在传递过程中改变,则得到的摘要 [2] 一定与摘要 [1] 不同(完整性)
总结
对于双钥系统,加密解密时,
- 公钥用于加密,私钥用于解密
身份认证时,
- 私钥用于签名,公钥用于验证
参考
- 在线计算工具
- 维基百科,散列函数
- 维基百科,SHA 家族
- RSA 算法原理(一),阮一峰
- RSA 算法原理(二),阮一峰
- 数字签名是什么?,阮一峰
- 密码学笔记,阮一峰
- 程序员之网络安全系列
- [学习笔记] 哈希函数和 SHA256