现代密码学 考点汇总(上)

现代密码学 考点汇总(上)

  • 写在最前面
  • 考试范围
    • 一、给一个简单的方案,判断是否cca安全
    • 二、随机预言机模型之下的简单应用
  • 0. 规约证明
    • 一个规约法证明PRG(伪随机生成器)的例子
    • 定长加密方案,并证明不可区分加密方案
    • CCA安全加密方案
      • 补充
  • 1. 对称加密
    • CPA安全实验、预言机访问(oracle access)
    • 操作模式
      • 伪随机函数PRF
        • PRF例题:一个固定长度的一次一密方案是一个PRF吗?
        • 从PRF到CPA安全的证明
      • 伪随机排列PRP
    • CCA安全加密方案
      • 补充
      • 填充预言机Padding-Oracle攻击真实案例

写在最前面

字数超了,只能分为为两部分
很好,完美避开所有考点

考试范围

一、给一个简单的方案,判断是否cca安全

判断方式:要么证明是cca安全(通过规约),要么找一个攻击方式去攻击

一样一个题
1、对称加密、
2、消息认证码MAC
3、哈希函数、
4、非对称的多样加密的方案
【数字签名不考,因为和mac功能和证明方式、实验都类似】

二、随机预言机模型之下的简单应用

随机预言机性质、随机预言机模型之下的简单应用
性质之下构造函数的性质


笔记汇总

0. 规约证明

在这里插入图片描述

  1. 规约证明

    • 我们现在站在敌手的角色来思考,希望解决“破解”加密方案这个问题,并且在此之前我们已经知道有个一“假设”问题是不可解决的;
    • 为了证明一个加密方案 Π \Pi Π在假设 X X X下是安全的,就是证明“破解”问题不可解。
    • 将解决“假设” X X X问题的算法 A ′ \mathcal{A}' A规约到“破解” Π \Pi Π的算法 A \mathcal{A} A。如果加密方案可以被破解,则假设问题也可以解决。然而,由于假设问题是难以解决的,这导致矛盾,说明加密方案不可以被破解。
    • 先令一个概率多项式时间的算法 A \mathcal{A} A能够以概率 ε ( n ) \varepsilon(n) ε(n)破解 Π \Pi Π
    • 假设:一个问题 X X X是难以解决的,即不存在多项式时间算法来解决 X X X A ′ \mathcal{A}' A是一个解决 X X X的概率算法;
    • 规约:解决假设问题 X X X可以通过破解加密方案 Π \Pi Π,即将 A ′ \mathcal{A}' A规约到 A \mathcal{A} A A ′ \mathcal{A}' A通过以 A \mathcal{A} A作为子函数可以以概率 1 / p ( n ) 1/p(n) 1/p(n)有效地解决问题 X X X
    • 矛盾:若加密方案可以被有效破解,即 ε ( n ) \varepsilon(n) ε(n)是不可忽略的,则 A ′ \mathcal{A}' A可以以不可忽略的概率 ε ( n ) / p ( n ) \varepsilon(n)/p(n) ε(n)/p(n)解决问题 X X X,这与假设矛盾,因而 ε ( n ) \varepsilon(n) ε(n)一定是可忽略的。

一个规约法证明PRG(伪随机生成器)的例子

  1. 一个规约法证明PRG的例子

    • 假设 F F F是PRG,证明 G G G也是PRG。

    • 问题A:如何区分 F F F;问题B:如何区分 G G G

    • 从A规约到B:区分 F F F的算法输入按位取反后作为区分 G G G的算法输入,区分 G G G的算法输出作为区分 F F F的算法输出。
      在这里插入图片描述
      在这里插入图片描述

    • 由此,建立了不可区分定义中概率的联系。

定长加密方案,并证明不可区分加密方案

  1. 一个安全的定长加密方案

    • ∣ G ( k ) ∣ = ℓ ( ∣ k ∣ ) |G(k)| = \ell(|k|) G(k)=(k), m ∈ { 0 , 1 } ℓ ( n ) m \in \{0,1\}^{\ell(n)} m{0,1}(n), 一个PRG以长度为 n n n的密钥作为种子,输出与明文相同长度的pad;
    • G e n \mathsf{Gen} Gen: k ∈ { 0 , 1 } n k \in \{0,1\}^n k{0,1}n,密钥作为种子,长度小于明文长度;
    • E n c \mathsf{Enc} Enc: c : = G ( k ) ⊕ m c := G(k)\oplus m c:=G(k)m,加密方法和一次一密一样;
    • D e c \mathsf{Dec} Dec: m : = G ( k ) ⊕ c m := G(k)\oplus c m:=G(k)c,解密也是;
    • 定理:该定长加密方案是窃听下不可区分的。
    • 直觉上,这个方案和一次一密是类似的,除了密钥更短并且用伪随机生成器生成的比特串来与明文异或。因为伪随机对于任何敌手都可以认为是真随机,所以对于敌手而言,该方案与一次一密是一样的。由此,我们得到了一个安全的加密方案,同时避免了一次一密的最大局限性——密钥过长。
  2. 证明不可区分加密方案

    • 思路:区分伪随机性为难题假设,破解加密方案为规约的子函数。针对伪随机生成器 G G G的区分器 D D D A \mathcal{A} A为子函数,使得当 A \mathcal{A} A破解了 Π \Pi Π D D D可以区分出 G G G,与 G G G的伪随机性矛盾。注意这里我们用了符号 Π ~ \tilde{\Pi} Π~来表示 Π \Pi Π的一个变体,来刻画加密方案中可能使用了真随机串来加密;
    • 回顾针对伪随机生成器的区分器 D D D的问题是,输入一个串 w w w,输出一个比特;这里关键问题是输出的比特从何而来?
    • D D D规约到 A \mathcal{A} A。回顾窃听者不可区分实验中, A \mathcal{A} A与一个挑战者进行3轮交互:
      1. A \mathcal{A} A选择两个不同明文 m 0 , m 1 m_0, m_1 m0,m1,并发送给挑战者;
      2. 挑战者生成密钥,并随机挑选一个明文 m b m_b mb加密后得到挑战密文 c c c,并发送给 A \mathcal{A} A
      3. A \mathcal{A} A输出对所加密明文的猜测 b ′ b' b,若 b = b ′ b=b' b=b,则 A \mathcal{A} A成功;否则,失败;
    • 区分器 D D D成为窃听不可区分实验中的挑战者,特别之处在于:在第2步,不需要生成密钥,而是直接以输入串 w w w作为pad来加密, c : = w ⊕ m b c := w \oplus m_b c:=wmb;根据 w w w的两种可能,分两种情况:
      • w w w是由 G G G生成的,即伪随机串,则 c c c就是加密方案 Π \Pi Π中密文, A \mathcal{A} A面对的就是 Π \Pi Π
      • w w w是真随机串,则 c c c不同于加密方案 Π \Pi Π中密文,而与一次一密中一样, A \mathcal{A} A面对的就是 Π ~ \tilde{\Pi} Π~一次一密;
    • 回答前面关于 D D D输出什么的问题:破解加密方案的 A \mathcal{A} A成功时, D D D输出1;否则, D D D输出0。
  3. 证明不可区分加密方案(续)

    • 规约完毕,证明 A \mathcal{A} A在实验中成功的概率是可忽略的
      • w w w为真随机串 r r r,就是一次一密, Pr ⁡ [ D ( r ) = 1 ] = Pr ⁡ [ P r i v K A , Π ~ e a v ( n ) = 1 ] = 1 2 \Pr[D(r)=1] = \Pr[\mathsf{PrivK}^{\mathsf{eav}}_{\mathcal{A},\tilde{\Pi}}(n)=1]=\frac{1}{2} Pr[D(r)=1]=Pr[PrivKA,Π~eav(n)=1]=21
      • w w w为伪随机串 G ( k ) G(k) G(k) Pr ⁡ [ D ( G ( k ) ) = 1 ] = Pr ⁡ [ P r i v K A , Π e a v ( n ) = 1 ] = 1 2 + ε ( n ) \Pr[D(G(k))=1] = \Pr[\mathsf{PrivK}^{\mathsf{eav}}_{\mathcal{A},\Pi}(n)=1] = \frac{1}{2} + \varepsilon(n) Pr[D(G(k))=1]=Pr[PrivKA,Πeav(n)=1]=21+ε(n)
      • 根据伪随机生成器定义,上下两个公式相减, ∣ Pr ⁡ [ D ( r ) = 1 ] − Pr ⁡ [ D ( G ( k ) ) = 1 ] ∣ = ε ( n ) ≤ n e g l ( n ) \left|\Pr[D(r)=1] - \Pr[D(G(k))=1]\right| = \varepsilon(n) \le \mathsf{negl}(n) Pr[D(r)=1]Pr[D(G(k))=1]=ε(n)negl(n)
      • 所以 ε ( n ) \varepsilon(n) ε(n)是可忽略的,即 Π \Pi Π是窃听者不可区分的。
    • 小结:通过规约将 A \mathcal{A} A的不可区分实验成功的概率与 D D D的区分器实验输出1的概率建立等式;分析输入真随机串时 D D D输出1的概率(即不可区分实验成功概率)是1/2;根据PRG的定义,输入伪随机串时 D D D输出1的概率(1/2+ ε ( n ) \varepsilon(n) ε(n))与输入真随机串时 D D D输出1的概率(1/2)的差异时可忽略的。

