跳转到内容

一夜速成密码学

Published: at 02:42

后天下午要考试了,或者说明天下午。所以开始学密码学。明日事今日毕。

言简意赅,点到为止,力求及格。

PS:笔记没写完,但及格问题不大。

1 密码学基础

了解即可。

推动近代密码学发展的重要理论著作:1949 香农 《The Communication Theory of Secret Systems》

推动现代密码学中公钥密码思想的重要论文:1976 Diffie & Hellman 《密码学的新方向》 非对称密码学。

2 古典密码学

代换密码都无法避免统计分析攻击。


3 数据加密标准(DES)

对称密码分为分组密码和流密码。

分组密码:对明文消息分组,按分组加密。
流密码:对明文信息按比特或字节逐个加密。

DES,极为流行的数据加密标准。分组密码算法。

对应的若干种攻击方式:

DES 弱密钥:加密两次恢复原文的密钥。弱密钥使得 DES 中每一轮的子密钥相同。
四个弱密钥:

多重 DES:多个密钥加密多次。解密时按逆序解密即可。

二重 DES:用两个密钥顺序加密两次,强度并不等价于 112bits,因为可以中途相遇攻击。类似于双向搜索。给定明文密文,一边枚举加密结果,存入表中。另一边枚举解密结果,寻找表中匹配项即可。

三重 DES 三次加密可使得明文攻击量级增加到 21122^{112}. 但密钥长度变成了 168bits.
一种方法为:使用两个密钥,K1 加密-K2 解密-K3 加密。简记为 EDE.

4 高级加密标准(AES)

明文密文分组长度为 128bits.
无 Feistel 结构。
密钥长度可变,有 AES-128 AES-192 AES-256 等。不同长度有对应不同轮数。

AES 流程:

image

代换和置换都将整个分组当成单一矩阵处理。
只在轮密钥加中使用密钥。算法以轮密钥加开始,以轮密钥加结束。
加密算法和解密算法不同


将 16bytes 看作 4×44\times 4 的状态矩阵。
密钥看作 4×44\times44×64\times64×84\times 8 的状态矩阵。

image

字节代换就是一个映射而已。不过 AES 的 S-box 有代数意义。
输入的 8bits 考虑为有限域 GF(28)GF(2^8) 的一个元素,求逆 BiB_i' 后仿射变换得到 BiB_i.

image

行移位很简单:第一行不变,第二行循环左移 1,第三行循环左移 2,第四行循环左移 3.

列混淆:状态矩阵左乘上一个固定的混淆矩阵。乘法在有限域 GF(28)GF(2^8) 上进行,使用的固定不可约多项式为 x8+x4+x3+x+1x^8+x^4+x^3+x+1.

轮密钥加则为:子密钥矩阵异或当前状态矩阵,得到更新的状态矩阵。

子密钥通过输入密钥扩展得来。若轮数为 nn则生成 n+1n+1 个子密钥

AES 密钥拓展以 32bits 1word 为单位。
所有子密钥存储在一个密钥拓展数组 WW 中。对于 10 轮的 AES128,生成 44 个 words,W=44|W|=44.

输入的密钥首先填充开头,随后:

W4i=W4(i1)g(W4i1)W4i+j=W4i+j1W4i+j4W_{4i}=W_{4(i-1)}\oplus g(W_{4i-1})\\ W_{4i+j}=W_{4i+j-1}\oplus W_{4i+j-4}

函数 g:

目的:增加密钥拓展过程的 non-linearity. 防止不同轮的轮密钥生成方式上的对称性或相似性。

image


解密时,每层都是加密过程中的逆。

需要实现轮密钥加、列混淆、行移位、字节代换的逆变换。
轮密钥加和行移位是显然的。

列混淆:求相乘矩阵的逆矩阵即可。
字节代换:求解仿射变换的逆和有限域乘法逆。

image

目前为止对完整版本的 AES 没有比穷举攻击复杂度更低的密码分析攻击。

5 分组密码操作模式

分组加密算法一次只加密一个分组。实际应用中,待加密消息数据量不固定。
如果使用相同密钥加密多个分组,会引发许多安全问题。
需要采用适当的操作模式。

明文信息填充:不为分组长度整数倍时,需要 padding.

PKCS5:设需要填充 NN bytes,加上 NN 个值为 NN 的 byte.
7字节:FD FD FD FD FD FD FD —
填充1字节后: FD FD FD FD FD FD FD 01
8字节: FD FD FD FD FD FD FD FD
填充8字节后: FD FD FD FD FD FD FD FD 08 08 08 08 08 08 08 08

OneAndZeroes Padding:填充一个 1bit,然后填充 0bits.

image

感觉需要掌握几种图的画法。

image

image

image

image

image

6 流密码

PRNG:伪随机数发生器,固定种子输入。

RC4:可变密钥长度、面向字节操作的流密码。以随机置换为基础,实现简单且快。

反馈移位寄存器:大多数新型流密码基于 Feedback Shift Register.

LFSR:

image

