me
me copied to clipboard
读书笔记: 图解密码技术
第一章: 环游密码世界
- 口令: password, passcode, pin
- 编码: encoding
- 密码: cryptography
- 过程: 将明文(plaintext)通过加密算法(encryption algorithm)加密(encrypt)后得到密文(ciphertext), 然后解密(decrypt)再次得到明文(plaintext)
- 密码算法: 用于解决复杂问题的步骤称之为算法(algorithm)。加密,解密的算法和在一起统称为密码算法
注:
- PIN(personal identification number),多指数字密码,银行卡的6位数字密码,包括iPhone锁屏都是PIN code,而普通字母的都是叫做Password。
密钥
- 密钥 (key): 和现实世界的🔑类似, 密码算法都需要密钥
- 对称密码 (symmetric cryptography): 加密和解密时使用相同的密钥
- 非对称密码 (asymmetric cryptography): 加密和解密使用不同的密钥,也称为公钥密码(public-key cryptography), 非对称密码出现在20世纪70年代, 这种方法在密码界引发了一场大变革。现在计算机和互联网的安全体系很大程度依赖于非对称密码
密码学家的工具箱 (6种)
- 对称密码
- 公钥密码
- 单向散列函数 (one-way hash function): 验证完整性
- 消息认证码 (message authentication code): 认证机制
- 数字签名 (digital signature): 确保内容完整性,提供认证并防止否认的密码技术
- 伪随机数生成器 (Pseudo Random Number Generator: PRNG)
其中对称和公钥主要针对内容加密,防窃听;单向散列是防篡改, 保证数据完整性;消息认证码用于认证;数字签名针对篡改、伪装和防否认。
第二章: 历史上的密码
历史上的几种著名密码:
- 凯撒密码 (Caesar cipher): 字母表平移, a>D, b>E, c>F, 平移的字母数量相当于密钥(key)
- 简单替换密码 (simple substitution cipher): a>X, b>C, d>Q, 替换表相当于密钥
- Enigma:
注: 密码算法和数学模型一样,需要算法和参数两个部分才能确定最终的变换方式。现实世界中锁的设计是公开的,但是钥匙是保密的。
第三章: 对称密码
XOR 运算
异或也称作二进制半加,即不进位加法。
比如1010 xor 1111 = 0101, 这时候将结果0101 xor 1111 = 1010, 你会发现两次异或可以还原明文。所以只需要选择一个合适的key (就比如刚才的1111) 就能形成一个高强度密码。
根据这个原理,就可以生成一个和明文长度相同的bits作为密钥, 然后通过xor得到密文, 然后再次xor就能解密,这个算法称之为一次性密码本 (也成为Vernam cipher),不过由于key过于长,虽然可以说是绝对安全,但是实际上是没有实用性。
DES
DES (Data Encryption Standard) 是1977年美国联邦信息处理标准(FIPS)中所采用的一种对称密码(FIPS 46-3)。DES一直以来被美国以及其他国家的政府和银行等广泛使用。DES的密文在现在已经可以在短时间破译,所以不应该再继续使用DES,了解一下原理即可。
DES通过一个64bit的key可实现对64bit的明文加密为64bit的密文,对于超过64bit的明文需分组加密,密码算法采用了Feistel 网络。
AES
主流对称算法: AES (Advanced Encryption Standard) 通过竞赛方式最终采用了Rijndael的对称密码算法。
第四章: 分组密码的模式
前面讲到DES/AES都是分组加密,这种分组模式被称为ECB(Electronic CodeBook),很容易被攻击,所以CBC, CFB等都采用一个初始化向量(iv, Initialization Vector)驱动后续加密依赖前一组的密文,这里需要注意的是iv需要每次加密随机产生不同的比特序列,否则一样容易被攻击。简单来说,不推荐ECB,推荐CBC,CFB,OFB,CTR这类带iv的。
尤其是在跨语言加密解密时,需要明确算法/模式/填充量,比如说AES/ECB/PKCS5Padding,AES是算法,ECB是模式,PKCS5Padding则是填充量,否则你怎么都对不上。
nodejs从10.0.0已经deprecate createCipher,转而使用createCipheriv,见[这里](Crypto | Node.js v14.1.0 Documentation),不过网上到处都是createCipher的文章,还是要懂点原理才能混。
参考:
第五章: 公钥密码
以投币储物柜来说,硬币是关闭储物柜的密钥,而钥匙则是打开储物柜的密钥,这就是现实世界对非对称一个很好的比喻。
公钥密码 (public-key cryptography)
从概念上来说,密钥(key)分为加密密钥和解密密钥,加密密钥是公开的,解密密钥只有自己持有,谁都可以拥有加密密钥对数据加密,但是只有我才能解密。
所谓的公钥(public key)就是指加密密钥,对应的私钥(private key)指解密密钥。public key和private key是一一配对的,一对public key和private key称为密钥对(key pair),在数学上,一次同时生成key pair,无法独立生成其中一个。
假设,A向B传送信息,则B生成一对key pair,将public key给到A,A将消息通过public key加密后传输给B,整个过程中即使存在中间人都没有关系,因为public key无法对密文解密,只有B通过private key才能解密。
这中间关键的算法就是RSA, RSA的加密过程就是对明文作E次方然后mod N,所以public key就是E和N两个参数,换句话说E和N构成了public key,也可以表示为public key {E, N}。解密则是对密文进行D次方然后mod N。从数学角度来说,通过质数的特性产生了E, D, N,形成了一组key pair,我觉得到这就可以关闭了,后面都是大量数学道理,大家自己学习。
第二部分: 认证
第七章: 单向散列函数
单向散列函数 (one-way hash function) 的输入是消息(message),输出是散列值(hash value)。以SHA-256为例,不论输入有多长,输出的散列值长度固定为256bits,即32个bytes。
单向散列函数几种实现:
- MD4: Rivest于1990年实现, 128bits, 不安全
- MD5: Rivest于1991年实现, 128bits, 也已经被攻破, 不安全, MD: Message Digest
- SHA-1: NIST于1993年发布, 160bits, 不安全, 2005年被攻破
- SHA-2 (SHA-256, SHA-384, SHA-512): 安全
- SHA-3 (Keccak)
第八章: 消息认证码
消息认证码 (Message Authentication Code) 是一种确认完整性并进行认证的技术,简称MAC。简单来说MAC是一种带key的one-way hash。因为发送和接收方共同持有key,这样就可以验证消息来源。
第九章: 数字签名
数字签名 (digital signature) 是一种将相当于现实世界中的盖章,签字的功能在数字世界中进行实现的技术。使用数字签名可以识别篡改和伪装,还可以防止否认。
MAC是对称算法,而数字签名则是非对称算法,和之前的public-key相反,通过private-key作加密,通过public-key作解密,这样就实现了无法抵赖的功能。换句话任何人持有public-key都可以解密,但只有持有private-key的人才能加密。
A对文件X签名的基本流程如下:
- A生成key pair (private-key, public-key)
- 首先计算文件X的one-way hash, 比如SHA-256,然后对hash通过private-key加密得到签名
- 将文件X和签名两个东西同时发给B
- B通过public-key解密得到A计算的hash,和文件X的hash进行比对,如果一致就可以认定是A的签名
第十章: 证书
这里的证书指公钥证书(Public-Key Certificate, PKC), 对public-key的一个标准封装,比如X.509,同时认证机构(Certification Authority, Certifying Authority, CA)对此进行数字签名,以此表明这是这个证书内的pubilc-key确实是某某某的public key。
如果没有CA背书(签名),则可以随意欺骗用户说这个public-key是某某某的,所以需要CA居中协调。
公钥基础设施 (Public-Key Infrastructure) 是为了运用公钥制定的一系列规范和规格的总称,简称为PKI,其中包括了:
- 用户: 注册公钥,使用公钥
- 认证机构: CA
- 仓库: 保存证书的数据库,即证书目录
小结
参考阅读: