密码学(Cryptography)是数学的一个分支,是研究编制密码和破译密码的技术科学,其中应用于编制密码以保守通信秘密的,称为密码编码学,而应用于破译密码以获取通信情报的,称为密码分析学。密码编码学基于信息论、数学和计算机科学设计密码算法和密码协议以保证通信保密和安全,是信息安全和网络安全的重要组成部分,因此密码学的学习具有非常重要的价值和意义。
更新历史:
「密码学基础」系列文章将介绍密码学的基本概念和研究内容,文章将从以下几部分进行介绍:
文章中的算法具体实现主要用python3.9进行实现,少数部分用伪代码实现。课程的主要参考文献为:
[1]William Stallings. 密码编码学与网络安全.第8版[M]. 电子工业出版社, 2021.
为方便读者阅读,下面给出文章中可能出现的符号表,当然在文章中出现时还会另外说明,这里这是作一个汇总:
符号 | 符号说明 |
---|---|
Z Z Z | 整数, Z = { 0 , ± 1 , ± 2 , ± 3 , . . . } Z=\{0, \pm 1, \pm 2, \pm 3, ...\} Z={0,±1,±2,±3,...} |
Z + Z^ + Z+ | 正整数, Z + = { 1 , 2 , 3 , . . . } Z^+=\{1, 2, 3, ...\} Z+={1,2,3,...} |
N N N | 自然数, N = { 0 , 1 , 2 , 3 , . . . } N=\{0, 1, 2, 3, ...\} N={0,1,2,3,...} |
Z n Z_n Zn | 剩余类集 Z n = { 0 , 1 , 2 , . . . , n − 1 } Z_n=\{0, 1, 2,..., n-1\} Zn={0,1,2,...,n−1} |
ϕ ( n ) \phi(n) ϕ(n) | 欧拉函数,小于等于 n n n且与 n n n互素的正整数个数 |
∑ i = 1 n f ( i ) \sum_{i=1}^{n}f(i) ∑i=1nf(i) | 求和函数,计算 f ( 1 ) + f ( 2 ) + . . . + f ( n ) f(1)+f(2)+...+f(n) f(1)+f(2)+...+f(n) |
∏ i = 1 n p i \prod_{i=1}^{n}p_i ∏i=1npi | 累乘函数,计算 p 1 × p 2 × . . . × p n p_1\times p_2\times...\times p_n p1×p2×...×pn |
g c d ( a , b ) gcd(a,b) gcd(a,b) | 求 a a a和 b b b最大公因数 |
G F ( p ) GF(p) GF(p) | 阶为 p p p的有限域, p p p为素数,定义在 Z p Z_p Zp及其上的模 p p p运算 |
G F ( 2 n ) GF(2^n) GF(2n) | 阶为 2 n 2^n 2n的有限域 |
⊗ n \otimes_n ⊗n | 模 n n n乘法, a ⊗ n b = ( a × b ) m o d n a\otimes_nb=(a\times b)\;mod\;n a⊗nb=(a×b)modn |
⊕ n \oplus_n ⊕n | 模 n n n加法, a ⊕ n b = ( a + b ) m o d n a\oplus_n b=(a+ b)\;mod\;n a⊕nb=(a+b)modn |
m , M m,M m,M | M M M是明文空间(plaintext space),也称为消息(Message), m ∈ M m\in M m∈M |
c , C c,C c,C | C C C是密文空间(Ciphertext space), c ∈ C c\in C c∈C |
k , K k,K k,K | K K K是密钥空间(Key space), k ∈ K k\in K k∈K |
k U , k R k_U,k_R kU,kR | k U k_U kU是公钥(public key), k R k_R kR是私钥(private key) |
E k ( m ) E_k(m) Ek(m) | 用密钥 k k k对明文 m m m进行加密(Encryption) |
D k ( c ) D_k(c) Dk(c) | 用密钥 k k k对密文 c c c进行解密(Decryption) |
从战争年代的军事情报,到现代社会的电子设备上的各种密码,再到如今以及未来的云计算、区块链隐私保护,无处不体现着密码学的深刻影响。在历史上,密码学的发展大致可以分为两个阶段:
古典密码学像一门艺术,这个时期虽然出现了一些密码算法和加密设备,但密码算法设计的基本手段都很简单,以现在的眼光是极容易被破译的。古典密码学主要包含以下几个方面:
而现代密码学更像是一门科学,其起源于20世纪诸多科学理论。1949年,Shannon发表了《The Communication Theory of Secrecy Systems》,定义理论安全性,提出扩散和混淆原则,这也直接奠定了密码学的理论基础,密码学走进了科学的殿堂,近现代密码学正式建立。现代密码学主要包含以下几个方面:
在未来,随着量子计算机的形成和发展,大多数密码算法都受到很大的威胁(包括RSA算法),因此后量子密码也称成为密码学领域研究的热点,美国国家标准和技术协会也正在征集后量子密码方案以抵御之后可能出现的密码学危机。
密码学的历史告诉人们现有的密码算法总是不安全的,在未来新的技术出现后总是会受到安全方面的威胁,先简单看一下在密码算法中存在哪些安全问题,不过这还得从通信模型谈起。
在通信理论中,通信系统的模型往往抽象为下图,其中信源产生信息,信息经过编码后在信道上传播,然后解码后传输到接受信息的信宿,在信道传播过程中有噪声等干扰源会影响信息在信道的传播。
以打电话为例,上述的模型就对应于通信双方打电话,信源即为说话的人,信宿即为听电话的人,而信道则可能为电缆、光缆等有线信道、卫星通信等无线信道。在信道上,声音需要被编码为电磁波通过信道传输,再被解码为声音给接收方,这就是一个典型的例子。
而在密码学中,最经典的一个场景就是双方进行通信(比如双方发短信、打电话),出于隐私的考虑,总是希望自己的重要信息(如手机密码、银行卡密码等)不被其他人获取,因此总是要求信道是安全可靠的。不过,如果对于每个通信双方都要求信道是安全的,则需要对信道进行保护从而使得通信效率降低,现代通信中往往认为信道是不安全的,攻击者可以进行窃听、伪装等攻击,因此有一个结论:通信系统模型是不安全的。
而密码学正是保证即使信息在不安全的信道上传输都不会泄露原始信息,下面给出了一个十分常见的场景。考虑这样一个场景:Alice想发一段消息给Bob,但不想其他人看到,因此她可以采用下面的方式:Alice准备好一段消息(message),也称为明文(plaintext),在发送前利用密钥(key),使用加密函数(encryption function)将明文加密成密文(ciphertext),密文传送到Bob后,Bob利用密钥,通过解密函数(decryption function)将密文转换为明文,然后获得该消息。但是由于信道不安全,因此很有可能会被窃听者(eavesdropper)窃听信道。上面的过程用下图进行表示:
上图就是一个典型的保密通信系统模型,通过加密信息,即使窃听者获得信息,也会发现这些信息是加密的,无法从中获得任何有效的信息,因此这个通信系统可以达到一定的安全目标。不过一些优秀的密码分析者总是能够发现其中的漏洞,并能破译信息,这也是密码算法和协议不断发展的一大动力。
至此,利用加密消息可以使得通信系统具有一定的安全性,但这还不够,因此还需要设计更加安全的密码算法和协议。任何密码算法和协议都是基于一定场景的,比如上面的场景就是允许有窃听者的存在,只有通信双方两者进行通信等。为了从中抽象出最需要关注的部分,常常考虑下面的要素,这些要素构成了密码系统:
因此密码系统就可以由五元组 < M , C , E , K , D >
密码系统的安全性是和攻击者的存在有很大关系的,在理想的密码系统中,没有上图中的窃听者存在,但实际的密码系统中,往往有一些攻击者对密码系统进行各种各样的攻击,密码算法和协议设计人员不同的场景作出关于攻击者的合理假设,下面就阐述了需要考虑的一些攻击形式。
上述的窃听者(eavesdropper)是一个被动攻击者(passive attacker),因为该攻击者只是窃听信道中的信息,对于主动攻击者(active attacker),他们的危害更大。下面就介绍一下主动攻击和被动攻击:
被动攻击一般难以检测到,因为大多数信道都是不安全的,无法防止第三方窃听信道,不过可以预防,通过对数据进行加密,窃听到的数据都是密文,而没有实际意义,这样就可以窃听者的攻击,不过这种方式不能抵御流量分析。
而主动攻击的重点在于检测,即一旦检测到攻击者对于密码系统进行攻击,就采取相应恢复措施,以主动攻击者的进一步攻击。
现代密码学的加密体制,根据使用加密密钥的数量主要可以分为三类:
无密钥加密体制中,往往使用确定性函数,其中最重要的就是加密哈希函数(Hash function),其可以将变长的信息文本转化为定长的哈希值,常用于消息认证码和数字签名。
单密钥加密体制,也称对称加密,其加密和解密中使用同一密钥,而该密钥是不公开的,通信双方通过该密钥来对信息进行加密和解密,在这里加密算法和解密算法往往是互逆的,即有 D k ( E k ( m ) ) = m D_k(E_k(m))=m Dk(Ek(m))=m。
双密钥加密体制,也称为公钥加密,加密和解密中使用一对不同的密钥,称为公钥(public key,用 k U k_U kU表示)和私钥(private key,用 k R k_R kR表示),其中公钥公开,而私钥不公开。公钥加密有两种形式:
密码算法和协议
尽管在此之前都没有区分过密码算法和密码协议,但了解它们之间的关系是有必要的,前述介绍了许多密码算法,包括古典密码算法、现代加密算法等。而密码协议主要由密码算法设计而成,在网络环境中提供各种安全服务。可以简单地认为密码算法解决了数据保密的问题,而密码协议则要利用密码算法设计协议解决通信过程中的其他问题,比如密钥怎么发送给通信双方(密钥分发),怎么确保通信的一方是预期的一方(身份认证)等等。
在这里列出的概念没有也很难涉及密码学的所有领域,不过可以对密码学作出一些思路上的梳理和总结:
出于效率的考虑,通信系统很多时候是不安全的,因此才需要密码算法和协议来构建保密通信系统,从而如何构造足够安全的密码算法以及设计合理的密码协议成为了密码编码学的重要内容,从典型的通信系统模型上可以抽象出组成密码系统的五个部分,一个好的密码算法往往是利用信息论、数学理论来设计一个计算上安全的密码算法来保证密码系统的五大部分正常运行。现代密码学家对此作了许多的工作,发展出对称加密算法、公钥加密算法等经典算法,基于此,密码协议通过利用这些加密算法体制为通信提供安全服务来保证双方或多方参与网络通信时能够正常有序地进行下去。
之后的学习中,将在掌握基本的数学背景知识后,学习对称加密和非对称加密的思想和具体实现,最后基于经典加密算法学习常见的加密算法和协议,如密码学哈希函数、消息认证码、数字签名等。除此之外,后量子密码也会进行一些关于概念上的阐述。