初始为 an,,a1a_n,\cdots,a_1,则输出顺序为 a1,,an,an+1,a_1,\cdots,a_n,a_{n+1},\cdots

对于整数 t1t\ge 1an+t=cnatcn1at+1c1at+n1a_{n+t}=c_na_t \oplus c_{n-1}a_{t+1}\oplus \cdots \oplus c_1 a_{t+n-1}.
特征多项式 p(x)=1+c1x1++cnxnp(x)=1+c_1x^1+\cdots + c_nx^n.

输出周期与状态周期相等。最大周期为 N=2n1N=2^n-1.
最大周期条件:特征多项式不可约,为本原多项式。

7 有限域

群:GG 定义了二元运算 \cdot 的集合,满足:

环:RR 定义了两个二元运算 +,×+,\times 的集合,满足:

环没有规定每个元素有乘法逆元!

域:FF 定义了两个二元运算 +,×+,\times,满足环的性质,此外存在乘法逆元:


有限域的阶(元素个数)是素数幂,记为 GF(pn)GF(p^n). 一般密码学中使用 GF(2n)GF(2^n).
其运算为 modpn\bmod p^n 的整数运算。

Zp\mathbb{Z}_p 上的多项式集合 SS 包含 f(x)=i=0n1aixif(x)=\sum \limits _{i=0}^{n-1}a_ix^iai=0,1,,p1a_i=0,1,\cdots,p-1.
pnp^n 个。

定义运算使得多项式集合 SS 构成有限域:

image

GF(2n)GF(2^n) 中的多项式 f(x)=i=0n1aixif(x)=\sum \limits _{i=0}^{n-1}a_ix^iai=0/1a_i=0/1 可以按位表示。

加法等效于位异或。乘法有一种巧妙的算法。

例如 m(x)=x8+x4+x3+x+1m(x)=x^8+x^4+x^3+x+1x8modm(x)=x4+x3+x+1x^8\bmod m(x) = x^4+x^3+x+1.

考虑 f(x)x=b7x8++b0xf(x) \cdot x = b_7x^8+\cdots + b_0x,若 b7=0b_7=0 结果为 (b6,b5,,0)(b_6,b_5,\cdots,0).
否则,就要加上 x8modm(x)x^8\bmod m(x). 结果为 (b6,b5,,0)(00011011)(b_6,b_5,\cdots,0)\oplus (00011011).

递推可以得到 f(x)xkf(x)\cdot x^k.

8 数论基础

高中残存的记忆。

欧几里德算法:gcd(a,b)=gcd(b,amodb)\gcd(a,b)=\gcd(b,a\bmod b).

拓展欧几里德算法:求解 ax+by=gcd(a,b)ax+by=\gcd(a,b) 的方程。

这玩意手算怎么算呢?以 a×6107+b×8832=1a \times 6107 + b \times 8832 = 1 为例。

首先把 gcd 的计算全部写出来:

(8832, 6107)
(6107, 2725)
(2725, 657)
(657, 97)
(97, 75)
(75, 22)
(22, 9)
(9, 4)
(4, 1)
(1, 0)

然后加上末尾项:

(8832, 6107)
(6107, 2725)
(2725, 657)
(657, 97)
(97, 75)
(75, 22)
(22, 9)
(9, 4)
(4, 1)
(1, 0) 1, 0

然后每次:交换 x,yx,y,随后 y:=ya/b×xy:=y-a/b \times x.

(8832, 6107)
(6107, 2725)
(2725, 657)
(657, 97)
(97, 75) …
(75, 22) 5, -17
(22, 9) -2, 5
(9, 4) 1, -2
(4, 1) 0, 1
(1, 0) 1, 0

费马小定律:pp 素数,aa 正整数,ap11(modp)a^{p-1}\equiv 1\pmod p.

欧拉函数:ϕ(n)\phi(n) 为小于 nn 中和 nn 互素的正整数个数。
欧拉函数满足积性,若 n=pqn=pqgcd(p,q)=1\gcd(p,q)=1,则 ϕ(n)=ϕ(p)ϕ(q)\phi(n)=\phi(p)\phi(q).

欧拉定理:gcd(a,n)=1\gcd(a,n)=1aϕ(n)1(modn)a^{\phi(n)}\equiv 1 \pmod n.
另一种表述:任意 a,na,naϕ(n)+1a(modn)a^{\phi(n)+1}\equiv a\pmod n
拓展了费马小定律,应用于非素模数。


Miller-Rabin 素性测试。

Lemma1: pp 为奇素数,则 x21(modp)x^2\equiv 1\pmod p 的解为 x1(modp)x\equiv 1 \pmod pxp1(modp)x\equiv p-1 \pmod p.

Lemma2: pp 为奇素数,则 p1=2kq,k>0p-1=2^kq,k > 0qq 为奇数。设 a(1,p1)a\in(1,p-1) 且为整数,下面两个条件之一成立:aq1(modp)a^q\equiv 1 \pmod p1jk,a2j1qp1(modp)\exists 1 \le j \le k , a^{2^{j-1}q}\equiv p-1\pmod p.

