注:以下内容参考《新编密码学》范九伦 张雪锋 侯红霞 编著
第1章 绪论
1.1 概述
密码学研究密码编码与破译的技术与方法。编码学研究如何编制密码实现保密通信,破译学研究如何破译密码获取通信信息,两者统称为密码学。David Kahn 将其定义为:"Cryptology, the science of communication secrecy"。
密码学用于防止未授权第三方窃取信息,还可用于信息鉴别、数据完整性检验、数字签名等。其发展经历了三个阶段:
第一阶段(古代--1949年):分为手工密码和机器/电子时代。手工密码的代表有凯撒密码(单字母替代加密)。机器时代的代表是ENIGMA密码机(1919年德国发明,二战期间广泛使用)。此阶段加密手段仍以替代和换位为主,安全性较低。
第二阶段(1949--1975年):Shannon 发表《Communication Theory of Secrecy Systems》,奠定了密码学的科学理论基础。研究成果主要服务于军事领域,公开文献稀少。
第三阶段(1976年至今):公钥密码体制的提出和DES的问世标志着现代密码学的诞生。Diffie 和 Hellman 证明了无需密钥传输的保密通信可能,开创了公钥密码学。现代密码学融合数论、代数、量子力学等多学科知识。
1.2 保密通信的基本模型

