现代密码学总结(上篇)

现代密码学总结

(v.1.0.0版本)之后会更新内容

基本说明:

∙ \bullet ∙如果 A A A是随机算法, y ← A ( x ) y\leftarrow A(x) y←A(x)表示输入为 x x x ,通过均匀选择

的随机带运行 A A A,并且将输出赋给 y y y。
∙ \bullet ∙如果 S S S是个集合,则 x ← S x\leftarrow S x←S表示 x x x是从 S S S中均匀随机选择

的。
∙ \bullet ∙ { 0 , 1 } n \{ 0, 1\} ^n {0,1}n表示的是所有长度为 n n n的比特串的集合。
∙ \bullet ∙ { 0 , 1 } ≤ n \{ 0, 1\} \leq n {0,1}≤n表示的是所有长度大于 0 且最大为 n n n 的比特串的集合
∙ \bullet ∙ { 0 , 1 } ∗ \{ 0, 1\} ^* {0,1}∗表示的是所有长度大于 0 ^{0} 0 的有穷比特串的集合。
∙ \bullet ∙ ∣ ∣ x ∣ ∣ ||x|| ∣∣x∣∣表示(正)整数 x x x表示为二进制形式时的长度,首位比特为

1。注意 log ⁡ x < ∣ ∣ x ∣ ∣ ≤ log ⁡ x + 1. \log x<||x||\leq\log x+1. logx<∣∣x∣∣≤logx+1.
∙ \bullet ∙ ∣ x ∣ |x| ∣x∣表示的是二进制字符串 x x x (可能首部有多位为零)的长度或者表示实数 x x x的绝对值。
∙ \bullet ∙ x ∣ ∣ y x| | y x∣∣y 和 ( x , y ) \left(x,y\right) (x,y)等价,表示连接字符串 x x x 和 y y y 。 ∙ \bullet ∙ P r [ X ] Pr[ X] Pr[X]表示的是事件 X X X的概率。
∙ \bullet ∙ x : = y x: = y x:=y意味着将值 y y y赋值给 x x x 。
⋅ \cdot ⋅ P P T PPT PPT代表概率多项式时间。
∙ \bullet ∙ A O ( ⋅ ) A^{O( \cdot ) } AO(⋅)表示的是访问预言机 O O O 的算法 A。
∙ \bullet ∙ k k k通常表示一个密钥。
∙ \bullet ∙ ( p k , s k ) (pk,sk) (pk,sk)公钥/私钥密钥对
∙ \bullet ∙ n e g l negl negl 表示可忽略函数。
∙ \bullet ∙ p o l y ( n ) poly( n) poly(n)表示任意一个多项式。
∙ \bullet ∙ F u n c n Func_{n} Funcn表示函数的集合,这些函数将 n n n比特串映射到 n ^n n比特串。
∙ \bullet ∙ G G G表示的是一个伪随机数产生器。
∙ \bullet ∙ F F F表示的是一个带密钥的函数,该函数通常是伪随机函数或者伪随机置换。
∙ \bullet ∙ ( G e n , E n c , D e c ) ( Gen, Enc, Dec) (Gen,Enc,Dec)分别表示密钥生成、加密、解密过程,在公钥加 密 和 对 称 加 密 中 使 用 。
∙ ( G e n , M a c , V r f y ) \bullet ( Gen, Mac, Vrfy) ∙(Gen,Mac,Vrfy) 分 别 表 示 的 是 在 消 息 鉴 别 码 中 , 密 钥 生 成 过程,鉴别标签生成过程和验证过程。
∙ \bullet ∙ ( G e n , S i g n , V r f y ) ( Gen, Sign, Vrfy) (Gen,Sign,Vrfy)分别表示的是在数字签名方案中,密钥生成过程,签名生成过程和签名验证过程。
∙ \bullet ∙ Z \mathbb{Z} Z 表 示 整 数 集 合 。
∙ \bullet ∙ a ∣ b a| b a∣b表示a整除b。
∙ \bullet ∙ Z N \mathbb{Z} _N ZN表示模 N N N的加法群
∙ \bullet ∙ Z N ∗ \mathbb{Z}_N^* ZN∗表示模 N N N可逆整数乘法群,也可以叫做模 N N N的简化剩余系
∙ \bullet ∙ ϕ ( N ) \phi ( N) ϕ(N)表示的是 Z N ∗ \mathbb{Z}_N^* ZN∗中元素的个数,也就是欧拉函数
∙ \bullet ∙ g g g通常是群的一个生成元(循环群)。
∙ \bullet ∙ PRG(伪随机数生成器)
∙ \bullet ∙ 伪随机函数(PRF)
∙ \bullet ∙ 伪随机置换函数(PRP)

注意:凡是标记*都是重点内容

简介

加密:

定义:使得通信双方(发送方、接收方)能在公开网络上进行机密通信。消息发送方(接收方)能够加密(解密)消息,而窃听者无法获得关于消息的任何信息