测试 nn 是否为奇数,我们可以:

一般选取若干个基底,进行若干次检测。


中国剩余定理:模数两两互素 m1,,mkm_1,\cdots,m_k,同余方程组:

{xa1(modm1)xak(modmk)\begin{cases} x\equiv a_1\pmod {m_1}\\ \cdots \\ x\equiv a_k\pmod {m_k} \end{cases}

对模 M=miM=\prod m_i 有唯一解。即 xaiMiei(modM)x \equiv \sum a_iM_i e_i \pmod M.
其中 Mi=M÷miM_i=M\div m_ieie_i 定义为 eiMi1(modmi)e_i M_i\equiv 1 \pmod {m_i}.


模数 nn 的本原根 aa 满足 a1,,aφ(n)a^1,\cdots,a^{\varphi(n)} 互不相同且与 nn 互素。

对于素数 pp,其本原根 aa 的幂能产生模 pp 下的非零整数集 (1,2,,p1)(1,2,\cdots,p-1).

不是所有整数都有本原根。


离散对数:对于素数 pp 的本原根 aa,任意整数都有唯一幂次满足 bai(modp),i[1,p1]b \equiv a^i \pmod p, i \in[1,p-1].
i=dloga,p(b)i=\operatorname{dlog}_{a,p}(b),为 bb 的离散对数。

给定 a,i,pa,i,p 容易求 bb,但反过来求解幂次是很难的。BSGS 也只能做到根号级别。

9 公钥密码与 RSA

RSA 参见RSA.

10 其他公钥加密体制

DH 密钥交换:pp 为大素数,gg 为本原根,p,gp,g 公开。
用户 A 选择保密整数 aa,发送 YA=gamodpY_A=g^a\bmod p.
用户 B 选择保密整数 bb,发送 YB=gbmodpY_B=g^b\bmod p.
双方使用自己的保密整数 xx,和收到的 YY,计算 K=Yx=gabmodpK=Y^x=g^{ab}\bmod p 作为密钥。

只有 p,g,YA,YBp,g,Y_A,Y_B 公开,要想得到 KK 只能求离散对数。

DH 密钥交换容易受到中间人攻击。


ElGamal 密码体制,选定素数 pp,本原根 gg.
随机生成 skA=a[2,,p2)sk_A=a\in [2,\cdots,p-2),计算 pkA=gAmodppk_A=g^A\bmod p.
私钥为 skAsk_A,公钥为 pkApk_A.
用户向 A 发送消息 MM 时:随机选择整数 k[2,p2]k\in[2,p-2],计算 C1=gkmodpC_1=g^k\bmod p.
计算一次性密钥 K=pkAkmodp=gakmodpK=pk_A^k \bmod p = g^{ak}\bmod p.
计算 C2=KMmodpC_2= KM \bmod p.
发送 (C1,C2)=(gk,Mgak)(C_1,C_2) = (g^k, M \cdot g^{ak}) 给 A.

A 收到后,利用 C1=gkC_1=g^k 计算 gakg^{ak},求逆乘上 C2C_2MM.

若待加密数据分组后使用 ElGamal 加密,则每组需要使用不同的整数 kk.
否则若泄露其中一个明文分组,可直接在不知道私钥的情况下破译其他明文分组。

image


椭圆曲线密码体制:基于广义离散对数问题。

ECC 中,椭圆曲线方程为 y2=x3+ax+by^2=x^3+ax+b.

由方程 y2=x3+ax+by^2=x^3+ax+b 确定的椭圆曲线记为 E(a,b)E(a,b),包含满足该方程的所有点和无穷远点 OO.
4a3+27b204a^3+27b^2 \neq0 时,可以基于集合 E(a,b)E(a,b) 定义二元运算,使其成为一个交换群。用加法 ++ 表示。

对于不互为逆元的两点 P(xP,yP),Q(xQ,yQ)P(x_P,y_P),Q(x_Q,y_Q),直线斜率为 Δ=(yQyP)÷(xQxP)\Delta=(y_Q-y_P)\div (x_Q-x_P),计算得到 xR=Δ2xPxQx_R=\Delta^2 - x_P - x_QyR=Δ(xPxR)yPy_R=\Delta(x_P-x_R)-y_P.

切线自己算吧。跟 aa 有关。

在有限域上定义椭圆曲线,y2x3+ax+b(modp)y^2\equiv x^3+ax+b\pmod p.

image

运算是类似的,除了除法要用逆元算。

image

椭圆曲线上离散对数问题求解困难,即 Q=kPQ=kP,给定 k,Pk,PQQ 是容易的,但给定 P,QP,Qkk 是困难的。

kPkP 可以用快速乘的思想。

11 哈希函数

高中写过了一些相关内容。哈希表 字符串哈希

……后面的大概扫了一眼,不想详细写了。还有 MAC 啊数字签名之类的。


下一篇
基于 Astro 与 Directus 的新时代 JAMStack 博客实践