CCA安全加密方案

  1. 选择密文攻击 Chosen-Ciphertext Attacks (CCA)

    • CCA不可区分实验 P r i v K A , Π c c a ( n ) \mathsf{PrivK}^{\mathsf{cca}}_{\mathcal{A},\Pi}(n) PrivKA,Πcca(n):

      1. 挑战者生成密钥 k ← G e n ( 1 n ) k \gets \mathsf{Gen}(1^n) kGen(1n);(为了下一步的预言机)
      2. A \mathcal{A} A 被给予输入 1 n 1^n 1n 和对加密函数 E n c k ( ⋅ ) \mathsf{Enc}_k(\cdot) Enck()和解密函数 D e c k ( ⋅ ) \mathsf{Dec}_k(\cdot) Deck()预言机访问(oracle access) A E n c k ( ⋅ ) \mathcal{A}^{\mathsf{Enc}_k(\cdot)} AEnck() A D e c k ( ⋅ ) \mathcal{A}^{\mathsf{Dec}_k(\cdot)} ADeck(),输出相同长度 m 0 , m 1 m_0, m_1 m0,m1
      3. 挑战者生成随机比特 b ← { 0 , 1 } b \gets \{0,1\} b{0,1},将挑战密文 c ← E n c k ( m b ) c \gets \mathsf{Enc}_k(m_b) cEnck(mb) 发送给 A \mathcal{A} A
      4. A \mathcal{A} A 继续对除了挑战密文 c c c之外的预言机的访问,输出 b ′ b' b;如果 b ′ = b b' = b b=b,则 A \mathcal{A} A成功 P r i v K A , Π c c a = 1 \mathsf{PrivK}^{\mathsf{cca}}_{\mathcal{A},\Pi}=1 PrivKA,Πcca=1,否则 0。

      定义:一个加密方案是CCA安全的,如果实验成功的概率与1/2的差异是可忽略的。

  2. 理解CCA安全

    • 在现实世界中,敌手可以通过影响被解密的内容来实施CCA。如果通信没有认证,那么敌手可以以通信参与方的身份来发送特定密文。

    • CCA安全性意味着“non-malleability”(不可锻造性,即改变但不毁坏),不能修改密文来获得新的有效密文。

    • 之前的方案中没有CCA安全,因为都不是不可锻造。

    • 对基于PRF的CPA安全加密方案的CCA攻击:

      • A \mathcal{A} A 获得挑战密文 c = < r , F k ( r ) ⊕ m b > c = \left<r, F_k(r)\oplus m_{b}\right> c=r,Fk(r)mb,并且查询与 c c c只相差了一个翻转的比特的密文 c ′ c' c,那么

        m ′ = c ′ ⊕ F k ( r ) m' = c' \oplus F_k(r) m=cFk(r) 应该与 m b m_{b} mb 除了什么之外都相同?(见下方补充)

    • 问题:上述操作模式也不是CCA安全的(作业)

    • 由此,可以总结出CCA下敌手的常用策略:

      • 修改挑战密文 c c c c ′ c' c,并查询解密预言机得到 m ′ m' m
      • 根据关系,由 m ′ m' m来猜测被加密明文 m b m_b mb

补充

在这个情况下, A \mathcal{A} A 获得了挑战密文 c = < r , F k ( r ) ⊕ m b > c = \left<r, F_k(r)\oplus m_{b}\right> c=r,Fk(r)mb 并查询了一个只在一个比特上与 c c c 不同的密文 c ′ c' c。我们来分析一下 m ′ = c ′ ⊕ F k ( r ) m' = c' \oplus F_k(r) m=cFk(r) m b m_{b} mb 的关系。

首先,我们明确 c c c 的构成:

  • c c c 包含两个部分:一个随机数 r r r 和使用密钥 k k k 的函数 F k ( r ) F_k(r) Fk(r) 与明文 m b m_{b} mb 的异或结果。
  • 因此, c = < r , F k ( r ) ⊕ m b > c = \left<r, F_k(r)\oplus m_{b}\right> c=r,Fk(r)mb

