密码知识学习
1. 概述与基本理论
1. 加密与解密
加密(encrypt)之前的消息叫做明文(plaintext),加密之后的消息叫做密文(ciphertext)。接收方需要对加密后的消息进行解密(decrypt)后才能阅读。这样,通过密码(cryptography),技术,保证了消息的机密性(confidentiality)。
接收者以外的人试图将密文还原为明文,称为密码破译(cryptanalysis),简称破译,也被称为密码分析。进行破译的人称为破译者(cryptanalyst)。
不要试图通过对密码算法本身进行保密来确保安全性的行为(即通过隐蔽式安全性,security by obscurity)。
2. 对称密码和公钥密码
加密步骤 → \rightarrow →加密算法;解密步骤 → \rightarrow →解密算法。加密、解密的算法合在一起称为密码算法。
密码算法中需要密钥(key)。一种密码能够使用的“所有密钥的集合”被称为密钥空间(keyspace)。将密码算法与密钥分开考虑,就解决了希望重复使用,但重复使用会增加风险这一难题。
对称密码(symmetric cryptography)是指在加密和解密时使用同意密钥的方式,也被称为私钥密码(secret-key cryptography)、公共密钥密码(common-key cryptography)、传统密码(conventional cryptography)、共享密钥密码(shared-key cryptography)。
非对称密码(asymmetric cryptography)是指加密和解密时使用不同密钥的方式,也被称为公钥密码(public-key cryptography)。
3. 其他密码技术
- 单向散列函数(one-way hash function):检测数据是否被篡改。保障数据的完整性(integrity),即“数据是正牌的而不是伪造的”这一性质。一个经典的应用就是软件发布者在发布软件的同时会发布该软件的散列值,下载软件的人通过自行计算所下载软件的散列值,检测是否一致。
- 消息验证码(message authentication code):确认消息是否来自所期望的通信对象。保证完整性,提供认证(authentication)机制。
- 数字签名(digital signature):防止伪装(spoofing)、篡改、否认(repudiation)的技术。
- 伪随机数生成器(Pseudo Random Number Generator,PRNG):一种能够模拟产生随机数列的算法。例如在进行SSL/TLS通信时,会生成一个仅用于当前通信的临时密钥(会话密钥),该密钥就是由伪随机数生成器生成的。
4. 隐写术和数字水印
隐写术(steganography):目的是隐藏消息本身。如果搞清楚嵌入消息的方法,也就可以搞清楚消息的内容。所以,隐写术并不能代替密码。
数字水印:将著作权所有者和购买者的信息嵌入到文件中的技术。
2. 历史上的密码
-
凯撒密码(Caesar cipher):通过将明文中所使用的字母表按照一定的字数“平移”来进行加密。其中,平移的字母数量就相当于密钥。
凯撒密码可以通过将所有可能的密钥全部尝试一遍来进行破译,被称为暴力破解(brute-force attack,又被称为穷举搜索)。 -
简单替换密码(simple substitution cipher):将明文中所使用的字母表替换为另一套字母表的密码。
简单替换密码可以通过频率分析的密码破译方式进行破译。
-
Enigma:纳粹时期,德国国防军使用的加/解密机器。
3. 对称密钥(共享密钥密码)
3.1 一次性密码本
一次性密码本的原理是“将明文与一串随机的比特序列进行XOR运算”,是一种非常简单的密码,但却无法破译。其无法破译的原因是——即使对一次性密码本的密文进行暴力破解,虽然总有一天会尝试到和加密时相同的密钥,但无法判断它是否是正确的密文。因为,在解密的过程中,所有的64比特的排列组合都会出现,比如密文midnight,暴力破解可能得到onenight等字符,导致无法破译。
- 性质:无条件安全(unconditionally secure),在理论上是无法破译的(theoretically unbreakable)。
- 无法被使用的原因:
- 密钥的配送:密钥需要“安全”的配送,但如果可以安全的发送密钥,那明文不也已经可以安全发送了吗?
- 密钥的保存:密钥的长度必须和明文的长度相同。也就是说,只是将“保护明文”这一命题替换成了“保护和明文一样长的密钥”而已。
- 密钥的重用:绝对不能重用过去的随机比特序列。因为作为密钥的比特序列一旦暴露,之前所有的机密通信内容将全部被解密。
- 密钥的同步:当明文很长,密码本的密钥也会跟着变长。且在通信过程中,发送者和接受者的密钥的比特序列不允许有任何错位,否则错位的比特后的所有信息都将无法解密。
- 密钥的生成:密钥必须是真正的随机数,而不能是伪随机数。
3.2 DES(Data Encryption Standard)
1. DES原理及算法实现
破解:可以使用差分分析和线性分析的方法进行破解,二者均属于选择明文攻击(Chosen Plaintext Attack, CPA),即假设密码破译者可以选择任意明文并得到其加密的结果。
2. 三重DES(triple-DES, TDEA, Triple Data Encryption Algorithm)
注意:
- 如果密钥1、密钥2、密钥3均相同,三重DES就等同于普通的DES。这么设计是为了让三重DES能够兼容普通的DES;
- 如果密钥1和密钥3相同,密钥2不同 → \rightarrow →DES-EDE2(EDE表示 E n c r y p t i o n → D e c r y p t i o n → E n c r y p t i o n Encryption \rightarrow Decryption \rightarrow Encryption Encryption→Decryption→Encryption);
- 如果密钥1、密钥2、密钥3各不相同 → \rightarrow →DES-EDE3。
3.3 AES(Advanced Encryption Standard)
使用的是Rijndael算法,在AES的规格中,分组长度固定为128比特,密钥长度只有128、192和256比特三种。由于Rijndael的公式能够通过数学运算来求解,所以意味着Rijndael算法理论上可以通过数学方法进行破译,但目前还没有出现针对Rijndael的有效攻击(使用AES-128可以通过量子计算机破译,AES-256还未被破译)。
4. 分组密码的模式
4.1 分组密码与流密码
-
**分组密码(block cipher)**每次只能处理特定长度的一块数据的一类密码算法。这里的“一块”就称为分组(block)。此外,一个分组的比特数就称为分组长度(block length)。 → \rightarrow →不需要通过内部状态来记录加密的进度。
例如,AES的分组长度为128比特,所以AEC一次可加密128比特的明文,并生成128比特的密文。
-
**流密码(stream cipher)**是对数据流进行连续处理的一类密码算法。流密码中一般以1比特、8比特或者32比特等单位进行加密或解密。 → \rightarrow →需要保持内部状态。
例如,一次性密码本属于流密码。
4.2 模式(MODE)
对分组密码算法进行迭代的方法就称为分组密码的模式(mode)。
- 明文分组:指分组密码算法中作为加密对象的明文。明文分组的长度与分组密码算法的分组长度是相等的。
- 密文分组:指使用分组密码算法将明文分组加密之后所生成的密文。