分类:
对称加密 :发送方和接收方共享相同的密钥,加密和解密使用相同的密钥
公钥加密 :接收方拥有一对公私钥,发送方使用公钥加密,接收者使用私钥解密。(公钥加密,私钥解密

消息认证码

可以保护通信内容的完整性

消息发送方和接收方首先共享一个密钥,发送方为待发送的消息产生一个标识,并将消息和标识一同发送给接收方。接收方使用密钥验证标识的有效性,若验证通过,则说明消息在传递过程中没有被篡改。

哈希函数

哈希函数能够将任意长 的消息映射为一个"较短的 " "定长的 " "抗碰撞的 " 消息摘要。

抗碰撞的:

1.不同消息的消息摘要不同。

例:

对消息 "Hello, world!" 计算哈希值,得到 abc123。

对消息 "Hello, world?" 计算哈希值,得到 def456。

2.给定消息摘要,恢复出消息本身是困难的。(单向)

例:例如,假设攻击者获得了哈希值 abc123,他们无法轻易恢复出 "Hello, world!" 这一原始消息,因为哈希是单向的,不存在直接的逆操作。

数字签名

保证了被签名消息的完整性和不可否认性。(类似于手写签名)

发送者使用自己的私钥对消息进行签名,接收者使用签名者的公钥验证数字签名的合法性。(私钥签名,公钥验证)。数字签名可以看作是公钥环境下的消息认证码。

现代密码学范畴

Without attempting to provide a complete characterization,we would say that modern cryptography involves the study of mathematical techniquesfor securing digital information, systems, and distributed

computations against adversarial attacks.

------Jonathan Katz, Yehuda Lindell

《Introduction to Modern Cryptography》
In the wide sense, cryptography is concerned with any problem in which one wishes to limit the effects of dishonest users.

------Oded Goldreich

《Foundations of Cryptography Basic Tools》

语法

K : \mathcal{K}: K:密钥空间
M \mathcal{M} M:明文空间
C \mathcal{C} C:密文空间

加密方案(Gen; Enc; Dec)

  1. G e n → K ( 概 率 性 的 ) Gen\to \mathcal{K} \left ( \text{概 率 性 的 }\right ) Gen→K(概 率 性 的 )密钥生成算法。

  2. E n c : K × M → C Enc:\mathcal{K}\times\mathcal{M}\to\mathcal{C} Enc:K×M→C加密算法。

  3. D e c : K × C → M Dec:\mathcal{K}\times\mathcal{C}\to\mathcal{M} Dec:K×C→M解密算法。

正确性: ∀ k ∈ K , m ∈ M : D e c k ( E n c k ( m ) ) = m \forall k\in\mathcal{K},m\in\mathcal{M}:Dec_k(Enc_k(m))=m ∀k∈K,m∈M:Deck(Enck(m))=m

Kerckhoffs原则*

The cipher method must not be required to be secret, and it must be

able to fall into the hands of the enemy without inconvenience.

密码算法的安全性应该依赖密钥k的保密性, 而不应依赖于算法Gen; Enc; Dec的保密性。

理由:

  1. 算法设计保密是不切实际的(逆向工程)。
  2. 短密钥更容易保护、生成和替换。
  3. 密码设计应该被公开讨论和分析。

古典密码

单表代换密码

移位密码 *
M = C = { A , B , . . . , Z } ∗ ∼ { 0 , . . . , 25 } ∗ \mathcal{M}=\mathcal{C}=\{A,B,...,Z\}^*\sim\{0,...,25\}^* M=C={A,B,...,Z}∗∼{0,...,25}∗
K = { 0 , . . . , 25 } \mathcal{K}=\{0,...,25\} K={0,...,25}
E n c k ( m 1 ⋯ m ℓ ) = c 1 ⋯ c ℓ ,其中 c i = m i + k m o d 26 \begin{aligned}\mathsf{Enc}k(m_1\cdots m\ell)=c_1\cdots c_\ell\text{,其中 }c_i=m_i+k\mathrm{~mod~}26\end{aligned} Enck(m1⋯mℓ)=c1⋯cℓ,其中 ci=mi+k mod 26 D e c k ( c 1 ⋯ c ℓ ) = m 1 ⋯ m ℓ , 其 中 m i = c i − k \mathbf{Dec}k( c_1\cdots c\ell ) = m_1\cdots m_\ell \textbf{, 其 中 }m_i= c_i- k Deck(c1⋯cℓ)=m1⋯mℓ, 其 中 mi=ci−k mod 26

当k=3:便是熟悉的凯撒密码

攻击:

加密改变了字母的频率。
p i : 在正常的英语文本中,第 i p_i{:\text{在正常的英语文本中,第}i} pi:在正常的英语文本中,第i个字母出现的频率。
q i : q_i{:} qi:密文中第 i i i个字母出现的频率。
∑ i = 0 25 p i 2 ≈ 0.065 可以观察到: \begin{array}{c}\sum_{i=0}^{25}p_i^2\approx0.065\\ \text{可以观察到:}\end{array} ∑i=025pi2≈0.065可以观察到:

∑ i = 0 25 p i ⋅ q i + j mod 26 ≈ ∑ i = 0 25 p i 2 ≈ 0.065 当且仅当 j = k \sum_{i=0}^{25}p_i\cdot q_{i+j\text{ mod 26}}\approx\sum_{i=0}^{25}p_i^2\approx0.065\text{ 当且仅当}j=k i=0∑25pi⋅qi+j mod 26≈i=0∑25pi2≈0.065 当且仅当j=k

仿射密码:
M = C = { A , B , ... , Z } ∗ ∼ { 0 , ... , 25 } ∗ K = { ( a , b ) ∣ ( a , 26 ) = 1 , 0 ≤ a , b ≤ 25 } E n c ⁡ k ( m 1 ⋯ m ℓ ) = c 1 ⋯ c ℓ , 其中 c i = a m i + b   m o d   26 D e c ⁡ k ( c 1 ⋯ c ℓ ) = m 1 ⋯ m ℓ , 其中 m i = a − 1 ( c i − b )   m o d   26 , a a − 1 ≡ 1   m o d   26 \\\begin{array}{l}\\ \mathcal{M}=\mathcal{C}=\{A,B,\ldots,Z\}^{*}\sim\{0,\ldots,25\}^{*}\\ \\ \mathcal{K}=\{(a,b)\mid(a,26)=1,0\leq a,b\leq25\}\\ \\ \operatorname{\mathrm{Enc}}{k}\left(m_1\cdots m{\ell}\right)=c_1\cdots c_{\ell},\text{ 其中 }c_{i}=am_{i}+b\bmod26\\ \\ \operatorname{\mathrm{Dec}}{k}\left(c_1\cdots c{\ell}\right)=m_1\cdots m_{\ell},\text{ 其中 }m_{i}=a^{-1}\left(c_{i}-b\right)\bmod26\text{, }\\ \\ aa^{-1}\equiv1\bmod26\end{array}\\ M=C={A,B,...,Z}∗∼{0,...,25}∗K={(a,b)∣(a,26)=1,0≤a,b≤25}Enck(m1⋯mℓ)=c1⋯cℓ, 其中 ci=ami+bmod26Deck(c1⋯cℓ)=m1⋯mℓ, 其中 mi=a−1(ci−b)mod26, aa−1≡1mod26

关键计算 a − 1 a^{-1} a−1,用扩展欧几里得除法

单表代换密码
M = C = { A , B , . . . , Z } ∗ ∼ { 0 , . . . , 25 } ∗ \mathcal{M}=\mathcal{C}=\{A,B,...,Z\}^*\sim\{0,...,25\}^* M=C={A,B,...,Z}∗∼{0,...,25}∗
K = S y m ( M ) = M \mathcal{K}=Sym(\mathcal{M})=\mathcal{M} K=Sym(M)=M的所有置换。
E n c k ( m 1 ⋯ m ℓ ) = k ( m 1 ) ⋯ k ( m ℓ ) D e c k ( c 1 ⋯ c ℓ ) = k − 1 ( c 1 ) ⋯ k − 1 ( c ℓ ) \mathsf{Enc}k(m_1\cdots m\ell)=k(m_1)\cdots k(m_\ell)\\\mathsf{Dec}k(c_1\cdots c\ell)=k^{-1}(c_1)\cdots k^{-1}(c_\ell) Enck(m1⋯mℓ)=k(m1)⋯k(mℓ)Deck(c1⋯cℓ)=k−1(c1)⋯k−1(cℓ)

攻击:
∣ K ∣ = 26 ! ≥ 2 88 |\mathcal{K}|=26!\geq2^{88} ∣K∣=26!≥288足够大!

给定英文文本(任何大致知道字母分布的其他文档)的密文,我们可以计算出置换。大密钥空间是必要的(以避免暴力破解攻击),但肯定不足以保证安全性!

多表代换密码

Vigene˙re维吉尼亚密码

选择一串字符作为密钥,明文字符"加上"密钥字符得到密文字符,(必要时折回)。

(例如:第一个V->第t列第c行->V)

攻击:

确定密文中长度为2或者3的重复模式

巧合指数法

可证明安全理论

现代密码学基于可证明安全。

  1. 提供安全目标威胁模型 的形式化安全定义 (Security
    deffnition)。
  2. 明确地说明所需要的假设(Assumption)。
  3. 提供安全性证明 (Security proof),证明算法构造在
    些假设下达到了定义

安全目标*

安全定义 = 安全目标 + 威胁模型

安全目标

敌手 知道 c = E n c k ( m ) c = Enc_k(m) c=Enck(m)

1.敌手不应该得到密钥k。【X】(明文问题)

原因: E n c k ( m ) = m Enc_k(m) = m Enck(m)=m显然不安全

2.给定c,很难恢复整个明文m。【X】(明文问题)

原因:只加密前半部分 E n c k ( m 1 , m 2 ) = E n c k ( m 1 ) , m 2 Enc_k(m1, m2) = Enc_k(m1), m2 Enck(m1,m2)=Enck(m1),m2显然不安全

3.给定c,很难恢复m的任何字符。【X】(关系)

它无法保证敌手在不获得任何特定字符的情况下

得到明文的某些关系,例如 E n c k ( m ) , E n c k ( m ′ ) , 敌手能够获知 m > m ′ Enc_k(m),Enc_k(m^{'}),敌手能够获知 m > m^{'} Enck(m),Enck(m′),敌手能够获知m>m′,这在有些场景下是不可接受的。

不管攻击者已经掌握了什么信息,密文都不应该泄露任何有关底层明文的额外信息。 ----------------------正确的安全目标

威胁模型*:

唯密文攻击 : 最基本的攻击。敌手只能得到一个或多个密

已知明文攻击 : 敌手能够获得明/密文对 。他的目标是推

断使用相同密钥产生的其他密文中包含的明文信息。
选择明文攻击 : 敌手能够获得其任意选择的明文 对应的密

文。
选择密文攻击 : 敌手还可以额外获得其任意选择的密文对
应的明文

威胁模型需要与部署方案的环境相匹配。

困难假设

为了证明安全性,我们需要一些"困难假设"。

安全证明保证了在某种难题假设 下,针对某种威胁模型 下的敌手,我们可以达到某种安全目标

对称加密

完善保密性( P r i v K A , Π e a v \mathsf{PrivK}_{\mathcal{A},\Pi}^{\mathsf{eav}} PrivKA,Πeav)

1.m的分布和 E n c k ( m ) Enc_k(m) Enck(m)的分布独立

2.拥有无限计算能力的窃听者绝对不会获得关于M的任何信息 ,这样的安全性也被称为信息论安全(Information-theoretic security)。

3.密钥要和消息一样长 *。

4.密钥不能复用

5.大多数情况下如此 的安全保障是没必要的。

窃听者存在下不可区分加密:(定义 *)

  1. Π = ( \Pi=( Π=(Gen,Enc,Dec)具有完善不可区分性 (等价于 完善保密性)当且仅当对任意敌手 A \mathcal{A} A有: Pr ⁡ [ PrivK A , Π eav = 1 ] = 1 / 2. \Pr[\text{PrivK}_{\mathcal{A},\Pi}^\text{eav}=1]=1/2. Pr[PrivKA,Πeav=1]=1/2.

  2. Π = ( \Pi=( Π=(Gen,Enc,Dec) 在窃听者存在 的情况下具有不可区分加密,如果对于任意 PPT 敌手 A \mathcal{A} A:
    Pr ⁡ [ PrivK A , Π eav ( n ) = 1 ] ≤ 1 / 2 + \Pr[\text{PrivK}_{\mathcal{A},\Pi}^\text{eav}(n)=1]\leq1/2+ Pr[PrivKA,Πeav(n)=1]≤1/2+negl ( n ) . (n). (n).

  3. Π = ( G e n , E n c , D e c ) \Pi=(Gen,Enc,Dec) Π=(Gen,Enc,Dec)具备在窃听者存在的情况下的不可区分加密当且仅当对所有多项式时间敌手 A \mathcal{A} A

Pr[out A ( \mathcal{A}( A(Priv K A , Π eav ( n , 0 ) ) = 1 ] − \mathrm K{\mathcal{A},\Pi}^\text{eav}(n,0))=1]- KA,Πeav(n,0))=1]−Pr[out A ( \mathcal{A}( A(Priv K A , Π eav ( n , 1 ) ) = 1 ] ∣ ≤ \mathrm K\mathcal{A},\Pi^\text{eav}(n,1))=1]|\leq KA,Πeav(n,1))=1]∣≤negl ( n ) . (n). (n).

我们将定义完善保密性的一个计算变种,其中

1.我们只考虑针对计算能力受限敌手 的安全性。

2.我们允许敌手有微小的 (即忽略不计的)优势,而不是"完美" 保密。

3.加密消息可以任意长 ! Shannon限定不适用于计算设定。

4.保留加密密钥只能使用一次的要求。

计算安全

目标:不能被合理的 计算能力以合理的 概率破解。

1.仅对计算能力受限的敌手安全。

2.安全性会以极小的概率被攻破。

定义方式:
具体方法 (Concrete approach):

讨论具体实例化的安全性。通过明确限定任意(随机)敌手在最多某个特定时间内的最大成功概率,对一个给定的密码学方案的安全性进行量

化。

一个方案是(t, ε)-安全,如果任意一个运行时间最多为t的 敌手,能够以最多为ε的概率成功攻破该方案

具体方法在实际中很重要,但是很难精确地给出具体安全性定义(即给出精确的t和ε)。在一些极端情况下,给定的t和ε可能会失效。

1.精确的运行时间不是很可靠。

2.依赖于硬件的底层构造并且随时间的变化(摩尔定律)。

3.没有考虑并行化或其他计算模式的演进。

于是有:

一个算法的t个步骤 → "有效的计算"

ε → "非常接近于0"的值

也就是:
渐进方法 (Asymptotic approach):

利用计算复杂性理论的思想。

( 引 )
可忽略函数

函数 f : N → R f:\mathbb{N}\to\mathbb{R} f:N→R是可忽略的,如果对于每个多项式 p ( ⋅ ) p(\cdot) p(⋅),存在一个整数 N N N,使得对于所有的整数 n ≥ N n\geq N n≥N,满

足 f ( n ) ≤ 1 p ( n ) f(n)\leq\frac{1}{p(n)} f(n)≤p(n)1,即 ∀ \forall ∀多项式 p ( ⋅ ) , ∃ N p(\cdot),\exists N p(⋅),∃N使得 ∀ n > N : f ( n ) < 1 / p ( n ) . \forall n>N:f(n)<1/p(n). ∀n>N:f(n)<1/p(n).简单来说,定义 3.4可表述为对于任意多项式 p p p和所有足够大的值 n n n,满足 f ( n ) < 1 / p ( n ) . f(n)<1/p(n). f(n)<1/p(n).

一个方案是安全的当且仅当任意多项式敌手(PPT)以可忽略的概率成功攻破一个方案。

典型的渐进安全的陈述:

一个密码方案Π是安全的,当且仅当某些底层的假设或者

组件π是安全的。

一个对称加密方案是概率多项式时间算法(Gen, Enc, Dec)的三元组:

1.密钥生成: k 1 ← k_1\leftarrow k1←Gen ( 1 n ) (1^n) (1n)将安全参数 n n n(一元形

式输入 ) ) )映射为密钥 k . k. k.典型地,Gen ( 1 n ) (1^n) (1n)输出 k k k, k k k在 { 0 , 1 } n \{0,1\}^n {0,1}n均匀一致选取的,我们假设 ∣ k ∣ ≥ n . |k|\geq n. ∣k∣≥n.