现在,如果 A \mathcal{A} A 查询了一个与 c c c 只在一个比特上不同的密文 c ′ c' c,那么 c ′ c' c 也可以写成两部分,但其中一部分与 c c c 有一个比特的差异。这个差异可以在 r r r 部分,也可以在 F k ( r ) ⊕ m b F_k(r)\oplus m_{b} Fk(r)mb 部分。

A \mathcal{A} A 计算 m ′ = c ′ ⊕ F k ( r ) m' = c' \oplus F_k(r) m=cFk(r) 时,他们实际上是在解开 F k ( r ) ⊕ m b F_k(r)\oplus m_{b} Fk(r)mb 的异或操作。这是因为异或操作是可逆的,且当两次使用相同的值时会取消彼此的效果(即 A ⊕ B ⊕ B = A A \oplus B \oplus B = A ABB=A)。

因此,如果 c ′ c' c 的变化发生在 F k ( r ) F_k(r) Fk(r) 部分,则 m ′ m' m 将与 m b m_{b} mb 完全相同,因为 F k ( r ) F_k(r) Fk(r) 部分的变化被异或操作取消了。但如果变化发生在 r r r 部分,则这个变化不会影响到 F k ( r ) ⊕ m b F_k(r)\oplus m_{b} Fk(r)mb 部分,因此 m ′ m' m 将与 m b m_{b} mb 在一个比特上不同。

综上所述, m ′ m' m m b m_{b} mb 将在以下方面相同:

  • 如果变化发生在 F k ( r ) F_k(r) Fk(r) 部分,那么 m ′ m' m m b m_{b} mb 完全相同。
  • 如果变化发生在 r r r 部分,那么 m ′ m' m m b m_{b} mb 除了那个翻转的比特之外都相同。

1. 对称加密

CPA安全实验、预言机访问(oracle access)

  1. CPA安全实验

    • CPA不可区分实验 P r i v K A , Π c p a ( n ) \mathsf{PrivK}^{\mathsf{cpa}}_{\mathcal{A},\Pi}(n) PrivKA,Πcpa(n):
      1. 挑战者生成密钥 k ← G e n ( 1 n ) k \gets \mathsf{Gen}(1^n) kGen(1n);(这里与窃听者不可区分实验相比,密钥的生成提前了,这是为了下一步提供加密预言机)
      2. A \mathcal{A} A 被给予输入 1 n 1^n 1n 和对加密函数 E n c k ( ⋅ ) \mathsf{Enc}_k(\cdot) Enck()预言机访问(oracle access) A E n c k ( ⋅ ) \mathcal{A}^{\mathsf{Enc}_k(\cdot)} AEnck() ,输出相同长度 m 0 , m 1 m_0, m_1 m0,m1
      3. 挑战者生成随机比特 b ← { 0 , 1 } b \gets \{0,1\} b{0,1},将挑战密文 c ← E n c k ( m b ) c \gets \mathsf{Enc}_k(m_b) cEnck(mb) 发送给 A \mathcal{A} A
      4. A \mathcal{A} A 继续对 E n c k ( ⋅ ) \mathsf{Enc}_k(\cdot) Enck()的预言机的访问,输出 b ′ b' b;如果 b ′ = b b' = b b=b,则 A \mathcal{A} A成功 P r i v K A , Π c p a = 1 \mathsf{PrivK}^{\mathsf{cpa}}_{\mathcal{A},\Pi}=1 PrivKA,Πcpa=1,否则 0。
    • 敌手对加密函数预言机访问是指,敌手以任意明文作为输入,可以从预言机得到对应密文。此处,密钥是已经提前生成的,因此才能通过加密函数预研机得到密文,但仍对敌手保密。预言机是一个形象的比喻,它是一个黑盒,只接收输入并返回输出;访问者不需要了解其内部构造。
    • 该实验与窃听者不可区分实验的区别在于,敌手可访问加密预言机,在实验过程中始终可以,包括在产生两个明文阶段,以及在收到挑战密文后猜测被加密明文阶段,获得任意明文被同一密钥加密的密文;而且密文是逐个获得,可以根据之前的明文和密文对来“适应性地”构造新的查询。
    • CPA敌手比多重加密的敌手更“强大”,因为多重加密敌手是可以一次性地获得一组密文,而CPA敌手可以根据已经获得的明文和密文“多次适应性地”再次获得密文。
  2. CPA安全

    • Π \Pi Π 是CPA不可区分加密方案 (CPA安全的),如果任意概率多项式时间算法 A \mathcal{A} A,存在可忽略的函数 n e g l \mathsf{negl} negl使得,

      Pr ⁡ [ P r i v K A , Π c p a ( n ) = 1 ] ≤ 1 2 + n e g l ( n ) \Pr\left[\mathsf{PrivK}^{\mathsf{cpa}}_{\mathcal{A},\Pi}(n)=1\right] \le \frac{1}{2} + \mathsf{negl}(n) Pr[PrivKA,Πcpa(n)=1]21+negl(n)

    • 定理:CPA安全也是多重加密安全的。证明略。直觉上,CPA敌手比多重加密敌手更强大。

    • 之前的方案也难以实现CPA安全;

    • 多重加密安全意味着CPA安全?(作业)显然是否定的。那么,思考两种安全定义的区别成为解题的关键。

操作模式