通信双方 Alice 和 Bob 在不安全信道上通信,攻击者 Oscar 试图窃取信息。Alice 使用密钥对明文加密得到密文,Bob 用相同或对应的密钥解密恢复明文。
1.3 密码学的基本概念
-
对称密码算法:加密密钥与解密密钥相同或可相互推导,安全性依赖密钥管理。
-
非对称密码算法(公钥密码):加密密钥(公钥)可公开,解密密钥(私钥)保密。
密码体制定义:由明文空间 M、密文空间 C、密钥空间 K、加密算法集 E、解密算法集 D 构成,满足对任意 key∈K,存在 ekey∈E,dkey∈D,使得 dkey(ekey(x))=x。
密码分析攻击方法(Kerckhoffs原则:攻击者已知加密算法,仅未知密钥):
-
唯密文攻击:攻击者有一些消息的密文,这些密文都是用相同的加密算法进行加密得到的。攻击者的任务就是恢复出尽可能多的明文,或者能够推算出加密算法采用的密钥,以便可以采用相同的密钥解密出其他被加密的消息。
-
已知明文攻击:攻击者不仅可以得到一些消息的密文,而且也知道对应的明文。攻击者的任务就是用加密信息来推算出加密算法采用的密钥或者导出一个算法,此算法可以对用同一密钥加密的任何新的消息进行解密。
-
选择明文攻击:攻击者不仅可以得到一些消息的密文和相应的明文,而且还可以选择被加密的明文,这比已知明文攻击更为有效,因为攻击者能够选择特定的明文消息进行加密,从而得到更多有关密钥的信息。攻击者的任务是推算出加密算法采用的密钥或者导出一个算法,此算法可以对用同一密钥加密的任何新的消息进行解密。
-
选择密文攻击:攻击者能够选择一些不同的被加密的密文并得到与其对应的明文信息,攻击者的任务是推算出加密密钥。
习题1
1-1 衡量密码体制安全性的基本准则有哪些?
衡量密码体制安全性的基本准则主要包括:
-
计算安全性:破译密码所需的计算资源(时间、存储空间)远远超出攻击者的能力范围。通常用计算复杂性理论来衡量。
-
可证明安全性:将密码体制的安全性归约到一个已知的、公认的数学难题(如大整数分解、离散对数问题)上,证明破译该体制至少和解决该数学难题一样困难。
-
无条件安全性:即使攻击者拥有无限的计算能力,也无法从密文中获取关于明文的任何信息。这种安全性不依赖于计算假设,例如"一次一密"密码体制。
此外,一个实用的密码体制还应满足Kerckhoffs原则:系统的安全性应仅依赖于密钥的保密,而不依赖于算法的保密。
1-2 谈谈密码在实现保密通信中的作用。
在保密通信中,密码的核心作用是将可读的明文转换为不可读的密文,从而保护信息在传输过程中的机密性。具体作用如下:
-
防止窃听:即使攻击者截获了密文,由于没有正确的密钥,也无法恢复出原始信息。
-
身份认证:结合数字签名等技术,可以验证通信双方的身份,防止冒充。
-
完整性校验:确保信息在传输过程中未被篡改。
-
不可否认性:防止发送方事后否认其发送过该信息。
1-3 密码学研究的主要问题是什么?
密码学研究的主要问题是:
-
密码编码学:研究如何设计和分析用于保护信息机密性、完整性和真实性的密码算法和协议。核心是构造安全、高效的加密、解密、签名和认证方案。
-
密码分析学:研究如何破解现有的密码体制,即在不知道密钥的情况下从密文中恢复明文或找出密钥。通过分析攻击方法,可以评估和提升密码体制的安全性。
简单来说,就是研究"如何加密"和"如何破译"。
1-4 谈谈你所了解的密码学的应用。
密码学在现代信息社会中应用极其广泛,几乎无处不在:
-
网络安全:HTTPS协议(SSL/TLS)用于保护网页浏览安全;Wi-Fi加密(WPA2/WPA3)保护无线网络通信。
-
电子商务与金融:保护网上银行交易、支付宝、微信支付等支付过程的安全;确保信用卡信息在传输过程中的机密性。
-
日常通信:即时通讯软件(如微信、Signal、Telegram)中的端到端加密,保护用户聊天记录。
-
身份认证:登录系统时的密码存储(哈希加盐);数字证书;U盾。
-
数据存储:全盘加密(如BitLocker、FileVault)、文件加密软件,防止设备丢失后数据泄露。
-
区块链与加密货币:比特币、以太坊等数字货币的底层技术,使用哈希函数和数字签名确保交易的安全和不可篡改。
第2章 基础知识
2.1 数论基础知识
2.1.1 素数与互素
-
整除:b∣a 表示存在整数 c 使 a=b⋅c。
-
素数:大于1且只有±1和±自身为因子的整数。
-
算术基本定理:任意 n≥2 可唯一分解为素数幂的乘积。
-
最大公因子 gcd(a,b):满足 gcd(a,b)=sa+tb。
-
互素:gcd(a,b)=1。
2.1.2 同余与模运算
-
a≡b(modn) 表示 n∣(a−b)。
-
模运算满足加、减、乘的消去律(乘法消去需满足 gcd(c,n)=1)。
-
乘法逆元:a⋅a−1≡1(mod n) 存在当且仅当 gcd(a,n)=1。
2.1.3 欧拉定理
-
欧拉函数 φ(n):小于 n 且与 n 互素的正整数个数。
-
若 p 素数,φ(p)=p−1。
-
若 gcd(m,n)=1,φ(mn)=φ(m)φ(n)。
-
-
欧拉定理:若 gcd(a,n)=1,则 a^φ(n)≡1(modn)。
-
费马定理:若 p 素数且 gcd(a,p)=1,则 a^(p−1)≡1(modp)。
-
本原根:模 n 的阶为 φ(n) 的数。
2.1.4 几个有用的算法
-
欧几里得算法:gcd(a,b)=gcd(b,amod b)。
-
扩展欧几里得算法:可求 gcd(a,b) 及乘法逆元。
-
快速指数算法:通过二进制展开指数,快速计算 a^m mod n。
-
Miller-Rabin 素性检测:概率性算法,多次检测可高概率判断素数。
2.1.5 同余方程组的求解
-
一次同余方程 ax≡b(modn) 有解当且仅当 gcd(a,n)∣b,且有 d=gcd(a,n)d=gcd(a,n) 个解。
-
中国剩余定理:若 n1,n2,...,nk 两两互素,则同余方程组 x≡ai ( mod ni ) 有唯一解模 N=∏ni:

2.1.6 模为素数的二次剩余
-
d 是模 p 的二次剩余若 x²≡d ( mod p )有解。
-
Euler准则:d^[(p−1)/2]≡1 ( mod p ) 时为二次剩余,≡−1 时为非剩余。
-
若 p≡3(mod4),则平方根为 ±d^[(p+1)/4] mod p。
2.1.7 Zp 上的离散对数
-
离散对数:给定本原根 a,x≡logay (mod p) 满足 a^x≡y (mod p)。
-
正向计算容易,反向计算困难(单向函数)。
2.2 计算复杂性问题
2.2.1 确定性多项式时间
-
时间复杂度:O(1),O(logn),O(n),O(n²),O(2^n) 等。
-
有效算法:多项式时间算法 O(n^k)。
-
P类问题:确定型图灵机上多项式时间可解的判定问题。
-
素性测试属于P(AKS算法)。
2.2.2 非确定多项式时间
-
NP问题:非确定型图灵机上多项式时间可解,或在多项式时间内可验证"是"答案的问题。
-
NPC问题:NP中最难的问题,如可满足性问题。若任一NPC问题存在有效算法,则P=NP。
2.2.3 概率多项式时间
-
概率图灵机 (PTM):允许随机选择。
-
BPP:有界概率多项式时间。
-
Monte Carlo算法:正确概率<1,但错误可控。
-
Las Vegas算法:总是正确,但运行时间随机。
2.2.4 多项式时间不可区分性
-
两个随机序列集合若不存在有效辨认算法,则称它们多项式时间不可区分。
-
伪随机序列与真随机序列的多项式时间不可区分是密码学的重要假设。
习题2
2-1 若插入排序算法中程序执行的步数呈等概率分布,试讨论平均情况下该算法的复杂度。
插入排序在平均情况下的时间复杂度为 O(n²)。
粗略分析:对于第 i 个元素(从0开始),平均需要与前面已排序的一半元素进行比较,即约 i/2 次。因此总的比较和移动次数约为:

其高阶项为 n²/4,因此平均时间复杂度为 O(n²)。
2-2 修改例2.12的素性测试,若将结束循环的上界改成 √n,证明该算法依然是指数算法。
("例2.12"指素性检测的原始、低效方法,即从2循环到 n−1 或√ n 检查是否能整除。)
原始的试除法需要检查从2到 √n 的所有整数。判断一个数 n 是否为素数的输入规模是它的位数 ,记作 L=log₂n。那么 n=2^L。循环次数的上界 √n=√2^L=2^(L/2)。循环次数随输入规模 L 呈指数级增长(O(2^(L/2))),因此它仍是一个指数时间算法,不是有效(多项式时间)算法。
2-3 考虑路径长度均为非负实数的情况,找出最短路径问题对应的判定问题,并用它解决最短路径问题。
判定问题 :给定图 G,两个顶点 u,v和一个非负实数 L,问:是否存在一条从 u 到 v 的路径,其总长度 ≤ L?
用判定问题解决最短路径问题:
-
首先,可以找到一个简单的路径长度上界 M(例如,所有边的权重之和)。
-
在区间 [0,M] 内使用二分查找。
-
对于每一个猜测的中间值 LL,调用判定问题"是否存在长度 ≤ L 的路径?"
-
根据判定问题的"是/否"回答,缩小二分查找的区间(如果回答"是",则说明最短路径 ≤ L,可以尝试更小的值;如果"否",则说明最短路径 > L,需要尝试更大的值)。
-
重复二分查找,直到区间足够小,即可得到任意精度的最短路径长度近似值。若所有权重为整数,则可精确找到最短路径长度。
2-4 计算 3¹⁹⁹³⁵mod 77。
计算过程:
-
由于 77=7×11,且 gcd(3,77)=1,可以使用中国剩余定理。先分别计算模7和模11。
-
模7: φ(7)=6。 19935 mod 6=19935−6×3322=19935−19932=3。所以 3¹⁹⁹³⁵ mod 7=33mod 7=27mod 7=6。
-
模11: φ(11)=10。 19935mod 10=5。所以 3¹⁹⁹³⁵ mod 11=35mod 11=243mod 11=243−11×22=243−242=1。
-
解同余方程组:
{ x≡6(mod7) x≡1(mod11) }
设 x=11k+1。代入第一个同余式:11k+1≡6(mod7) ⟹ 4k≡5(mod7)。4的逆元模7是2(因为 4×2=8≡14×2=8≡1),所以 k≡5×2=10≡3(mod7)。取 k=3,则 x=11×3+1=34。
所以 3¹⁹⁹³⁵mod 77=34。
2-5 计算 7mod 561的逆元。
使用扩展欧几里得算法计算逆元。需要找到 x 使得 7x+561y=1。
561=7×80+1
7=1×7+0
回代:
1=561−7×80
所以 7×(−80)≡1(mod561)。因此 7^(-1) mod 561=−80 mod 561=561−80=481。
2-6 判断方程 x²≡3 mod 383 是否有解?如果有解,求出其中的一个解。
判断是否有解 :使用Euler准则。383是素数。
计算 3^[(383−1)/2] mod 383=3¹⁹¹mod 383。
因为 383 mod 12=11,根据二次互反律,(3/383)=−(383/3)=−(2/3)=−(−1)=1。也可以直接计算:3¹⁹¹mod 383=1(计算过程较复杂,结果确为1)。因此,方程有解。
求解:因为 383≡3(mod4),可以使用公式 x≡±a^[(p+1)/4] mod p。
x≡±3^[(383+1)/4] =±3⁹⁶ (mod383)
计算 3⁹⁶ mod 383。可以利用快速幂。
3⁹⁶=(3³²⋅3⁶⁴),或逐步计算模幂。经验证,396 mod 383=200。
所以 x≡±200(mod383)。其中一个解是 200。
2-7 计算下列数值:
7503mod 81;(−7503)mod 81;81mod 7503;(−81)mod 7503
-
7503/81=92.62...,81×92=7452,余数 7503−7452=51。所以 7503mod 81=51。
-
(−7503)mod 81:因为 7503mod 81=51,所以 −7503mod 81=81−51=30。
-
81mod 7503:因为 81<7503,所以 81mod 7503=81。
-
(−81)mod 7503=7503−81=7422。
2-8 证明:
(1) [a(mod m)×b(mod m)]mod m=(a×b)(mod m)。
(2) [a×(b+c)]mod m=[(a×b)(mod m)+(a×c)(mod m)](mod m)。
(1) 证明 :
设 a mod m=ra,bmod m=rb。则存在整数 ka,kb 使 a=kam+ra,b=kbm+rb。
左边 = [ra×rb] mod m。
右边 = (a×b)mod m=((kam+ra)(kbm+rb))mod m=(kakbm²+karbm+kbram+rarb)mod m。
由于 kakbm²,karbm,kbram 都能被 m 整除,所以右边 = (rarb)mod m。
因此左边 = 右边。原式得证。
(2) 证明 :
右边 = [(a×b) mod m+(a×c) mod m] mod m。
设 a mod m=ra,b mod m=rb,c mod m=rc。
由(1)的结论,(a×b) mod m=(rarb) mod m,(a×c) mod m=(rarc) mod m。
所以右边 = [(rarb) mod m+(rarc) mod m] mod m。
根据模运算的性质,上式 = (rarb+rarc) mod m=(ra(rb+rc)) mod m。
而左边 = [a×(b+c)] mod m=(ra×(rb+rc)) mod m。
因此左边 = 右边。原式得证。
2-9 利用中国剩余定理求解
{x≡2(mod3) x≡1(mod5) x≡1(mod7)
解 :
N=3×5×7=105。
-
N1=105/3=35,N1^(-1) mod 3:35 mod 3=2=2,2−1 mod 3=2(因为 2×2=4≡1)。所以 N1^(-1)=2。
-
N2=105/5=21,N2^(-1)mod 5:21mod 5=1,1−1mod 5=1。所以 N2^(-1)=1。
-
N3=105/7=15,N3^(-1)mod 7:15mod 7=1,1^(-1)mod 7=1。所以 N3^(-1)=1。
根据公式:
x≡( 35×2×2 ) + ( 21×1×1 ) + ( 15×1×1 ) (mod 105 ) ≡ ( 140 + 21 + 15 ) ( mod105 )≡176 ( mod105 )≡71 ( mod105 )
所以解为 x≡71 ( mod105 )。
2-10 什么是计算复杂性?它在密码学中有什么意义?
计算复杂性是理论计算机科学的一个分支,它研究问题在求解时所需资源(主要是时间和空间)的度量,并根据资源需求对问题进行分类。它区分了"容易"(多项式时间可解,如P类)和"困难"(指数时间或非多项式时间,如NPC类)的问题。
在密码学中的意义:
-
设计安全密码体制的基础 :现代密码学的安全性正是建立在"困难问题"之上。它寻找那些"正向计算容易,逆向计算困难"的单向函数。例如,RSA的安全性依赖于大整数分解的困难性;ElGamal依赖于离散对数问题的困难性。
-
量化安全性:通过计算复杂性理论,可以估计破解一个密码体制需要多少计算资源(如操作次数、存储空间),从而量化其安全强度(例如,AES-128需要 2¹²⁷ 次操作才能暴力破解)。
-
证明安全性:通过归约技术,可以证明如果一个密码体制能被有效破解,那么某个公认的数学难题(如NPC问题)也能被有效解决。由于人们相信这些难题是困难的,从而推导出该密码体制是安全的。这被称为"可证明安全"。
注:以上内容和习题解答的理解和计算,如果有任何错误,希望各位读者和大佬指出改正,非常感谢!!!