2.加密:(概率的)加密算法Enc将 k k k和 m ∈ 0 , 1 ∗ m \in {}{0,1}^{*} m∈0,1∗映射为密文 c ← E n c k ( m ) . b c\leftarrow\mathsf{Enc}_k(m).^{\boldsymbol{b}} c←Enck(m).b

3.解密:
m : = D e c k ( c ) 是 确 定 性 算 法 。 m:= \mathbf{D} ec_k( c) \text{是 确 定 性 算 法 。 } m:=Deck(c)是 确 定 性 算 法 。
正确性:
对于所有有效的安全参数 n 和所有 m ∈ { 0 , 1 } ∗ Pr ⁡ [ m = D e c k ( E n c k ( m ) ) ∣ k ← G e n ( 1 n ) ] = 1. \text{对于所有有效的安全参数}n\text{和所有}m\in\{0,1\}^*\\\Pr[m=\mathsf{Dec}_k(\mathsf{Enc}_k(m))\mid k\leftarrow\mathsf{Gen}(1^n)]=1. 对于所有有效的安全参数n和所有m∈{0,1}∗Pr[m=Deck(Enck(m))∣k←Gen(1n)]=1.

注:

计算安全加密方案甚至会泄露明文长度 *

一个对称加密算法具备不可区分加密,当且仅当它是语义安全的。

PRG(伪随机数生成器)

伪随机性:

非正式地讲,一个分布是伪随机的,如果不能有效区分一个从该分布中选取的样本和一个从均匀随机分布中选取的

样本。
定义 一个分布序列 { \{ {D i s t n } n ∈ N − ist_n\} _n\in \mathbb{N} - istn}n∈N− 其中 { \{ {D i s t n } = ℓ ( n ) ist_n\} = \ell ( n) istn}=ℓ(n)对于某个多项式 ℓ − \ell- ℓ−是伪随机的,当且仅当对所有PPT区分

者 D \mathcal{D} D,有
∣ Pr ⁡ [ D ( U ℓ ( n ) ) = 1 ] − P r [ D ( D i s t n ) = 1 ] ∣ ≤ n e g l ( n ) , \left|\Pr[\mathcal{D}(U_{\ell(n)})=1]\mathrm{-Pr}[\mathcal{D}(\mathrm{Dist}_n)=1]\right|\leq\mathrm{negl}(n), Pr[D(Uℓ(n))=1]−Pr[D(Distn)=1] ≤negl(n),
PRG

一个(确定性的)多项式算法
G : { 0 , 1 } n → { 0 , 1 } ℓ ( n ) G:\{0,1\}^n\to\{0,1\}^{\ell(n)} G:{0,1}n→{0,1}ℓ(n)

是一个伪随机数生成器

当且仅当

1.(扩展性) ∀ n : ℓ ( n ) > n . \forall n:\ell(n)>n. ∀n:ℓ(n)>n.
2. ( 伪随机性 ) { G ( U n ) } n ∈ N 2. ( 伪 随 机 性 ) \{ G( U_n) \} _{n\in \mathbb{N} } 2.(伪随机性){G(Un)}n∈N是伪随机分布序列。

注:

1.PRG的输出与均匀一致 相去甚远。

2.PRG存在当且仅当单向函数存在

一次一密*

参数 t ∈ N t\in\mathbb{N} t∈N
M = K = C = { 0 , 1 } t . \mathcal{M}=\mathcal{K}=\mathcal{C}=\{0,1\}^t. M=K=C={0,1}t.
∙ \bullet ∙ Gen均匀一致随机选取 k ∈ K . k\in\mathcal{K}. k∈K.
∙ \bullet ∙ Enc k ( m ) = m ⊕ k . _k(m)=m\oplus k. k(m)=m⊕k.
∙ \bullet ∙ D e c k ( c ) = c ⊕ k . \mathrm{Dec}_k( c) = c\oplus k. Deck(c)=c⊕k.