伪随机函数PRF

  1. 伪随机函数(Pseudorandom Function)概念

    • 为了实现CPA安全,之前的PRG提供的随机性不够用了,需要新的数学工具为加密提供额外的随机性。为此引入伪随机函数(PRF),是对伪PRG的泛化:PRG从一个种子生成一个随机串,PRF从一个key生成一个函数;
    • 带密钥的函数Keyed function F : { 0 , 1 } ∗ × { 0 , 1 } ∗ → { 0 , 1 } ∗ F : \{0,1\}^* \times \{0,1\}^* \to \{0,1\}^* F:{0,1}×{0,1}{0,1}
      • F k : { 0 , 1 } ∗ → { 0 , 1 } ∗ F_k : \{0,1\}^* \to \{0,1\}^* Fk:{0,1}{0,1}, F k ( x ) = def F ( k , x ) F_k(x) \overset{\text{def}}{=} F(k,x) Fk(x)=defF(k,x)
      • 两个输入到一个输出,看上去像,但不是加密函数;输入key,得到一个一输入到一输出的函数;
    • 查表Look-up table f f f: { 0 , 1 } n → { 0 , 1 } n \{0,1\}^n \to \{0,1\}^n {0,1}n{0,1}n 需要多少比特信息存储?
      • 查表是一个直接描述输入与输出间映射的表格,一个条目对应一个输入与一个输出;当该映射是随机产生的,是一个真随机函数;
    • 函数族Function family F u n c n \mathsf{Func}_n Funcn: 包含所有函数 { 0 , 1 } n → { 0 , 1 } n \{0,1\}^n \to \{0,1\}^n {0,1}n{0,1}n. ∣ F u n c n ∣ = 2 n ⋅ 2 n |\mathsf{Func}_n| = 2^{n\cdot2^n} Funcn=2n2n
      • 一个PRF是函数族中一个子集,key确定下的PRF是函数族中一个元素,一个查表是函数族中一个元素;
    • 长度保留Length Preserving: ℓ k e y ( n ) = ℓ i n ( n ) = ℓ o u t ( n ) = n \ell_{key}(n) = \ell_{in}(n) = \ell_{out}(n) = n key(n)=in(n)=out(n)=n;密钥长度与函数输入、输出长度相同为 n n n;没有特殊说明时,只讨论长度保留的函数;
  2. 伪随机函数定义

    • 直觉上,一个PRF生成的带密钥的函数与从函数族中随机选择的真随机函数(查表)之间是不可区分的;然而,一个真随机函数具有指数长度,无法“预先生成”,只能“on-the-fly”(边运行、边生成)的使用,引入一个对函数 O \mathcal{O} O的确定性的预言机访问(oracle access) D O D^\mathcal{O} DO
    • 这里的预言机是一个抽象的函数。访问预言机,就是给出任意输入,得到该函数的输出。访问预言机的能力不包括了解正在访问的预言机具体内部构造。
    • 一个带密钥的函数是一个伪随机函数(PRF),对任意PPT区分器 D D D ∣ Pr ⁡ [ D F k ( ⋅ ) ( 1 n ) = 1 ] − Pr ⁡ [ D f ( ⋅ ) ( 1 n ) = 1 ] ∣ ≤ n e g l ( n ) \left|\Pr[D^{F_k(\cdot)}(1^n)=1] - \Pr[D^{f(\cdot)}(1^n)=1]\right| \le \mathsf{negl}(n) Pr[DFk()(1n)=1]Pr[Df()(1n)=1] negl(n),其中 f f f F u n c n \mathsf{Func}_n Funcn中随机函数。
      • 这里区分器 D D D是一个算法,可以访问预言机,但并不知道预言机背后是什么。
      • 这里不可区分性关键是,对真随机查表和伪随机函数,区分器输出相同结果概率的差异。区分器输出1或0本身没有,也无需,有特定语义。
    • PRF和PRG的关系在后面会学习,可以由PRG来构造PRF。
PRF例题:一个固定长度的一次一密方案是一个PRF吗?
  1. PRF例题

    • 问题一个固定长度的一次一密方案是一个PRF吗?
    • 对于一个PRF,在密钥保密和没有预言机访问时,给指定输入,能以不可忽略的概率猜测输出相关信息吗?
    • 如果是PRF,则给出该函数与查表的相似性;否则,给出一个区分器可以区分出该函数不是随机的。
  2. 以PRF实现CPA安全

    • 新随机串 r r r,每次新生成一个随机串;
    • F k ( r ) F_k(r) Fk(r): ∣ k ∣ = ∣ m ∣ = ∣ r ∣ = n |k| = |m| = |r| = n k=m=r=n. 长度保留;
    • G e n \mathsf{Gen} Gen: k ∈ { 0 , 1 } n k \in \{0,1\}^n k{0,1}n.
    • E n c \mathsf{Enc} Enc: s : = F k ( r ) ⊕ m s := F_k(r)\oplus m s:=Fk(r)m, c : = < r , s > c := \left<r, s\right> c:=r,s. 密文包括两部分新随机串,以及异或输出;
    • D e c \mathsf{Dec} Dec: m : = F k ( r ) ⊕ s m := F_k(r)\oplus s m:=Fk(r)s.
    • 定理:上述方案是CPA安全的。
