现代密码学总结(上篇)
现代密码学总结
(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的保密性。
理由:
- 算法设计保密是不切实际的(逆向工程)。
- 短密钥更容易保护、生成和替换。
- 密码设计应该被公开讨论和分析。
古典密码
单表代换密码
移位密码*
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的重复模式
巧合指数法
可证明安全理论
现代密码学基于可证明安全。
- 提供安全目标和威胁模型的形式化安全定义(Security
deffnition)。 - 明确地说明所需要的假设(Assumption)。
- 提供安全性证明(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),满足以下条件:
- 密钥生成算法
密钥生成算法 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 均匀一致选取的)。 - 标签生成算法
标签生成算法 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。 - 验证算法
验证算法 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的一个更实用的变种。
- 密钥从单个密钥 k 派生,通过与确定的 ipad, opad 异或。
- 对于级联,使用确定的IV.
- 安全性证明需要对 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都可以用来保证数据的认证性,有什么区别?
- MAC要求发送方和接收方在相互通信之前预先共享一个秘密密钥。
- 哈希不需要密钥。但是,它需要一个安全的存储来维护哈希.
- 它们适用于不同的应用场景,满足不同的需求!
数论基础及密码学中的困难问题
(这一章主要内容在信息安全数学基础不赘述)
——————————————————————————————————————————
致谢:感谢张源老师一学期的教学
相关文章:
现代密码学总结(上篇)
现代密码学总结 (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 …...
按照字幕拆解视频实战
1. 基本实现思路 字幕文件处理: 提取字幕内容和时间戳(如 SRT 文件格式)。解析字幕中的开始时间和结束时间。 视频切割: 使用字幕的时间戳,剪辑对应时间段的视频。每段字幕对应一个子视频。 输出子视频: …...
2.11.静态链表
一.静态链表的基本概念: 1.上图说明:索引为0处是头结点,头结点不存储数据,但存储下一个结点的数组下标,本例中头结点里存储的下一个结点的数组下标为2,即索引为2的结点为头结点后的第一个结点,以…...
分页查询在数据库中的好处
分页查询在数据库中的好处主要体现在以下几个方面: 提高性能: 减少数据传输:分页查询只返回请求的页面数据,而不是整个数据集,这减少了网络传输的数据量,降低了网络延迟和带宽消耗。减少内存使用࿱…...
电子应用设计方案-54:智能AI人工智能机器人系统方案设计
智能 AI 人工智能机器人系统方案设计 一、引言 随着人工智能技术的快速发展,智能 AI 机器人在各个领域的应用越来越广泛。本方案旨在设计一个功能强大、智能高效、交互友好的人工智能机器人系统,以满足不同场景下的用户需求。 二、系统概述 1. 系统目标…...
μC/OS-Ⅱ源码学习(6)---事件标志组
快速回顾 μC/OS-Ⅱ中的多任务 μC/OS-Ⅱ源码学习(1)---多任务系统的实现 μC/OS-Ⅱ源码学习(2)---多任务系统的实现(下) μC/OS-Ⅱ源码学习(3)---事件模型 μC/OS-Ⅱ源码学习(4)---信号量 μC/OS-Ⅱ源码学习(5)---消息队列 本文进一步解析事件模型中,事件标志…...
ASP.NET|日常开发中读写TXT文本详解
ASP.NET|日常开发中读写TXT文本详解 前言一、读取 TXT 文本1.1 使用StreamReader类 二、写入 TXT 文本2.1 使用StreamWriter类 三、文件编码问题3.1 常见编码格式 四、错误处理和性能考虑4.1 错误处理4.2 性能考虑 结束语优质源码分享 ASP.NET|日常开发中…...
《C 语言向量运算:点亮人工智能几何计算之路》
在人工智能蓬勃发展的时代,数学运算作为其坚实的基石发挥着不可替代的作用。而向量的点积与叉积运算,更是在人工智能的几何计算领域有着独特且关键的地位。今天,就让我们一同深入探讨如何在 C 语言中实现向量的点积、叉积运算,并领…...
HarmonyOS 获取进程相关的信息process 常用的几个方法
获取进程相关的信息,提供进程管理的相关功能。 process 1. EventListener 2. isIsolatedProcess 3. is64Bit 4. getStartRealtime 5. getPastCpuTime 导入模块 import { process } from kit.ArkTS; 属性 名称类型可读可写说明uidnumber是否进程的用户标识。…...
Linux 权限管理实践:精确控制用户对 systemctl 和 journalctl 命令的使用
前言 在 Linux 系统管理中,精确控制用户对特定命令的访问权限是一项关键的安全实践。使用 systemctl 和 journalctl 命令时,不当的权限设置可能会导致不必要的风险。本篇博客将详细讨论如何通过 sudoers 文件和 Polkit 策略为不同用户配置 systemctl 和…...
图像处理之滤波
中值滤波、均值滤波、高斯滤波和双边滤波是常见的图像处理技术,主要用于去噪和图像平滑。低通滤波和高通滤波用于处理图像中的频率成分。它们的主要区别在于它们所允许通过的频率范围。滤波、卷积、去噪、模糊、提取特征是一个意思。 卷积就是两个矩阵的乘法&#…...
html基础-认识html
1.什么是html html是浏览器可以识别的的标记语言,我们在浏览器浏览的网页就是一个个的html文档 <!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>认识html</title> </head> <body><h1…...
金智塔科技联合浙大人工智能研究所发布全新“智信”可信行业数据空间,共促数字金融创新发展!
由中国计算机学会(CCF)主办,CCF数字金融分会、同济大学、上海立信会计金融学院联合承办,金智塔科技作为金牌合作单位的数字金融领域年度巅峰盛会——首届CCF中国数字金融大会于2024年12月7日在上海成功举办。中国工程院院士蒋昌俊任大会主席,…...
基于单片机的语音识别自动避障小车(论文+源码)
1.系统设计 此次基于单片机的语音识别自动避障小车,以STC89C52单片机作为系统的主控制器,利用超声波模块来实现小车与障碍物距离的测量并通过LCD液晶显示,当距离低于阈值时会通过WT588语音模块进行报警提示,并且小车会后退来躲避…...
使用layui的table提示Could not parse as expression(踩坑记录)
踩坑记录 报错图如下 原因: 原来代码是下图这样 上下俩中括号都是连在一起的,可能导致解析问题 改成如下图这样 重新启动项目,运行正常!...
EF Code 多对多表关系建设和Linq 知识点
自引用组织结构树,比如部门、组织 除了根节点,其他节点都有一个父节点,也包含多个子节点,那么在定义表结构时,既要申明父表的关系,也要申明子表的关系 EF Code 多对多 builder.ToTable("T_Student&…...
Maven 的下载
目录 1、Maven 官方地址2、下载3、解压4、配置本地仓库 1、Maven 官方地址 https://maven.apache.org/ 2、下载 3、解压 将下载的压缩包解压到任意位置 4、配置本地仓库 在 Maven 的安装目录下新建文件夹,用来当作 Maven 的本地仓库 进入 conf 目录下ÿ…...
VPN模式
拓扑结构 实验图: 路由器router 配置 DHCP配置 需要右键激活 路由器项配置网关 dns项配置ip DNS服务配置 正向区域 选择不允许动态更新 反向区域 创建主机 正向 验证是否创建成功 反向查找区域 输入网段 使用默认名称---不允许动态更新 KALI机的验证 web服务…...
LeetCode 热题 100-两数之和(简单)
1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出和为目标值 target 的那两个整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答案。…...
【C语言】拆解C语言的编译过程
前言 学习C语言的过程中,涉及到各种各样的关键词,在我们点击编译的时候,都会做什么呢?让我们来拆解一下 C语言的编译过程 C语言的编译过程包括预处理、编译、汇编和链接四个主要步骤。每个步骤都有其特定的任务和输出文件类型&am…...
RabbitMQ中的Work Queues模式
在现代分布式系统中,消息队列(Message Queue)是实现异步通信和解耦系统的关键组件之一。RabbitMQ 是一个广泛使用的开源消息代理软件,支持多种消息传递模式。其中,Work Queues(工作队列)模式是一…...
OpenCV圆形标定板检测算法findGrid原理详解
OpenCV的findGrid函数检测圆形标定板的流程如下: class CirclesGridClusterFinder {CirclesGridClusterFinder(const CirclesGridClusterFinder&); public:CirclesGridClusterFinder...
快速理解类的加载过程
当程序主动使用某个类时,如果该类还未加载到内存中,则系统会通过如下三个步骤来对该类进行初始化: 1.加载:将class文件字节码内容加载到内存中,并将这些静态数据转换成方法区的运行时数据结构,然后生成一个…...
monorepo代码管理框架
1. 新建 vue3-component 文件夹 2. 运行pnpm init 3. pnpm i vue typescript 4. 新建.npmrc shamefully-hoisttrue link-workspace-packagestrue 5. ts文件配置 pnpm tsc --init 默认.bin路径下的tsc 6. 新建pnpm-workspace.yaml packages:- packages/** # all packages- p…...
LabVIEW实现蓝牙通信
目录 1、蓝牙通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…...
R环境配置 以及Debug方法 (VSCode, conda, 远程R)
生物信息学中的R环境配置 以及Debug方法 开始设置1、建议使用VSCode conda 远程R2、 VSCode配置安装插件安装好插件后,远程设置链接成功后,设置项目 3、 linux conda 和 远程R配置4、VScode 远程访问R环境下面配置远程R 5、开始Debug新建个R文件&#…...
ComfyUI 与 Stable Diffusion WebUI 的优缺点比较
ComfyUI与Stable Diffusion WebUI都是AI绘画领域比较知名两款产品,两者存在诸多差异,本篇就带你熟悉二者的优劣,方便自己做出决策。 界面与操作 ComfyUI:界面简洁直观,通过节点和连线的方式构建工作流,用…...
Ubuntu 系统下安装 Nginx
一、Nginx是什么 是一个高性能的 HTTP 和反向代理 web 服务器,同时也提供了 IMAP/POP3/SMTP 服务。 是一款轻量级的 Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少&…...
【Qt】drawText字体大小问题探究
背景 软件的一个功能是: 打开图片在图片上绘制序号,序号的样式是圆圈内包含数字将带有序号的图片打印出来 实现思路也很简单,在屏幕上显示时重写paintEvent函数,利用QPainter完成图片和序号的绘制。打印时只需要将QPainter对应…...
视频汇聚平台:Liveweb视频流媒体平台视频监控系统解决方案
数字化技术在安防领域的广泛应用已经成为公安等重要执法部门的重要趋势,主要得益于无线网络通信技术和计算机技术的快速进步。传统的视频监控系统存在诸多局限,例如只能进行现场监视,报警信息传输简单,无法远距离传输视频信号&…...
Android开发中有关MediaPlayer 播放.mp3文件使用之一
我们在项目中,经常会添加一个简单的语音提示:我们通常会选择MediaPlayer播放SD文件中的.MP3文件或者存到assets下的.mp3文件。正常使用流程如下: 一、播放assets下的.mp3文件 根据assets获取需要播放的文件名 getApplicationContext().getAs…...
Leetcode经典题11--加油站
题目描述 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 给定两个整数数组 gas 和…...
23种设计模式之状态模式
目录 1. 简介2. 代码2.1 State (定义抽象状态接口)2.2 StartState (实现具体状态类)2.3 EndState (实现具体状态类)2.4 Context (定义上下文类)2.5 Test (测试类…...
大模型的构建与部署(3)——数据标注
版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl1. 数据标注的重要性 1.1 增强数据可解释性 数据标注通过为原始数据添加标签或注释,显著增强了数据的可解释性。在机器学习和深度学习领域,模型的训练依赖于大量带标签的数据。这些标签不仅帮助…...
windows11 专业版 docker desktop 安装指南
家庭中文版需升级专业版,家庭版没有hyper-v。 开始运行optionalfeatures.exe打开windows功能 安装wsl2 步骤 1 - 启用适用于 Linux 的 Windows 子系统步骤 2 - 检查运行 WSL 2 的要求步骤 3 - 启用虚拟机功能步骤 4 - 下载 Linux 内核更新包 步骤 1 - 启用适用于 L…...
mixed strategy
混合策略和期望收益的基本概念 在博弈论中,混合策略是指参与者以一定的概率选择不同的纯策略。期望收益则是在考虑这些概率的情况下,参与者所能获得的平均收益。 以“石头 - 剪刀 - 布”游戏为例 游戏规则回顾 石头胜剪刀,剪刀胜布࿰…...
登上Nature和CVPR!小波变换+UNet上大分!
最近UNet又出现了不少新成果,结合小波变换屡登Nature子刊和CVPR24!比如三路径U-Net模型,利用Haar小波变换大幅提高系统整体性能;再比如利用小波变换的特性来改进U-Net架构的MLWNet网络,性能猛超SOTA! 原因…...
2_使用 HTML5 Canvas API (1) --[HTML5 API 学习之旅]
1.在页面中加入 canvas 在网页中加入 <canvas> 元素可以通过简单的 HTML 和 JavaScript 实现。以下是两个具体的示例,展示了如何在页面中使用 <canvas> 绘制图形和处理用户交互。 示例 1: 简单的静态绘图 这个例子展示了一个基础的 <canvas> 应…...
梳理你的思路(从OOP到架构设计)_UML应用:业务内涵的分析抽象表达01
目录 1、 系统分析(System Analysis) 系統分析的涵意 业务(领域)知识 业务内涵 业务(领域)概念 2、举例(一) :东方传说 UML与建模工具 1、 系统分析(System Analysis) 系統分析的涵意 许多人在学习系统分析(System Analysis)时,常迷失于其字面上…...
redis集群安装部署 redis三主三从集群
redis集群安装部署 redis三主三从集群 1、下载redis2、安装redis集群 三主三从3、配置redis开机自启动3.1、建立启动脚本3.2、复制多份redis启动脚本给集群使用3.3、添加可执行权限3.4、配置开机自启动 1、下载redis 本次redis安装部署选择当前最新的稳定版本7.4.1 下载链接: …...
【PHP】部署和发布PHP网站到IIS服务器
欢迎来到《小5讲堂》 这是《PHP》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言安装PHP稳定版本线程安全版解压使用 PHP配置配置文件扩展文件路径…...
大模型qiming面试内容整理-系统设计与架构
在大模型和机器学习相关岗位的面试中,系统设计与架构的考察通常会涉及如何设计一个可扩展、可靠且高效的机器学习系统,特别是在面对大规模数据和复杂模型时。这一部分的考察不仅测试候选人对机器学习和深度学习的理解,还会评估其如何设计实际生产环境中的系统来满足需求。以…...
【Reading Notes】Favorite Articles from 2024
文章目录 1、January2、February3、March4、April5、May6、June7、July8、August9、September10、October11、November12、December 1、January 2、February 3、March Sora外部测试翻车了!3个视频都有Bug( 2024年03月01日) 不仔细看还真看不…...
Qt-chart 画柱状图
记录下,记录下 效果图 直接上代码 // 创建柱状系列 QBarSeries *series new QBarSeries();// 创建数据集 QBarSet *setTar new QBarSet(("tar"));QBarSet *setReality new QBarSet(("reality"));//添加柱状数据*setTar << 1<<…...
【深入理解Java线程池】
深入理解Java线程池 Java线程池是Java并发编程中的一个重要概念,它提供了一种管理和复用线程的机制,可以显著减少创建和销毁线程的开销,提高系统的响应速度和吞吐量。以下是对Java线程池的详细解析: 一、线程池的基本概念 线程…...
honle电源控制器维修UV灯高压电源EVG EPS200
UV电源控制器维修;honle电源维修;UV电源维修MUC-Steuermodul 2 LΛmpen D-82166 主要维修型号: EPS 60/120、EPS 100、EPS200、EPS 220、EPS 340、LED Spot 100、UV2000F HONLE UV灯高压电源控制器故障包括: 1、电压不稳&#…...
java中List集合小练习
题目:将1~100之间所有正整数存放在一个List集合中,并将集合索引位置时10的对象从集合中移除。 代码: import java.util.ArrayList; import java.util.List;public class ListTest {public ListTest(){List<Integer> listnew ArrayLis…...
【STM32练习】基于STM32的PM2.5环境监测系统
一.项目背景 最近为了完成老师交付的任务,遂重制了一下小项目用STM32做一个小型的环境监测系统。 项目整体示意框图如下: 二.器件选择 单片机(STM32F103)数字温湿度模块(DHT11)液晶显示模块(0.8…...
JS哪些操作会造成内存泄露?
在 JavaScript 中,内存泄露是指程序不再使用的内存没有被释放,从而导致内存的持续增长,最终可能导致性能下降或应用崩溃。以下是一些常见的可能导致内存泄露的操作和情况: 1. 全局变量 如果不小心创建了全局变量,可能…...
《知识拓展 · 统一建模语言UML》
📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗 🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数…...