方案 使用PRG G : { 0 , 1 } n → { 0 , 1 } ℓ ( n ) . G:\{0,1\}^n\to\{0,1\}^{\ell(n)}. G:{0,1}n→{0,1}ℓ(n).

安全参数 n ∈ N n\in\mathbb{N} n∈N
K = { 0 , 1 } n \mathcal{K}=\{0,1\}^n K={0,1}n
M = C = { 0 , 1 } ℓ ( n ) . \mathcal{M}=\mathcal{C}=\{0,1\}^{\ell(n)}. M=C={0,1}ℓ(n).
∙ \bullet ∙Gen 均匀一致随机选取 k ∈ K . k\in\mathcal{K}. k∈K.
∙ \bullet ∙ Enc k ( m ) = m ⊕ G ( k ) . _k(m)=m\oplus G(k). k(m)=m⊕G(k).
∙ \bullet ∙ Dec k ( c ) = c ⊕ G ( k ) . _k(c)=c\oplus G(k). k(c)=c⊕G(k).

定理 :如果G是一个伪随机数生成器,那么方案是在窃听者存在情况下具备不可区分加密定长对称加密算法

归约证明

归约证明:假设存在 A \mathcal{A} A能够攻破某些方案,那么我们可以构

造 A ′ \mathcal{A^{'}} A′,使其能够攻破底层组建或解决底层计算困难问题。

证明:

证明概述:我们有 Pr [ b ~ ′ = 1 ∣ b ~ = 0 ] = Pr ⁡ [ b = b ′ ∣ b ~ = 0 ] = 1 / 2 [\widetilde{b}^\prime=1\mid\widetilde{b}=0]=\Pr[b=b^\prime\mid\widetilde{b}=0]=1/2 [b ′=1∣b =0]=Pr[b=b′∣b =0]=1/2因为
X b ~ ∼ U ℓ ( n ) X_{\tilde{b}}\sim U_{\ell(n)} Xb~∼Uℓ(n)和一次一密具有完善保密性。
P r [ b ~ ′ = 1 ∣ b ~ = 1 ] = P r [ A ( E n c k ( m b ) ) = b ∣ ( m 0 , m 1 ) ← A , b ← U 1 ] \mathsf{Pr}[\widetilde{b}^{'}=1|\widetilde{b}=1]=\mathsf{Pr}[\mathcal{A}(\mathsf{Enc}_k(m_b))=b|(m_0,m_1)\leftarrow\mathcal{A},b\leftarrow U_1] Pr[b ′=1∣b =1]=Pr[A(Enck(mb))=b∣(m0,m1)←A,b←U1]
≤ 1 / 2 + p ( n ‾ ) . \leq1/2+p(\underline{n}). ≤1/2+p(n).

如果 A \mathcal{A} A攻破加密方案 ⇒ p ( n ) \Rightarrow p(n) ⇒p(n)不是negl ( n ) ⇒ (n)\Rightarrow (n)⇒

|Pr [ b ~ ′ = 1 ∣ b ~ = 0 ] − [\tilde{b}^\prime=1\mid\tilde{b}=0]- [b~′=1∣b~=0]−Pr [ b ~ ′ = 1 ∣ b ~ = 1 ] ∣ = p ( n ) [\tilde{b}^\prime=1\mid\tilde{b}=1]|=p(n) [b~′=1∣b~=1]∣=p(n)是不可忽略的 ⇒ \Rightarrow ⇒与 G G G的安全性相矛盾,因为 A ′ \mathcal{A}^\prime A′攻破了它!!因此 A \mathcal{A} A不存在。

CPA安全(选择明文攻击)*:

  • 非适应性 (non-adaptively)选择明文攻击:所有要加密的消息必须由敌手一次性选择
  • 适应性 (adaptively)选择明文攻击:消息可以由敌手适应性地选择。

IND-CPA安全*:


Π = ( \Pi=( Π=(Gen,Enc,Dec)是(适应性 ) I N D − C P A )IND-CPA )IND−CPA安全,

如果任意PPT敌手
P r [ P r i v K A , Π сра ( n ) = 1 ] ≤ 1 / 2 + n e g l ( n ) . \begin{aligned}\mathsf{Pr}[\mathsf{PrivK}_{\mathcal{A},\Pi}^\text{сра}{(n)}=1]\leq1/2+\mathsf{negl}(n).\end{aligned} Pr[PrivKA,Πсра(n)=1]≤1/2+negl(n).

伪随机函数(PRF)

·伪随机数生成器:有效地扩展一个随机种子,其输出不能和均匀一致地选取的随机字符串区分。

·伪随机函数:一个带密钥的,高效可计算 的函数,该函数和随机函数不可区分。

解释:2.安全:带密钥的函数和随机函数不可区分。

伪随机置换函数(PRP)

置换(Permutation)是一种特殊的映射,其中每个输入元素都有一个唯一的输出元素,并且所有输入元素的输出都是不同的。对于伪随机置换函数而言,它要求输入的每个值都可以通过某种方式得到一个唯一的输出 (即每个输入被"重新排列"到输出中)。关键在于,虽然该函数的行为满足置换的定义,但它的"随机性"是通过加密算法模拟的。

注: 如果F是一个伪随机置换并且满足 ℓ i n ( n ) ≥ n \ell_{in}(n)\geq n ℓin(n)≥n,那么F是一个伪随机函数。

强伪随机置换函数

对于置换,除了计算置换本身,还要计算置换的逆。如果允许区分器访问逆置换预言机 ,PRP仍是安全的,这样的PRP被称为强PRP (Strong PRP)。

定义:F: { 0 , 1 } ℓ k e y × { 0 , 1 } ℓ i n → { 0 , 1 } ℓ o u t \{0,1\}^{\ell_{key}}\times\{0,1\}^{\ell_{in}}\to\{0,1\}^{\ell_{out}} {0,1}ℓkey×{0,1}ℓin→{0,1}ℓout是一个高效的带密钥的置换。F是一个强伪随机置换 (PRP),如果对于多项式时间区分器,存在一个可忽略函数negl,使得:
∣ P r [ D F ( k , ⋅ ) , F − 1 ( k , ⋅ ) = 1 ] − P r [ D f ( ⋅ ) , f − 1 ( ⋅ ) = 1 ] ∣ ≤ n e g l ( n ) . |\mathsf{Pr}[\mathcal{D}^{\mathsf{F}(k,\cdot),\mathsf{F}^{-1}(k,\cdot)}=1]-\mathsf{Pr}[\mathcal{D}^{f(\cdot),f^{-1}(\cdot)}=1]|\leq\mathsf{negl}(n). ∣Pr[DF(k,⋅),F−1(k,⋅)=1]−Pr[Df(⋅),f−1(⋅)=1]∣≤negl(n).

一个利用PRFs/PRPs的CPA安全方案:

安全性证明:

Game0:

Game1:


流密码和分组密码

注:Block cipher 不是一种加密方案

在实际中,PRG是使用流密码实例化 的。
PRP是使用分组密码进行实例化的。实际上,PRP也被称为分组密码。

具体内容(略)

永远不要使用!EBC(电码本)模式

CBC模式

IV是初始向量

如果F是伪随机置换 *,那么CBC模式是CPA-安全的。

F是伪随机置换。CBC模式的主要缺点是必须按顺序进行加密。

链式CBC

链式CBC模式易受CPA攻击
链式CBC (SSL 3.0和TLS 1.0) 复用最后一个密文块作为新的IV 。这减少了带宽,因为不需要每次都发送新的IV 。

但是:不要对标准密码方案进行任何修改,即使这些修改看起来是无关紧要的。

攻击 *:

在如下所示的链式CBC模式中:

C ( 1 ) = ( I V , c 1 , c 2 , c 3 ) ,   C ( 2 ) = ( c 3 , c 4 , c 5 ) , c 1 = F k ( I V ⊕ m 1 ) ,   c 4 = F k ( c 3 ⊕ m 4 ) . C^{(1)}=(IV,c_1,c_2,c_3),\:C^{(2)}=(c_3,c_4,c_5),\\c_{1}=\mathrm{F}_k(IV\oplus m_1),\:c_4=\mathrm{F}_k(c_3\oplus m_4). C(1)=(IV,c1,c2,c3),C(2)=(c3,c4,c5),c1=Fk(IV⊕m1),c4=Fk(c3⊕m4).

假设 m 1 ∈ { 0 , 1 } l , r ∈ { 0 , 1 } l , 令 m 4 = I V ⊕ c 3 ⊕ r , 我 m_1\in \{ 0, 1\} ^l, r\in \{ 0, 1\} ^l\textbf{, 令 }m_4= IV\oplus c_3\oplus r\textbf{, 我 } m1∈{0,1}l,r∈{0,1}l, 令 m4=IV⊕c3⊕r, 我

们可以观察到当 r ˉ = m 1 \bar{\text{们可以观察到当}r}=m_1 们可以观察到当rˉ=m1时有 c 4 = c 1 . c_4=c_1. c4=c1.

核心:构造: m 4 m_4 m4

换句话说,敌手可以通过选择适当的m4来找到m1 ,最多尝试 2 l 2^{l} 2l次。这就是所谓的"BEAST攻击",该漏洞被用于攻击SSL/TLS。

CFB(密文反馈)模式(不考)

加密过程: c i = m i ⊕ M S B j ( F k ( I V i ) ) , 1 ≤ i ≤ t c_i=m_i\oplus MSB_j(F_k(IV_i)),1\leq i\leq t ci=mi⊕MSBj(Fk(IVi)),1≤i≤t ( M S B j (MSB_{j} (MSBj表示取最高 j j j位)

解密过程: m i = c i ⊕ M S B j ( F k ( I V i ) ) , 1 ≤ i ≤ t m_i=c_i\oplus MSB_j(F_k(IV_i)),1\leq i\leq t mi=ci⊕MSBj(Fk(IVi)),1≤i≤t

1.适用于每次处理 j 比特明文块的特定需求的加密情形, 能灵活适应数据各格式的需要。例如对于数据库加密, 要求加密时不能改变明文的字节长度。

2.CFB加密和解密都使用的是伪随机函数*, 本质上是把分组密码当成一个密钥流生产器来使用。

CFB模式特点:

1.改变初始向量会导致相同的明文块产生不同的密文块, 能够隐蔽明文的数据格式

2.明文块的长度j可由用户来确定, 可适应 用户不同的格式要求

3.密文块 c i c_i ci依赖于 m i m_i mi以及所有前面的明文分组

4.密文块 c i c_i ci的一个或多个比特错误会影响该密文块和后续 ⌈ n / j ⌉ ⌈n/j⌉ ⌈n/j⌉个密文块的解密。

5.加密效率低, 一次只能完成j个bit的明文数据加密。

OFB(输出反馈)模式

对比 *: 与CBC模式比较:

1.F k F_k Fk不需要可逆 ,可以用任何PRF而不是PRP

2.明文长度不需要是n的倍数,可以任意长

3.与CBC不同的是,有状态的变体 (其中,最后 y ℓ y_ℓ yℓ被用作下一个加密的IV ) 是安全的 (同步流密码模式) 。

4.支持预计算 。仍然像CBC一样是按顺序进行的,但是 y i y_i yi可以在得知 m i m_i mi之前计算。 m i m_i mi, y i y_i yi计算ci非常快,而且是可并行的。

计数器 (CTR) 模式


∙ \bullet ∙ 为了使用CTR模式加密具有 ℓ < 2 n / 4 \ell<2^n/4 ℓ<2n/4块的消息,首先均匀一致地选择 I V = { 0 , 1 } 3 n / 4 IV=\{0,1\}^{3n/4} IV={0,1}3n/4。 y i : = F k ( I V ∣ ∣ ⟨ i ⟩ ) , i = y_i:=F_k(IV||\langle i\rangle),i= yi:=Fk(IV∣∣⟨i⟩),i= 1 , 2 , ... 1,2,\ldots 1,2,...,其中计数器 i i i被编码为 n / 4 n/4 n/4-比特的字符串。
∙ I V \bullet IV ∙IV和计数器的长度是任意的,只要它们和为 n n n。
∙ \bullet ∙ 较长的 I V IV IV会提供更好的具体安全性,但会减少可加密消息的最大长度。

优势:

1.可完全并行!

2.可以解密单独的消息块。

如果F是一个PRF(伪随机函数),那么CTR模式是CPA-安全的。

生日悖论

如果 q q q个元素 y 1 , . . . , y q y_1,...,y_q y1,...,yq是从大小为 N N N的集合中独立且均匀一致选取的,那么
q ( q − 1 ) 4 N ≤ Pr ⁡ [ ∃ i ≠ j : y i = y j ] ≤ q 2 2 N \frac{q(q-1)}{4N}\leq\Pr[\exists i\neq j:y_i=y_j]\leq\frac{q^2}{2N} 4Nq(q−1)≤Pr[∃i=j:yi=yj]≤2Nq2

第一个不等式适用与任何情况。也就是,不一定必须是均匀分布。

LRCPA(左或右CPA安全)


流密码&分组密码实例化(略,不考)

SP网络

SP网络中, S表示代替, 又称为混淆层, 主要起混淆作用, P表示置换, 又称为扩散层, 主要起扩散作用。

示例图:

SP网络结构的典型应用为高级加密标准(AES)

三层:

Feistel网络

左直接得到右,右需要左异或F的(右+k)
加密过程:
∙ \bullet ∙ 它将明文平均分为左半部分 L 0 L_0 L0和右半部分 R 0 R_0 R0,经过 r ( ≥ r(\geq r(≥ 1)轮迭代完成整个操作过程。
∙ \bullet ∙ 假设第 i − 1 i-1 i−1轮的输出为 L i − 1 L_i-1 Li−1和 R i − 1 R_i-1 Ri−1,它们是第 i i i轮的输入,第 i i i轮的输出为
L i = R i − 1 L_i=R_{i-1} Li=Ri−1
R i = L i − 1 ⊕ f ( R i − 1 , k i ) R_i=L_{i-1}\oplus f(R_{i-1},k_i) Ri=Li−1⊕f(Ri−1,ki)
∙ \bullet ∙ f f f称为轮函数, k i k_i ki是利用加密密钥生成的供第 i i i轮使用的

子密钥。

给定函数 f 1 , . . . , f d : { 0 , 1 } n → { 0 , 1 } n f_1,...,f_d:\{0,1\}^n\to\{0,1\}^n f1,...,fd:{0,1}n→{0,1}n

目标:构造可逆函数F: { 0 , 1 } 2 n → { 0 , 1 } 2 n \{0,1\}^{2n}\to\{0,1\}^{2n} {0,1}2n→{0,1}2n

函数 f i f_i fi是公开的。
优点: f i f_i fi不需要可逆!

对于所有 f 1 , . . . , f d : { 0 , 1 } n → { 0 , 1 } n f_1,...,f_d:\{0,1\}^n\to\{0,1\}^n f1,...,fd:{0,1}n→{0,1}n, Feistel网 络 F: { 0 , 1 } 2 n → { 0 , 1 } 2 n \textbf{络 F: }\{ 0, 1\} ^{2n}\to \{ 0, 1\} ^{2n} 络 F: {0,1}2n→{0,1}2n是可逆的

Feistel网络结构的典型应用为数据加密标准(DES)

Feistel网络的实现与以下参数和特性有关:
分组大小 : 分组越大则安全性越高, 但加密速度就越慢。
密钥大小 : 密钥越长则安全性越高, 但加密速度就越慢。
轮数 : 单轮结构远不足以保证安全性, 但多轮结构可提供足够的安全性。典型地, 轮数取为16。
子密钥产生算法 : 该算法的复杂性越大, 则密码分析的困难性就越大。
轮函数: 轮函数的复杂性越大, 密码分析的困难性也越大。

解密过程

Feistel解密过程本质上和加密过程是一样的, 算法使用密文作为输入, 但使用子密钥Ki的次序与加密过程相反 , 即第1轮使用Kn, 第2轮使用Kn−1...,

最后一轮使用K1。这一特性保证了解密和加密可采用同一算法

加密 解密

在加密过程中:
L E 16 = R E 15 LE_{16}=RE_{15} LE16=RE15
R E 16 = L E 15 ⊕ F ( R E 15 , K 16 ) \begin{aligned}RE_{16}=LE_{15}\oplus F(RE_{15},K_{16})\end{aligned} RE16=LE15⊕F(RE15,K16)

在解密过程中:
L D 1 = R D 0 = L E 16 = R E 15 R D 1 = L D 0 ⊕ F ( R D 0 , K 16 ) = R E 16 ⊕ F ( R E 15 , K 16 ) = L E 15 ⊕ F ( R E 15 , K 16 ) ⊕ F ( R E 15 , K 16 ) = L E 15 \begin{aligned}&LD_1=RD_0=LE_{16}=RE_{15}\\&RD_1=LD_0\oplus F(RD_0,K_{16})\\&=RE_{16}\oplus F(RE_{15},K_{16})\\&=LE_{15}\oplus F(RE_{15},K_{16})\oplus F(RE_{15},K_{16})\\&=LE_{15}\end{aligned} LD1=RD0=LE16=RE15RD1=LD0⊕F(RD0,K16)=RE16⊕F(RE15,K16)=LE15⊕F(RE15,K16)⊕F(RE15,K16)=LE15

所以解密过程第1轮的输出为 R E 15 ∣ ∣ L E 15 RE15||LE15 RE15∣∣LE15, 等于加密过程第16轮输入左右两半交换后的结果。容易证明这种对应关系在16轮中每轮都成立。

一般地, 加密过程的第 i i i 轮有:
L E i = R E i − 1 LE_i = RE_{i-1} LEi=REi−1
R E i = L E i − 1 ⊕ F ( R E i − 1 , K i ) RE_i = LE_{i-1} \oplus F(RE_{i-1}, K_i) REi=LEi−1⊕F(REi−1,Ki)

因此,
R E i − 1 = L E i RE_{i-1} = LE_i REi−1=LEi
L E i − 1 = R E i ⊕ F ( R E i − 1 , K i ) = R E i ⊕ F ( L E i , K i ) LE_{i-1} = RE_i \oplus F(RE_{i-1}, K_i) = RE_i \oplus F(LE_i, K_i) LEi−1=REi⊕F(REi−1,Ki)=REi⊕F(LEi,Ki)

DES

DES (Data Encryption Standard) 算法于1977年得到美国政府的正式许可, 是一种56位密钥来加密*64位 *数据 的方法。这是IBM的研究成果。

基本参数

  • 明文分组长度: 64比特

  • 密文分组长度: 64比特

  • 密钥长度: 64比特

  • 有效密钥长度: 56比特

  • 迭代轮数: 16轮

  • 每轮子密钥长度: 48比特

密钥长度为64 bits, 但有效密钥长度为56 bits------在DES加密开始之前要去掉第8, 16, 24, 32, 40, 48, 56, 64位。去掉的这8位比特用于奇偶校验 , 确保密钥中不包含错误

  • 初始置换IP

    将64 bit明文的位置进行置换 , 得到一个乱序的64 bit明文组 , 而后分成左右两段, 每段为32 bit, 以L0和R0表示。
    可以看出, M各位的初始顺序将被恢复。ip-1(58)=1

  • 16轮迭代运算

    16轮的迭代运算具有相同的结构, 初始置换后的明文与中间结果都被分成左右两半进行处理。同Feistel。注意:第16轮不进行左右交换操作---使加密和解密可以使用同一个算法。

    轮函数f(Ri−1, ki)是DES的核心:

    轮结构:

    • 扩展置换E

      将32位的输入扩展成48位

    • 子密钥异或

    • S盒代替 (DES中唯一的非线性变换) *

      S盒代替是将"子密钥异或"的输出结果(48位)作为S盒代替的输入, 经过变换得到32位的输出。

      每个S盒是一个4行16列的表。

      输入为 x 1 , x 2 , x 3 , x 4 , x 5 , x 6 x_1,x_2,x_3,x_4,x_5,x_6 x1,x2,x3,x4,x5,x6

      输出为 y 1 y 2 y 3 y 4 y_1y_2y_3y_4 y1y2y3y4。
      例子:

    • P盒置换

      1.P盒的各输出块的4个比特都来自不同的输入块;

      2.P盒的各输入块的4个比特都分配到不同的输出块之中;

      3.P盒的第t输出块的4个比特都不来自第t输入块。
      P ( c 1 c 2 . . . c 32 ) = c 16 c 7 c 28 . . . c 11 c 4 c 25 P(c_1c_2 . . . c_{32}) = c_{16}c_{7}c_{28} . . . c_{11}c_4c_{25} P(c1c2...c32)=c16c7c28...c11c4c25

  • 逆初始置换 I P − 1 IP^{-1} IP−1

    将16轮迭代后给出的64 bit组进行置换, 得到输出的密文组。见上述扩展置换E

  • 子密钥产生

    • 初始密钥置换PC-1
    • 循环左移位
    • 压缩置换PC-2



PC-2将56位压缩到48位, 实际上是丢掉了第9, 18,22, 25, 35, 38,43和54位。

注:IP和 I P − 1 IP^{−1} IP−1在密码意义上作用不大, 它们的作用在于打乱原

来输入x的ASCII码字划分的关系。
填充

给定加密消息的长度是随机的,按64 bit分组时,最后一组消息长度可能不足64 bit。可以填充一些数字,通常用最后1字节作为填充指示符(PI)。它所表示的十进制数字就是填充占有的字节数。数据尾部、填充字符和填充指示符一起作为一组进行加密。

解密:


互补性

DES算法具有下述性质。若明文组x逐位取补, 密钥k逐位取补,这种互补性会使DES在选择明文破译下所需的工作量减半。
弱密钥

DES在每轮操作中都会使用一个子密钥。如果给定初始密钥k, 得到的各轮子密钥都相等, 我们就称k为弱密钥。弱密钥的坏处在于加密两次或解密两次就可恢复出明文。

二重DES的问题

用DES进行两次加密, 但这是否就意味着两重DES加密的强度等价于112 bit密钥的密码的强度? [X]

中途相遇攻击法(Meet-in-the-Middle Attack) :

若有明文密文对 ( x i , y i ) (x_i,y_i) (xi,yi)满足
y i = E k 2 [ E k 1 [ x i ] ] y_i=E_{k_2}[E_{k_1}[x_i]] yi=Ek2[Ek1[xi]]

则可得 E k 1 [ x i ] = z = D k 2 [ y i ] E_{k_1}[x_i]=z=D_{k_2}[y_i] Ek1[xi]=z=Dk2[yi]

· 给定一已知明密文对 ( x 1 , y 1 ) (x_1,y_1) (x1,y1),可按下述方法攻击。
∙ \bullet ∙ 以密钥 k 1 k_1 k1的所有 2 56 2^{56} 256个可能的取值对此明文 x 1 x_1 x1加密,并将密文 z z z存储在一个表中;
∙ \bullet ∙ 所有可能的2 56 ^{56} 56个密钥 k 2 k_2 k2中依任意次序选出一个对给定的密文 y 1 y_1 y1解密,并将每次解密结果 z z z在上述表中查找相匹配的值。一旦找到,则可确定出两个密钥 k 1 k_1 k1和 k 2 k_2 k2。

具体内容留在后续更新,先省略。

三重DES

加密: y = E k 1 [ D k 2 [ E k 1 [ x ] ] ] 解密 : x = D k 1 [ E k 2 [ E k 1 [ y ] ] ] \begin{aligned} & \text{加密:} \\ & y=E_{k_1}[D_{k_2}[E_{k_1}[x]]] \\ & 解密: \\ & x=D_{k_1}[E_{k_2}[E_{k_1}[y]]] \end{aligned} 加密:y=Ek1[Dk2[Ek1[x]]]解密:x=Dk1[Ek2[Ek1[y]]]

称其为加密-解密-加密 方案,破译它的穷举密钥搜索量为 2 112 2^{112} 2112量级, 而用分分析破译也要超过 1 0 52 10^{52} 1052。此方案仍有足够的安全性。

AES

明文分组固定: 128 bit (Rijndael明文长度可变128, 192, 256 bit)

密钥长度可变: 128, 192, 256 bit

中间过程比较复杂,之后再补充。

一轮加密过程:

消息认证码MAC

机密性防止 (窃听/CPA)敌手获取通过开放信道发送的消息的任何内容(消息长度除外)。
消息认证性 :确保每一方都可以验证 其收到的消息是由声称发送该消息的一方 发送的,并且消息没有被修改过

机密性和认证性是完全不同 的目标。
加密不能保证任何认证性。消息认证性并不意味着任何机密性!

例子:

考虑具有完善保密性的一次一密。观察到 C = M ⊕ K C=M\oplus K C=M⊕K的敌手可以将包含在密文中的明文 M M M更改为 M ⊕ X M\oplus X M⊕X,其中 X X X可以是任何值。通过将 C C C替换为 C ⊕ X C\oplus X C⊕X,甚至不知道 M ! M! M!

消息认证码定义

消息认证码 (MAC) 是一个概率多项式时间 (PPT) 算法的三元组 (Gen, Mac, Vrfy),满足以下条件:

  1. 密钥生成算法
    密钥生成算法 k ← G e n ( 1 n ) k \leftarrow \mathsf{Gen}(1^n) k←Gen(1n) 将安全参数 n n n 映射为密钥 k k k,其中 ∣ k ∣ ≥ n |k| \geq n ∣k∣≥n(通常, k k k 是从 { 0 , 1 } n \{0,1\}^n {0,1}n 均匀一致选取的)。
  2. 标签生成算法
    标签生成算法 t ← M a c k ( m ) t \leftarrow \mathsf{Mac}_k(m) t←Mack(m) 输入密钥 k k k 和消息 m ∈ { 0 , 1 } ∗ m \in \{0,1\}^* m∈{0,1}∗,并计算一个标签 t t t。
  3. 验证算法
    验证算法 b : = Vrfy k ( m , t ) b := \textbf{Vrfy}_k(m,t) b:=Vrfyk(m,t) 输入密钥 k k k、消息 m m m 和标签 t t t,并输出 b ∈ { 0 , 1 } n b \in \{0,1\}^n b∈{0,1}n(其中,1 表示有效,0 表示无效)。

Gen 是随机的,Mac 可能是随机的。如果 ∣ m ∣ |m| ∣m∣ 被限制为 ℓ ( n ) \ell(n) ℓ(n),则它是一个定长的 MAC。
正确性

对于所有有效的安全参数 n n n 和所有消息 m ∈ { 0 , 1 } ∗ m \in \{0,1\}^* m∈{0,1}∗,
P r [ V r f y k ( m , M a c k ( m ) ) = 1 ∣ k ← G e n ( 1 n ) ] = 1 \mathsf{Pr}[\mathsf{Vrfy}_k(m,\mathsf{Mac}_k(m))=1 \mid k \leftarrow \mathsf{Gen}(1^n)] = 1 Pr[Vrfyk(m,Mack(m))=1∣k←Gen(1n)]=1
规范验证:通常Mac是确定性的,在这种情况下 Vrfy k ( m , t ) 可以被定义为 V r f y k ( m , t ) = 1 ⟺ M a c k ( m ) = t \begin{aligned} & \text{规范验证:通常Mac是确定性的,在这种情况下 Vrfy}_k(m,t)\text{可以被定义为} \\ & \mathsf{Vrfy}_k(m,t)=1\Longleftrightarrow\mathsf{Mac}_k(m)=t \end{aligned} 规范验证:通常Mac是确定性的,在这种情况下 Vrfyk(m,t)可以被定义为Vrfyk(m,t)=1⟺Mack(m)=t

直观的安全性:在不知道 K K K的情况下,对一个"新"的消息 M ′ M^\prime M′,应该很难找出 M ′ , T ′ M^\prime,T^\prime M′,T′使得

Vrfy K ( M ′ , T ′ ) = 1. _K(M^\prime,T^\prime)=1. K(M′,T′)=1.

MAC的安全性

MAC只能保证消息是由知道密钥的一方发送的。控制信道的敌手仍然可以重放、重新排序或删除消息。

可以通过使用序列号或者时间戳可以抵御上述攻击。

强 MACs

A \mathcal{A} A 破坏了MAC的安全性,如果他能找到 ( m ∗ , t ∗ ) (m^*,t^*) (m∗,t∗) 其中 m ∗ ∉ Q m^*\notin\mathcal{Q} m∗∈/Q,也就是,没有明确要求 t ← Мас k ( m ∗ ) . t\leftarrow\textbf{Мас}_k(m^*). t←Масk(m∗).

仅仅找到一个新的 t ∗ ≠ t 其中 Vrfy k ( m ∗ , t ) = 1 t^*\neq t\textbf{ 其中 Vrfy}_k(m^*,t)=1 t∗=t 其中 Vrfyk(m∗,t)=1 不能算是破坏了MAC的安全性。如果一个MAC满足即使仅仅是找到一个新的标签都是困难的这一更强的定义,那么这样的MAC被称为强MAC

(可以理解为单向:对于一个只能对m的标签t,找到一个新的标签很困难)

CBC-MAC

CBC-MAC vs. CBC模式加密

  • 加密需要随机IV ,MAC不需要IV
  • MAC 只输出最终 F 的输出 ,加密全部都需要输出

对于任何多项式 ℓ,如果 F 是一个PRF ,那么对于消息长度为 ℓ(n) · n 的 CBC-MAC 是安全的。

攻击

攻击 1:
如果允许不同长度的消息,则CBC-MAC是不安全的。

发送者 S 只认证长度为 n 的消息。敌手 A 可以对于长度为 2n 的消息伪造标签。

攻击 2:接收者仅接收3块长的消息(Vrfyk(m,t) = 1 当且仅当 m 的长度为 3n 且 t = Mack(m)),但是发送者 S 认证长度为 n 的倍数的任何消息。敌手 A 可以在新消息上伪造标签。

有两种简单的变体允许任意长度的消息:

对消息进行预处理,增加前缀,例如,预先处理消息长度。

使用独立密钥 k′ 再次加密标签。这种结构被称为EMAC,或"加密MAC"。

填充预言机攻击(Padding-oracle attack)

选择密文攻击(chosen-ciphertext attack, CCA)的定义类似于选择明文攻击(CPA),但攻击者不仅可以访问加密预言机 Enck(·),还可以访问解密预言机 Deck(·).

CCA-安全(选择密文攻击)

定义 3.33 Π = ( \Pi=( Π=(Gen,Enc,Dec) 在选择密文攻击下具有不

可区分性,或者是 CCA-安全的 如果对任意PPT敌手
Pr ⁡ [ \Pr[ Pr[PrivK 4 П сса ( n ) = 1 ] ≤ 1 / 2 + _4\text{ П}^\text{сса}(n)=1]\leq1/2+ 4 Псса(n)=1]≤1/2+negl ( n ) (n) (n)

哈希函数

哈希函数:
功能性:压缩

一个哈希函数(输出长度是 ℓ \ell ℓ)是一对PPT算法(Gen,H)满足
∙ s ← G e n ( 1 n ) 输入安全参数 n ,输出密钥 s ∣ s ∣ ≥ n . \begin{array}{l}\bullet&s\leftarrow\mathsf{Gen}(1^n)\text{ 输入安全参数 }n\text{,输出密钥 }s\\&|s|\geq n.\end{array} ∙s←Gen(1n) 输入安全参数 n,输出密钥 s∣s∣≥n.
∙ \bullet ∙对于密钥 s s s和 x ∈ { 0 , 1 } ∗ x\in\{0,1\}^* x∈{0,1}∗, H ( s , x ) H(s,x) H(s,x)输出 { 0 , 1 } ℓ ( n ) \{0,1\}^\ell(n) {0,1}ℓ(n)

中的一个字符串。

如果输入 x x x被限制在 x ∈ ℓ ′ ( n ) , ℓ ′ ( n ) ≥ ℓ ( n ) , 那 么 ( Gen, x\in \ell ^\prime ( n) , \ell ^{\prime }( n) \geq \ell ( n) \textbf{, 那 么 ( Gen, } x∈ℓ′(n),ℓ′(n)≥ℓ(n), 那 么 ( Gen,

H)是一个定长的 哈希函数,或者是压缩函数。

安全性:抗碰撞

П =(Gen,H) 是抗碰撞的,如果对于所有PPT敌手 A \mathcal{A} A
P r s ← G e n ( 1 n ) [ A ( s ) → ( x ≠ x ′ ) ∧ H ( s , x ) = H ( s , x ′ ) ] ⏞ = ⁡ d e f H a s h − c o l l A , Π ( n ) = 1 ≤ n e g l ( n ) ⏟ . \underbrace{\mathsf{Pr}{s\leftarrow\mathsf{Gen}(1^n)}\overbrace{[\mathcal{A}(s)\to(x\neq x^{'})\wedge H(s,x)=H(s,x^{'})]}^{\overset{def}{\operatorname*{=}}\mathsf{Hash-coll}{\mathcal{A},\Pi}(n)=1}\leq\mathsf{negl}(n)}. Prs←Gen(1n)[A(s)→(x=x′)∧H(s,x)=H(s,x′)] =defHash−collA,Π(n)=1≤negl(n).

HMAC

(嵌套的 MAC) NMAC k 1 , k 2 ( m ) = H ( k 2 ∣ ∣ H ( k 1 , m ) ) \text{(嵌套的 MAC) NMAC}_{k_1,k_2}(m)=H(k_2||H(k_1,m)) (嵌套的 MAC) NMACk1,k2(m)=H(k2∣∣H(k1,m))

HMAC是NMAC的一个更实用的变种。

  1. 密钥从单个密钥 k 派生,通过与确定的 ipad, opad 异或。
  2. 对于级联,使用确定的IV.
  3. 安全性证明需要对 h 做更多的假设,而不仅仅是PRF.

MD5

MD5算法采用迭代型哈希函数的一般结构。

  • 输入:任意长的消息

  • 分组:512比特

  • 输出:128比特的消息摘要

SHA-1

  • SHA是基于MD4的算法, 其结构与MD4非常类似。

  • 输入: 小于 2 64 2^{64} 264比特长的任意消息, 分为512比特长的分组。

  • 输出: 160比特长的消息摘要。

SHA-512

  • 算法的输入: 小于 2 128 2^{128} 2128位的消息, 输入消息以1024 bit为单位进行处理

  • 算法的输出: 512位的消息摘要

哈希函数的通用攻击

计算 y i : = H ( x i ) y_i:=\mathsf{H}(x_i) yi:=H(xi)对于随机不同的 x 1 , . . . , x q x_1,...,x_q x1,...,xq,我们找到碰撞的概率是 ≈ q 2 / 2 ℓ . \approx q^2/2^\ell. ≈q2/2ℓ.

如果我们对 q q q-查询的敌手实现抗碰撞,那么 ℓ \ell ℓ 必须满足 q 2 / 2 ℓ ≪ 1 q^2/2^\ell\ll1 q2/2ℓ≪1,尤其是 ℓ > 2 \ell>2 ℓ>2log ( q ) . (q). (q).

必要条件但不是充分条件!

例如, ℓ = 256 \ell=256 ℓ=256可以被 q = 2 1 28 q=2^128 q=2128查询以确定的概率攻破。

对于(第二)原像安全,没有通用攻击的成功概率能够高于 q / 2 ℓ . q/2^\ell. q/2ℓ.

因此, ℓ > 2 \ell>2 ℓ>2log ( q ) (q) (q)是足够的。

去重

去重:云存储提供商将所有存储文件的哈希值存储在一个小数据库中。如果用户想上传新文件 x,检查H(x)是否已经存储了。

  • 如果是,文件已经存储在云上,不需要上传,只需存储一个指针。节省带宽和存储空间。

  • 如果 H 是抗碰撞的,服务器返回错误的文件。

  • 客户端如何确保它得到正确的文件 F?

    可以存储短的指纹 H(F),并检查收到的文件是否匹配!要使客户端接受错误的文件 F′不等于F,需要破坏 H 的抗碰撞性,因为它必须保证 H(F) = H(F′).

Merkle树

∙ 如果客户端存储了很多文件 F 1 , F 2 , . . . , F ℓ ,那么他可以 ∙ 存储所有 h i : = H ( F i ) . 需要与 ℓ 大小线性相关的存储空间。 ∙ 本地只存储一个哈希值 ϕ = H ( h 1 , . . . , h ℓ ) . 需要与 ℓ 大小线性相关的通信开销来检索所有的 h 1 , . . . , h ℓ . ∙ Merkle哈希树将通信开销降低到 log ℓ ! \begin{aligned} & \bullet\text{ 如果客户端存储了很多文件 }F_1,F_2,...,F_\ell\text{,那么他可以} \\ & \bullet\text{ 存储所有 }h_i:=\mathsf{H}(F_i). \\ & \text{需要与 }\ell\text{ 大小线性相关的存储空间。} \\ & \bullet\text{ 本地只存储一个哈希值 }\phi=\mathsf{H}(h_1,...,h_\ell). \\ & \text{需要与 }\ell\text{ 大小线性相关的通信开销来检索所有的} \\ & h_1,...,h_\ell. \\ & \bullet\text{ Merkle哈希树将通信开销降低到 log}\ell! \end{aligned} ∙ 如果客户端存储了很多文件 F1,F2,...,Fℓ,那么他可以∙ 存储所有 hi:=H(Fi).需要与 ℓ 大小线性相关的存储空间。∙ 本地只存储一个哈希值 ϕ=H(h1,...,hℓ).需要与 ℓ 大小线性相关的通信开销来检索所有的h1,...,hℓ.∙ Merkle哈希树将通信开销降低到 logℓ!

有:


∙ 客户端存储 ϕ ,服务器存储所有 F i 和 h . ∙ 如果客户端请求文件,例如, F 010 ,服务器将 F 010 和 log ⁡ ( ℓ ) 个用于计算根的 h 值(黄色标记)。客户端接如 果重新计算得到的值是 ϕ . h 010 ′ : = H ( F 010 ) , h 01 ′ : = H ( h 010 ′ , h 011 ) h 0 ′ : = H ( h 00 , h 01 ) , ϕ ′ : = H ( h 0 , h 1 ′ ) , ϕ ′ = ⁡ ? ϕ \begin{aligned} & \bullet\text{ 客户端存储 }\phi\text{,服务器存储所有 }F_i\text{ 和 }h. \\ & \bullet\text{ 如果客户端请求文件,例如,}F_{010}\text{,服务器将 }F_{010}\text{ 和} \\ & \log(\ell)\text{ 个用于计算根的 }h\text{ 值(黄色标记)。客户端接如} \\ & \text{果重新计算得到的值是 }\phi. \\ & h_{010}^{^{\prime}}:=\mathsf{H}(F_{010}),h_{01}^{^{\prime}}:=\mathsf{H}(h_{010}^{^{\prime}},h_{011}) \\ & h_{0}^{^{\prime}}:=\mathsf{H}(h_{00},h_{01}),\phi^{^{\prime}}:=\mathsf{H}(h_{0},h_{1}^{^{\prime}}),\phi^{^{\prime}}\overset{?}{\operatorname*{=}}\phi \end{aligned} ∙ 客户端存储 ϕ,服务器存储所有 Fi 和 h.∙ 如果客户端请求文件,例如,F010,服务器将 F010 和log(ℓ) 个用于计算根的 h 值(黄色标记)。客户端接如果重新计算得到的值是 ϕ.h010′:=H(F010),h01′:=H(h010′,h011)h0′:=H(h00,h01),ϕ′:=H(h0,h1′),ϕ′=?ϕ

就是:对于F010,给你h011,h00,h1,然后利用树,求出大fai,然后对比这个大fai和文件大

fai是否一致。

MAC和Hash都可以用来保证数据的认证性,有什么区别?

  1. MAC 要求发送方和接收方在相互通信之前预先共享一个秘密密钥
  2. 哈希不需要密钥。但是,它需要一个安全的存储来维护哈希.
  3. 它们适用于不同的应用场景,满足不同的需求!

数论基础及密码学中的困难问题

(这一章主要内容在信息安全数学基础不赘述)


致谢:感谢张源老师一学期的教学

相关推荐
lin zaixi()31 分钟前
C++ STL 快速实现全排列
数据结构·c++·算法
遮天华月2 小时前
C++ 运算符重载详解
c++·学习·算法
宏阳李老师2 小时前
2024-12 GESP C++ 二级试题及答案解析
开发语言·数据结构·c++·算法·青少年编程·gesp·csp
yun_shui_3 小时前
【力扣-KMP】28.找出字符串第一个匹配项的下标
java·数据结构·算法·leetcode
地平线开发者3 小时前
hbdk-model-verifier、hbdk-sim 和 hbdk-hbm-attach 工具使用教程
算法·自动驾驶
weixin_417410083 小时前
day 24 第七章 回溯算法part01
算法
earthzhang20213 小时前
《深入浅出HTTPS》读书笔记(18):公开密钥算法RSA(续)
网络·网络协议·算法·https·1024程序员节
ALISHENGYA4 小时前
Python基础经典编程练习题,含答案
python·算法
martian6655 小时前
深入详解人工智能机器学习常见算法中的K-means聚类
人工智能·算法·机器学习·k-means聚类