从PRF到CPA安全的证明
  1. 从PRF到CPA安全的证明

    • 思路:从PRF的区分器算法 D \mathcal{D} D规约到加密方案敌手算法 A \mathcal{A} A,区分器 D \mathcal{D} D作为敌手 A \mathcal{A} A的挑战者,敌手 A \mathcal{A} A实验成功时区分器 D \mathcal{D} D输出1。分两种情况,当输入真随机函数 f f f时,相当于一次一密;当输入伪随机函数 F k F_k Fk时,为加密方案。
    • 规约: D \mathcal{D} D输入预言机,输出一个比特; A \mathcal{A} A的加密预言机访问通过 D \mathcal{D} D的预言机 O \mathcal{O} O来提供, c : = < r , O ( r ) ⊕ m > c := \left<r, \mathcal{O}(r) \oplus m \right> c:=r,O(r)m D \mathcal{D} D输出1,当 A \mathcal{A} A在实验中成功。
      • 这里有两个预言机: D \mathcal{D} D访问的预言机 O \mathcal{O} O A \mathcal{A} A访问的加密预言机 E n c k \mathsf{Enc}_k Enck,后者不能直接访问前者的预言机。
  2. 从PRF到CPA安全的证明(续)

    • 考虑真随机函数 f f f的情况,分析不可区分实验成功概率 Pr ⁡ [ P r i v K A , Π ~ c p a ( n ) = 1 ] = Pr ⁡ [ B r e a k ] \Pr[\mathsf{PrivK}_{\mathcal{A},\tilde{\Pi}}^{\mathsf{cpa}}(n) = 1] = \Pr[\mathsf{Break}] Pr[PrivKA,Π~cpa(n)=1]=Pr[Break]。敌手 A \mathcal{A} A访问加密预言机可以获得多项式 q ( n ) q(n) q(n)个明文与密文对的查询结果并得到随机串和pad { < r i , f ( r i ) > } \{ \left< r_i, f(r_i) \right> \} {ri,f(ri)};当收到挑战密文 c = < r c , s : = f ( r c ) ⊕ m b > c=\left<r_c, s:=f(r_c)\oplus m_b\right> c=rc,s:=f(rc)mb时,根据之前查询结果中随机串是否与挑战密文中随机串相同,分为两种情况:

      • 当有相同随机串时,根据 r r r可以得到 f ( r c ) f(r_c) f(rc) m b = f ( r c ) ⊕ s m_b=f(r_c)\oplus s mb=f(rc)s,但这种情况发生的概率 q ( n ) / 2 n q(n)/2^n q(n)/2n是可忽略的;
      • 当没有相同随机串时,输出是随机串,相当于一次一密,成功概率=1/2;
    • Pr ⁡ [ D F k ( ⋅ ) ( 1 n ) = 1 ] = Pr ⁡ [ P r i v K A , Π c p a ( n ) = 1 ] = 1 2 + ε ( n ) . \Pr[D^{F_k(\cdot)}(1^n)=1] = \Pr[\mathsf{PrivK}_{\mathcal{A},\Pi}^{\mathsf{cpa}}(n) = 1] = \frac{1}{2} + \varepsilon(n). Pr[DFk()(1n)=1]=Pr[PrivKA,Πcpa(n)=1]=21+ε(n).

    • Pr ⁡ [ D f ( ⋅ ) ( 1 n ) = 1 ] = Pr ⁡ [ P r i v K A , Π ~ c p a ( n ) = 1 ] = Pr ⁡ [ B r e a k ] ≤ 1 2 + q ( n ) 2 n . \Pr[D^{f(\cdot)}(1^n)=1] = \Pr[\mathsf{PrivK}_{\mathcal{A},\tilde{\Pi}}^{\mathsf{cpa}}(n) = 1] = \Pr[\mathsf{Break}] \le \frac{1}{2} + \frac{q(n)}{2^n}. Pr[Df()(1n)=1]=Pr[PrivKA,Π~cpa(n)=1]=Pr[Break]21+2nq(n).

    • Pr ⁡ [ D F k ( ⋅ ) ( 1 n ) = 1 ] − Pr ⁡ [ D f ( ⋅ ) ( 1 n ) = 1 ] ≥ ε ( n ) − q ( n ) 2 n . \Pr[D^{F_k(\cdot)}(1^n)=1] - \Pr[D^{f(\cdot)}(1^n)=1] \ge \varepsilon(n) - \frac{q(n)}{2^n}. Pr[DFk()(1n)=1]Pr[Df()(1n)=1]ε(n)2nq(n). 根据伪随机函数定义, ε ( n ) \varepsilon(n) ε(n) 是可忽略的.

    • 小结:通过规约将 A \mathcal{A} A的不可区分实验成功的概率与 D D D的区分器实验输出1的概率建立等式;分析输入真随机函数预言机时 D D D输出1的概率(即不可区分实验成功概率)是1/2+一个可忽略函数;根据PRF的定义,输入伪随机函数预言机时 D D D输出1的概率(1/2+ ε ( n ) \varepsilon(n) ε(n))与输入真随机函数预言机时 D D D输出1的概率(1/2)的差异时可忽略的。

  3. CPA安全例题

    • E n c k ( m ) = P R G ( k ∥ r ) ⊕ m \mathsf{Enc}_k(m) = PRG(k\|r) \oplus m Enck(m)=PRG(kr)m, r r r 是新的随机串。这是CPA安全的吗?
    • 从PRF到CPA安全:变长消息
    • 对于任意长度消息 m = m 1 , … , m ℓ m = m_1, \dots , m_{\ell} m=m1,,m c : = < r 1 , F k ( r 1 ) ⊕ m 1 , r 2 , F k ( r 2 ) ⊕ m 2 , … , r ℓ , F k ( r ℓ ) ⊕ m ℓ > c := \left< r_1, F_k(r_1) \oplus m_1, r_2, F_k(r_2) \oplus m_2, \dots, r_\ell, F_k(r_\ell) \oplus m_\ell\right> c:=r1,Fk(r1)m1,r2,Fk(r2)m2,,r,Fk(r)m
    • 推论:如果 F F F是一个 PRF,那么 Π \Pi Π 对任意长度消息是 CPA 安全的。
    • 问题:这个方案有什么缺点?
    • 有效性: ∣ c ∣ = 2 ∣ m ∣ |c| = 2|m| c=2∣m. 密文长度是明文长度的二倍,并且需要大量的真随机串。

