me icon indicating copy to clipboard operation
me copied to clipboard

读书笔记: 图解密码技术

Open nonocast opened this issue 4 years ago • 0 comments

第一章: 环游密码世界

  • 口令: 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
  • 仓库: 保存证书的数据库,即证书目录

小结

参考阅读:

nonocast avatar Apr 27 '20 17:04 nonocast