密码学的基本概念
密码学(Cryptology):
密码编码学(Cryptography):
密码分析学(Cryptanalytics) :
消息被称为明文(Plaintext)。
密码算法:
加密过程
密码学的目的:Alice和Bob两个人在不安全的信道上进行通信,而破译者Oscar不能理解他们通信的内容。
加密和解密算法的操作通常都是在一组密钥的控制下进行的,分别称为加密密钥(Encryption Key) 和解密密钥(Decryption Key)。
密码体制
一个五元组(P,C,K,E,D)满足条件:
- P是可能明文的有限集;(明文空间)
- C是可能密文的有限集;(密文空间)
- K是一切可能密钥构成的有限集;(密钥空间)
- 任意k∈K,有一个加密算法ek∈E和相应的解密算法dk∈D,使得ek : P→C和dk : C→P分别为加密解密函数,满足dk(ek(x))=x,其中 x ∈P。
加密算法基本原理
代替:明文中的元素映射成另一个元素
置换 :重新排列
要求:不允许信息丢失,即算法可逆
基于密钥的算法,按照密钥的特点分类:
对称密码算法(symmetric cipher):加密密钥和解密密钥相同,或实质上等同,即从一个易于推出另一个。又称秘密密钥算法或单密钥算法。
非对称密钥算法(asymmetric cipher):加密密钥和解密密钥不相同,从一个很难推出另一个。又称公开密钥算法(public-key cipher) 。
密码分析破解类型:
- 唯密文攻击
密码分析者仅知道有限数量用同一个密钥加密的密文 - 已知明文攻击
密码分析者除了拥有有限数量的密文外,还有数量限定的一些已知“明文—密文”对 - 选择明文攻击
密码分析者除了拥有有限数量的密文外,还有机会使用注入了未知密钥的加密机,通过自由选择明文来获取所希望的“明文—密文”对。 - 选择密文攻击
密码分析者除了拥有有限数量的密文外,还有机会使用注入了未知密钥的解密机,通过自由选择密文来获取所希望的“密文—明文”对。 - 选择文本攻击
密码的安全性
无条件安全(Unconditionally secure)
无论破译者有多少密文,他也无法解出对应的明文,即使他解出了,他也无法验证结果的正确性。(除一次一密钥,都不是无条件安全)
计算上安全(Computationally secure)
破译的代价超出信息本身的价值
破译的时间超出了信息的有效期
现代密码学基本原则
设计加密系统时,总假定密码算法是可以公开的,需要保密的是密钥。“一切秘密在于密钥之中,而加密算法可以公开” 即Kerckhoff原则。
密码学的起源和发展三个阶段:
1949年之前:密码学是一门艺术
1949~1975年:密码学成为科学
1976年以后:密码学的新方向——公钥密码学
经典密码体制
代替密码(substitution cipher)
就是明文中的每一个字符被替换成密文中的另一个字符。接收者对密文做反向替换就可以恢复出明文。
简单代替密码(simple substitution cipher):
又称单字母密码(monoalphabetic cipher),明文的一个字符用相应的一个密文字符代替。
多字母密码(ployalphabetic cipher):
明文中的字符映射到密文空间的字符还依赖于它在上下文的位置。
恺撒密码(Caesar Cipher):
已知的最早(也是最简单的方式)的简单替代密码是朱里斯.恺撒所用的密码。恺撒密码是把字母表中的每个字母用该字母后面第3个字母进行代替。例如:
明文:meet me after the toga party
密文:PHHW PH DIWHU WKH WRJD SDUWS
既然字母表是循环的,因此Z后面的字母是A。能够通过列出所以可能性定义如下所示的变换:
移位密码(Shift cipher)
对每个明文字母p,恺撒加密可转化为移位密码,其中加密算法:
C = E§ = (p+k) mod (26),其中k在1~25之间取值。
解密算法是:p = D© = (C-k) mod (26)
如果已知密文是恺撒密码,则使用强行攻击密码分析容易取得结果
直接对所有25个可能的密钥进行尝试。
模运算
a+b mod n = (a mod n+b mod n) mod n
a-b mod n = (a mod n-b mod n) mod n
a×b mod n = (a mod n×b mod n) mod n
仿射密码算法:
P = C = Z26
K = (a,b) ∈K = Z26×Z26
加密
y = eK(x) = (ax+b) mod 26
要求唯一解的充要条件:gcd(a,26)=1
解密
dK (y) = (y – b) / a mod 26 = (y – b) a-1 mod 26
仿射密码算法例:
K = (7,3),则有7-1 mod 26 = 15
因此对任一明文x有:ek (x) = 7x + 3
解密:
dk (y) = 15 * (y – 3) mod 26 = 15y – 19 mod 26
= 15 * (7x + 3) – 19 = 105*x + 45 – 19
= 105x = x mod 26
仿射密码算法讨论:
如何求乘法逆元:
一次同余方程ax ≡ b (mod m)这个方程有没有解,相当于问有没有那样一个整数x,使得对于某个整数y来说,有ax + my=b
推论:ax≡1 mod n有解 IFF (a, n) | 1,即a、n互素
欧几里德算法(求最大公约数):
基于定理:对于任何非负的整数a和非负的整数b:
gcd (a,b) = gcd (b,a mod b)
例如: gcd (55,22) = gcd (22,55 mod 22) = gcd (22,11) = 11
扩展欧几里德算法(求乘法逆元)例:
方式一
求7关于96的乘法逆元
Q | X1 | X2 | X3 | Y1 | Y2 | Y3 |
---|---|---|---|---|---|---|
1 | 0 | 96 | 0 | 1 | 7 | |
13 | 0 | 1 | 7 | 1-0*13=1 | 0–1*13= -13 | 96-7*13=5 |
1 | 1 | -13 | 5 | 0-1*1= -1 | 1- 1*(-13)= 14 | 7-1*5=2 |
2 | -1 | 14 | 2 | 1-2*0=1 | -13-2*14= -41 | 5-2*2=1 |
由于Y3=1,所以算法中止,故乘法逆元为-41 mod 96 = 55 | ||||||
即7×55 ≡1 mod 96 | ||||||
方式二 | ||||||
求22mod31的逆元 | ||||||
i | ri | qi | xi | yi | ||
– | – | – | – | – | ||
-1 | 31 | 1 | 0 | |||
0 | 22 | 0 | 1 | |||
1 | 9 | 1 | 1 | -1 | ||
2 | 4 | 2 | -2 | 3 | ||
3 | 1 | 2 | 5 | -7 | ||
当ri=1,则5x31+(-7)x 22 =1 mod 31 | ||||||
则逆元为(-7)+ 31 = 24 | ||||||
(PS:第一行为被除数,默认XiYi为 1 0 ,第二行为除数,默认XiYi为 0 1 个人觉得方式二好理解一些) | ||||||
![]() | ||||||
任意的单表代替密码算法: | ||||||
设P=C=Z26,K是由26个符号0,1,…,25的所有可能置换组成。任意π∈K,定义eπ(x)= π(x)=y 且dπ(y)=π-1(y)=x, π-1是π的逆置换。 | ||||||
注: | ||||||
密钥空间K很大, | k | =26! ≈ 4×1026,破译者穷举搜索不行的(每微秒搜索加密一次需要6.4×1012年)。移位密码、乘数密码、仿射密码算法都是替换密码的特例。 | ||||
任意的单表代替密码算法可由统计的方式破译 |
简单代替密码(simple substitution cipher):
又称单字母密码(monoalphabetic cipher),明文的一个字符用相应的一个密文字符代替。
多字母密码(ployalphabetic cipher):
明文中的字符映射到密文空间的字符还依赖于它在上下文的位置。
多字母代替密码:Playfair
Playfair:将明文中的双字母组合作为一个单元对待,并将这些单元转换为密文的双字母组合。
5×5变换矩阵: I与J视为同一字符
加密规则:按成对字母加密
相同对中的字母加分隔符(如x)
balloon ->ba lx lo on
同行取右边: he -> EC
同列取下边: dm -> MT
其他取交叉: kt > MQ,OD > TR
Hill密码:
基于矩阵的线性变换,由数学家Lester Hill于1929年研制
Z26上的线性变换
例:x=(x1,x2),y=(y1,y2)
定义:y1=11x1+3x2 mod 26,y2= 8x1+7x2 mod 26
Vigenére密码:
是一种多表移位代替密码
设d为一固定的正整数,d个移位代换π=(π1,π2,…,πd) 由密钥序列K=(k1,k2,…,kd)给定,第i+td个明文字母由表i决定,即密钥ki决定
ek(xi+td) = (xi+td + ki) mod q = y,dk(yi+td) = (xi+td-ki) mod q = x
例子:q=26, x=polyalphabetic cipher, K=RADIO
明文 x= p o lya l phab e t i cc i pher
密钥 k= R ADIO RADIO RADIO RADIO
密文 y= GOOGO CPKTP NTLKQ ZPKMF
One-Time Pad一次一密:
Joseph Mauborgne提出使用与消息一样长且无重复的随机密钥来加密消息,密钥只对一个消息加解密,之后弃之不用;每条新消息都需要与其等长的新密钥,这就是一次一密,它是不可攻破的。
运算基于二进制数据而非字母
加密:ci = pi ⊕ ki, pi是明文第i个二进制位, ki是密钥第i个二进制位,ci是密文第i个二进制位, ⊕是异或运算
密文是通过对明文和密钥的逐位异或而成的,根据异或运算的性质,解密过程为pi = ci ⊕ ki,
给出任何长度与密文一样的明文,都存在着一个密钥产生这个明文。如果用穷举法搜索所有可能的密钥,会得到大量可读、清楚的明文,但是无法确定哪个才是真正所需的,因而这种密码不可破。
一次一密的两个限制
产生大规模随机密钥有实际困难
密钥的分配和保护无法保证
置换密码(permutation cipher)
又称换位密码(transposition cipher),明文的字母保持相同,但顺序被打乱了。
斯巴达密码棒
栅栏技术:
在这种密码中最简单的是栅栏技术,在该密码中以对角线顺序写下明文,并以行的顺序读出。
例如:以深度为2的栅栏密码加密消息“meet me after the toga party”,写出如下形式:
m | e | m | a | t | r | h | t | g | p | r | y | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
e | t | e | f | e | t | e | o | a | a | t | ||||||||||||
被加密的消息为:mematrhtgpryetefeteoaat |
置换密码:
更为复杂的方式是以一个矩形逐行写出消息,再逐列读出该消息。
该方法以行的顺序排列。列的阶则成为该算法的密钥。密钥包含3方面信息::行宽、列高、读出顺序
例:
|key | 4| 3| 1| 2| 5| 6| 7|
|–|–|–|–|–|–|–|–|–|
|plaintext: |a | t | t | a| c| k| p|
| | o| s | t| p | o | n| e|
| | d| u | n| t| i| l| t|
|| w | o | a | m |x | y| z|
ciphertext :TTNAAPTMTSUOAODWCOIXPETZ
完全保留字符的统计信息
使用多轮加密可提高安全性
Rotor Machines转轮密码机:
在现代密码系统出现之前,转轮密码机是最为广泛使用的多重加密器,尤其是在第二次世界大战中。
代表:German Enigma, Japanese Purple
转轮机使用了一组相互独立的旋转圆筒,可以通过电脉冲,每个圆筒有26个输入和26个输出,每个输入仅与一个输出相连,一个圆筒就定义了一个单表代换。
每按下一个键,圆筒旋转一个位置,内部连线相应改变,就定义了不同的单表代换密码,经过26个明文字母,圆筒回到初始状态,就得到一个周期为26的多表代换密码。
3个圆筒的转轮机就有263=17576个不同的代换字母表
Enigma的使用
Enigma的破解