伪随机排列PRP

  1. 伪随机排列(Pseudorandom Permutations

    • 为了提高对任意长度消息加密的效率,以及更高级的加密基础工具,学习伪随机排列PRP的概念;

    • 双射 Bijection: F F F 是一到一的(一个输入对应一个唯一输出)且满射(覆盖输出集中每个元素);

    • 排列 Permutation: 一个从一个集合到自身的双射函数;

    • 带密钥的排列 Keyed permutation: ∀ k , F k ( ⋅ ) \forall k, F_k(\cdot) k,Fk()是排列;类似带密钥的函数;

    • F F F 是一个双射    ⟺    F − 1 \iff F^{-1} F1 是一个双射;函数和逆函数都是双射;

    • 定义:一个有效的带密钥的排列 F F F 是PRP,如果对于任意PPT的区分器 D D D

      ∣ Pr ⁡ [ D F k ( ⋅ ) , F k − 1 ( ⋅ ) ( 1 n ) = 1 ] − Pr ⁡ [ D f ( ⋅ ) , f − 1 ( ⋅ ) ( 1 n ) = 1 ] ∣ ≤ n e g l ( n ) \left|\Pr[D^{F_k(\cdot),F_k^{-1}(\cdot)}(1^n)=1] - \Pr[D^{f(\cdot),f^{-1}(\cdot)}(1^n)=1]\right| \le \mathsf{negl}(n) Pr[DFk(),Fk1()(1n)=1]Pr[Df(),f1()(1n)=1] negl(n)

    • 问题:一个PRP也是一个PRF吗?

  2. PRP例题

    • 对1比特的PRP、PRF的分析;
    • 交换引理:如果 F F F 是一个 PRP 并且 ℓ i n ( n ) ≥ n \ell_{in} (n) \ge n in(n)n,那么 F F F 也是一个 PRF。
      • 一个随机排列和一个查表是不可取分的,PRP和随机排列不可取分,因此,PRP和查表是不可取分的。
  3. 操作模式概念(Modes of Operation

    • 操作模式是使用PRP或PRF来加密任意长度消息的方法;
    • 操作模式是从PRP或PRF来构造一个PRG的方法;
    • 将一个消息分成若干等长的块(分组,block),每个块以相似方式处理;
  4. Electronic Code Book (ECB) 模式

    • 在窃听者出现时,是否是不可区分的?
    • F F F 可以是任意PRF吗?
  5. 对ECB的攻击

    • 为什么仍然可以识别企鹅?
  6. Cipher Block Chaining (CBC) 模式

    • I V IV IV初始向量,一个新的随机串;
    • 是CPA的吗?可并行化吗?F可以是任意PRF吗?
  7. Output Feedback (OFB) Mode模式

    • 是CPA安全吗?可并行化吗?F可以是任意PRF吗?
  8. Counter (CTR) Mode模式

    • c t r ctr ctr是一个初始向量,并且逐一增加;
    • 是CPA安全吗?可并行化吗?F可以是任意PRF吗?
  9. CTR模式是CPA安全
    在这里插入图片描述

    • 定理:如果 F F F是一个PRF,那么随机CTR模式是CPA安全的。

    • 证明:其安全性与之前基于PRF的CPA安全证明类似,从PRF的伪随机假设规约到CPA安全加密方案。其中,对 c t r ctr ctr的安全性直觉在于, c t r ctr ctr也是在加密前不可预测的,且每个块所用 c t r ctr ctr都是不同的;

    • 当加密预言机是由真随机查表构成时,敌手多次访问加密预言机得到的 c t r ctr ctr序列与挑战密文的 c t r ctr ctr序列之间有重叠的概率 2 q ( n ) 2 2 n \frac{2q(n)^2}{2^n} 2n2q(n)2是可以忽略的;若没有重叠,则相当于一次一密;

    • 规约与之前证明基于PRF的CPA安全加密方案一样,证明过程也类似。

  10. 初始向量不应该可预测

    • 如果 I V IV IV是可预测的,那么CBC/OFB/CTR模式不是CPA安全的。
    • 为什么?(作业)
    • 在SSL/TLS 1.0中的漏洞:记录 # i \#i #i I V IV IV是上一个记录 # ( i − 1 ) \#(i-1) #(i1)的密文块。
    • OpenSSL中API:需要用户输入 I V IV IV,但 I V IV IV应在函数内实现。当 I V IV IV不充分随机时不安全。
  11. 非确定性加密

    • 有三种通用的实现CPA安全的非确定性加密方法:
    • 随机化的: r r r随机生成,如构造5;需要更多熵,长密文
    • 有状态的: r r r为计数器,如CTR模式;需要通信双方同步计数器
    • 基于Nonce的: r r r只用一次;需要保证只用一次,长密文

CCA安全加密方案

  1. 选择密文攻击 Chosen-Ciphertext Attacks (CCA)

    • CCA不可区分实验 P r i v K A , Π c c a ( n ) \mathsf{PrivK}^{\mathsf{cca}}_{\mathcal{A},\Pi}(n) PrivKA,Πcca(n):

      1. 挑战者生成密钥 k ← G e n ( 1 n ) k \gets \mathsf{Gen}(1^n) kGen(1n);(为了下一步的预言机)
      2. A \mathcal{A} A 被给予输入 1 n 1^n 1n 和对加密函数 E n c k ( ⋅ ) \mathsf{Enc}_k(\cdot) Enck()和解密函数 D e c k ( ⋅ ) \mathsf{Dec}_k(\cdot) Deck()预言机访问(oracle access) A E n c k ( ⋅ ) \mathcal{A}^{\mathsf{Enc}_k(\cdot)} AEnck() A D e c k ( ⋅ ) \mathcal{A}^{\mathsf{Dec}_k(\cdot)} ADeck(),输出相同长度 m 0 , m 1 m_0, m_1 m0,m1
      3. 挑战者生成随机比特 b ← { 0 , 1 } b \gets \{0,1\} b{0,1},将挑战密文 c ← E n c k ( m b ) c \gets \mathsf{Enc}_k(m_b) cEnck(mb) 发送给 A \mathcal{A} A
      4. A \mathcal{A} A 继续对除了挑战密文 c c c之外的预言机的访问,输出 b ′ b' b;如果 b ′ = b b' = b b=b,则 A \mathcal{A} A成功 P r i v K A , Π c c a = 1 \mathsf{PrivK}^{\mathsf{cca}}_{\mathcal{A},\Pi}=1 PrivKA,Πcca=1,否则 0。

      定义:一个加密方案是CCA安全的,如果实验成功的概率与1/2的差异是可忽略的。

  2. 理解CCA安全

    • 在现实世界中,敌手可以通过影响被解密的内容来实施CCA。如果通信没有认证,那么敌手可以以通信参与方的身份来发送特定密文。下一页有具体真实案例。

    • CCA安全性意味着“non-malleability”(不可锻造性,即改变但不毁坏),不能修改密文来获得新的有效密文。

    • 之前的方案中没有CCA安全,因为都不是不可锻造。

    • 对基于PRF的CPA安全加密方案的CCA攻击:

      • A \mathcal{A} A 获得挑战密文 c = < r , F k ( r ) ⊕ m b > c = \left<r, F_k(r)\oplus m_{b}\right> c=r,Fk(r)mb,并且查询与 c c c只相差了一个翻转的比特的密文 c ′ c' c,那么

        m ′ = c ′ ⊕ F k ( r ) m' = c' \oplus F_k(r) m=cFk(r) 应该与 m b m_{b} mb 除了什么之外都相同?(见下方的补充)

    • 问题:上述操作模式也不是CCA安全的(作业)

    • 由此,可以总结出CCA下敌手的常用策略:

      • 修改挑战密文 c c c c ′ c' c,并查询解密预言机得到 m ′ m' m
      • 根据关系,由 m ′ m' m来猜测被加密明文 m b m_b mb

补充

在这个情况下, A \mathcal{A} A 获得了挑战密文 c = < r , F k ( r ) ⊕ m b > c = \left<r, F_k(r)\oplus m_{b}\right> c=r,Fk(r)mb 并查询了一个只在一个比特上与 c c c 不同的密文 c ′ c' c。我们来分析一下 m ′ = c ′ ⊕ F k ( r ) m' = c' \oplus F_k(r) m=cFk(r) m b m_{b} mb 的关系。

首先,我们明确 c c c 的构成:

  • c c c 包含两个部分:一个随机数 r r r 和使用密钥 k k k 的函数 F k ( r ) F_k(r) Fk(r) 与明文 m b m_{b} mb 的异或结果。
  • 因此, c = < r , F k ( r ) ⊕ m b > c = \left<r, F_k(r)\oplus m_{b}\right> c=r,Fk(r)mb

现在,如果 A \mathcal{A} A 查询了一个与 c c c 只在一个比特上不同的密文 c ′ c' c,那么 c ′ c' c 也可以写成两部分,但其中一部分与 c c c 有一个比特的差异。这个差异可以在 r r r 部分,也可以在 F k ( r ) ⊕ m b F_k(r)\oplus m_{b} Fk(r)mb 部分。

A \mathcal{A} A 计算 m ′ = c ′ ⊕ F k ( r ) m' = c' \oplus F_k(r) m=cFk(r) 时,他们实际上是在解开 F k ( r ) ⊕ m b F_k(r)\oplus m_{b} Fk(r)mb 的异或操作。这是因为异或操作是可逆的,且当两次使用相同的值时会取消彼此的效果(即 A ⊕ B ⊕ B = A A \oplus B \oplus B = A ABB=A)。

因此,如果 c ′ c' c 的变化发生在 F k ( r ) F_k(r) Fk(r) 部分,则 m ′ m' m 将与 m b m_{b} mb 完全相同,因为 F k ( r ) F_k(r) Fk(r) 部分的变化被异或操作取消了。但如果变化发生在 r r r 部分,则这个变化不会影响到 F k ( r ) ⊕ m b F_k(r)\oplus m_{b} Fk(r)mb 部分,因此 m ′ m' m 将与 m b m_{b} mb 在一个比特上不同。

综上所述, m ′ m' m m b m_{b} mb 将在以下方面相同:

  • 如果变化发生在 F k ( r ) F_k(r) Fk(r) 部分,那么 m ′ m' m m b m_{b} mb 完全相同。
  • 如果变化发生在 r r r 部分,那么 m ′ m' m m b m_{b} mb 除了那个翻转的比特之外都相同。

填充预言机Padding-Oracle攻击真实案例

  1. Padding-Oracle(填充预言机)攻击真实案例

    • CAPTCHA服务商为Web网站提供验证用户是否为人类的服务。为此,一个CAPTCHA服务器与Web服务器间事先共享一个密钥 k k k,服务工作原理如下:
      1. 当Web服务器验证用户是否为人类时,生成一个消息 w w w并以 k k k加密,向用户发送一个密文 E n c k ( w ) Enc_k(w) Enck(w)
      2. 用户将密文 E n c k ( w ) Enc_k(w) Enck(w)转发给CAPTCHA服务器;(可实施填充预言机攻击)
      3. CAPTCHA服务器用密钥 k k k将密文解密,根据解密结果返回给用户信息:一个由 w w w生成的图像,或者坏填充错误;
      4. 用户根据图像获得 w w w 并将 w w w 发送给Web服务器。
    • 在第2步,当恶意用户可以利用CAPTCHA服务器会返回给用户坏填充错误这一漏洞,来实施填充错误攻击。
  2. Padding-Oracle(填充预言机)攻击

    • 在PKCS #5 padding(填充)标准中,为了将一个消息的长度“填充”到块长度的整数倍,在最后一个块中填充 b b b个字节的 b b b;必要时,添加一个哑块(dummy block,不包含消息的一个填充块)。存在一种攻击手段:当填充错误时,解密服务器返回一个“坏填充错误”,这相当于提供了一个解密预言机,最终可以获得整个明文;
    • 具体攻击原理:
      • 更改密文(包含 I V IV IV部分)并发送给解密服务器;
      • 一旦触发了“坏填充错误”,则说明对密文的更改导致了填充部分内容的更改;否则,对密文的更改导致了原明文部分的更改;
      • 通过仔细修改密文来控制填充部分,从而获得消息长度和内容。
  3. 填充预言机攻击:获得消息长度

    • 攻击的第一步判断消息是否为空:在单个块的CBC中,通过更改 I V IV IV的首个字节,攻击者能够获知是否 m m m是否为空。因为如果 m m m是空的话,更改 I V IV IV首个字节将更改解密出的填充内容,解密服务器就会返回坏填充错误(1比特信息),具体分析如下:
      • 如果 m m m是空的,那么明文会添加一个哑块 { b } b \{b\}^b {b}b
      • PRP的输入为 I V ⊕ { b } b IV\oplus \{b\}^b IV{b}b;设 I V IV IV的首个字节为 x x x,则PRP的输入为 ( x ⊕ b ) ∥ ( { ⋅ } b − 1 ⊕ { b } b − 1 ) (x \oplus b) \| (\{\cdot\}^{b-1} \oplus \{b\}^{b-1}) (xb)({}b1{b}b1)
      • I V IV IV的首个字节从 x x x改成 y y y变为 y ∥ ( { ⋅ } b − 1 ) y \| (\{\cdot\}^{b-1}) y({}b1),不改变 c 1 c_1 c1解密得到的PRP的输入不会变,而解密出的明文会改变为 ( x ⊕ y ⊕ b ) ∥ { b } b − 1 (x \oplus y \oplus b) \| \{b\}^{b-1} (xyb){b}b1
      • 上述明文首个字节一定不是 b b b,这是填充格式错误,会触发服务器返回错误;
      • 如果上面的尝试没有触发错误,那么说明消息非空;下一步,发现消息长度是否为1字节,方法与上一步一样,区别在于只改变 I V IV IV的第2个字节;如此继续,获得消息的长度;(作业)
  4. 填充预言机攻击:获得消息内容

    • 一旦获得消息的长度,也就知道了填充的长度 b b b,采用下面的方法来获得消息的最后一个字节内容,进而获得整个消息;
    • 更改密文中倒数第二块,来获得消息的最后一个字节 s s s
    • 明文的最后一个块 m l a s t = ⋯ s ∥ { b } b m_{last} = \cdots s \| \{b\}^{b} mlast=s{b}b,密文的倒数第二个块 c l a s t − 1 = ⋯ t ∥ { ⋅ } b c_{last-1} = \cdots t \| \{\cdot \}^{b} clast1=t{}b
    • 最后一块的PRP输入为 c l a s t − 1 ⊕ m l a s t = ⋯ ( s ⊕ t ) ∥ ( { b } b ⊕ { ⋅ } b ) c_{last-1} \oplus m_{last} = \cdots (s \oplus t) \| (\{b\}^b \oplus \{\cdot \}^{b}) clast1mlast=(st)({b}b{}b)
    • 敌手更改 c l a s t − 1 c_{last-1} clast1 c l a s t − 1 ′ = ⋯ u ∥ ( { ⋅ } b ⊕ { b } b ⊕ { b + 1 } b ) c_{last-1}' = \cdots u \| (\{\cdot \}^{b} \oplus \{b\}^{b} \oplus \{b+1\}^{b}) clast1=u({}b{b}b{b+1}b);其中, u u u是敌手猜测的某个字节;
    • 解密获得最后一块明文 m l a s t ′ = c l a s t − 1 ⊕ m l a s t ⊕ c l a s t − 1 ′ = ⋯ ( s ⊕ t ⊕ u ) ∥ { b + 1 } b m'_{last} = c_{last-1} \oplus m_{last} \oplus c_{last-1}' = \cdots (s \oplus t \oplus u)\| \{ b+1 \}^b mlast=clast1mlastclast1=(stu){b+1}b
    • 如果没有返回坏填充错误,那么意味着填充了 b + 1 b+1 b+1个字节的 b + 1 b+1 b+1,所以 s ⊕ t ⊕ u = ( b + 1 ) s \oplus t \oplus u = (b+1) stu=(b+1) ,而 s = t ⊕ u ⊕ ( b + 1 ) s = t \oplus u \oplus (b+1) s=tu(b+1)
  5. 总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/328974.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【二、自动化测试】为什么要做自动化测试?哪种项目适合做自动化?

自动化测试是一种软件测试方法&#xff0c;通过编写和使用自动化脚本和工具&#xff0c;以自动执行测试用例并生成结果。 自动化旨在替代手动测试过程&#xff0c;提高测试效率和准确性。 自动化测试可以覆盖多种测试类型&#xff0c;包括功能测试、性能测试、安全测试等&…

wins安装paddle框架

一、安装 https://www.paddlepaddle.org.cn/install/quick?docurl/documentation/docs/zh/install/pip/windows-pip.html 装包&#xff08;python 的版本是否满足要求&#xff1a; 3.8/3.9/3.10/3.11/3.12&#xff0c; pip 版本为 20.2.2 或更高版本 &#xff09; CPU 版:…

python贪吃蛇游戏

为了实现这个游戏&#xff0c;需要用到Python的pygame模块&#xff0c;它是一个专门用于开发游戏的模块&#xff0c;提供了很多方便的功能&#xff0c;比如窗口、图形、音效、事件处理等。 用pygame来创建一个窗口&#xff0c;设置游戏的背景色&#xff0c;画出蛇和食物&#…

Flutter首页框架搭建

1.下载flutter 2. 安装android 3.配置环境变量 关于环境搭建部分&#xff0c;哪天写一下&#xff0c;日志杂乱无章。 打开android studio 新建项目&#xff0c;选择flutter 新建文件夹创建 navigator和pages 文件夹下分别创建文件&#xff0c;tab_navigator.dart&#xff…

Docker RTMP服务器搭建与视频流推送示例(流媒体服务器tiangolo/nginx-rtmp,推流客户端ffmpeg)

文章目录 RTMP服务器搭建与视频流推送第一部分&#xff1a;搭建RTMP服务器&#xff08;流媒体服务器&#xff09;1.1 安装Docker1.2 搭建RTMP服务器 第二部分&#xff1a;使用ffmpeg进行视频推流&#xff08;推流客户端&#xff09;2.1 安装ffmpeg2.2 使用ffmpeg推流 第三部分&…

【数据结构】二叉树-堆(top-k问题,堆排序,时间复杂度)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;《数据结构》https://blog.csdn.net/qinjh_/category_12536791.html?spm1001.2014.3001.5482 ​​ 目录 堆排序 第一种 ​编辑 第二种 …

npm install 无反应 npm run serve 无反应

说明情况&#xff1a;其实最开始我就是发现我跟着黑马的苍穹外卖的前端day2的环境搭建做的时候&#xff0c;到这一步出现了问题&#xff0c;无论我怎么 npm install 和 npm run serve 都没有像黑马一样有很多东西进行加载&#xff0c;因此我换了一种方法 1.在这个文件夹下cmd …

助力工业焊缝质量检测,YOLOv3开发构建工业焊接场景下钢材管道焊缝质量检测识别分析系统

焊接是一个不陌生但是对于开发来说相对小众的场景&#xff0c;在我们前面的博文开发实践中也有一些相关的实践&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《轻量级模型YOLOv5-Lite基于自己的数据集【焊接质量检测】从零构建模型超详细教程》 《基于DeepLabV3Pl…

计算机组成原理-程序中断方式完整流程

文章目录 程序中断方式完整流程例题小结 程序中断方式完整流程 首先CPU通过执行IO指令来启动外部设备&#xff0c;此时外部设备可以开始做准备工作了&#xff08;准备CPU想要的数据或者信息&#xff09;&#xff0c;在外部设备准备过程中&#xff0c;CPU可以继续执行原程序的内…

CES 2024,从枕头到汽车,一切皆可AI

文 / 胡泳 北京大学新闻与传播学院教授 世界上最大的消费类电子展CES是令人难以置信的创新的展示舞台。 我在拉斯维加斯泡了四五天&#xff0c;跟踪了展出的大部分小工具、应用程序和概念产品。这些产品既有趣又实用&#xff0c;它们要么以全新的方式利用技术解决了某个特定的问…

AI对决:ChatGPT与文心一言的比较

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 引言ChatGPT与文心一言的比较Chatgpt的看法文心一言的看法Copilot的观点chatgpt4.0的回答 模型的自我评价自我评价 ChatGPT的优势在这里插入图片描述 文…

JS-var 、let 、 const使用介绍

变量声明介绍 在我们日常开发用&#xff0c;变量声明有三个 var、 let 和 const&#xff0c;我们应该用那个呢&#xff1f; 首先var 先排除&#xff0c;老派写法&#xff0c;问题很多&#xff0c;可以淘汰掉…let or const ?建议&#xff1a; const 优先&#xff0c;尽量使…

CSS 水浪按钮

<template><view class="content"><button class="button"><view class="liquid"></view><view class="btn-txt">水浪按钮</view></button></view></template><scrip…

QT上位机开发(MFC vs QT)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在qt之前&#xff0c;上位机开发的主要方法就是mfc。后来出现了c#语言之后&#xff0c;上位机的开发就有一部分人转成了c#。这些开发都是在windows…

Vue + JS + tauri 开发一个简单的PC端桌面应用程序

Vue JS tauri 开发一个简单的PC端桌面应用程序 文章目录 Vue JS tauri 开发一个简单的PC端桌面应用程序1. 环境准备1.1 安装 Microsoft Visual Studio C 生成工具[^2]1.2 安装 Rust[^3] 2. 使用 vite 打包工具创建一个 vue 应用2.1 使用Vite创建前端Vue项目2.2 更改Vite打包…

Android Traceview 定位卡顿问题

Traceview 是一个 Android 性能分析工具&#xff0c;用于时间性能分析&#xff0c;主要帮助开发者了解应用程序中各个方法的执行时间和调用关系。通过图形化界面查看应用程序的代码执行细节&#xff0c;包括每个方法的调用次数、方法调用的时间消耗、方法调用堆栈等信息。我们可…

基于Python实现身份证信息识别

目录 前言身份证信息识别的背景与意义自动识别身份证的需求实现环境与工具准备Python编程语言OpenCV图像处理库Tesseract OCR引擎身份证信息识别算法原理图像预处理步骤(图像裁剪、灰度化 、二值化、去噪)信息提取与解析Python代码实现通过OCR提取身份证号码代码解析身份证信息…

uniapp 如何使用echarts 以及解决tooltip自定义不生效;dataZoom报错问题

使用的是echarts-for-wx插件&#xff1b; 正常写法案例&#xff1a;给tooltip数值加个% <template><view><uni-ec-canvas class"uni-ec-canvas"id"uni-ec-canvas"ref"canvas"canvas-id"uni-ec-canvas":ec"ec&quo…

某银行主机安全运营体系建设实践

随着商业银行业务的发展&#xff0c;主机规模持续增长&#xff0c;给安全团队运营工作带来极大挑战&#xff0c;传统的运营手段已经无法适应业务规模的快速发展&#xff0c;主要体现在主机资产数量多、类型复杂&#xff0c;安全团队难以对全量资产进行及时有效的梳理、管理&…

微软推出新的 Copilot Pro 计划

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…