Chapter 6 伪随机函数(Pseudorandom Function)&分组密码(Block Cipher)

文章目录

  • Chapter 6 伪随机函数(Pseudorandom Function)&分组密码(Block Cipher)
    • 一、伪随机函数(PRF)
    • 二、PRF和PRG的相互构造
      • 1、PRF ⇒\Rightarrow⇒ PRG
      • 2、PRG ⇒\Rightarrow⇒ PRF
    • 三、伪随机置换(PRP)/分组密码(Block Cipher)
    • 四、PRF和PRP的相互构造
      • 1、PRP⇒\Rightarrow⇒PRF:PRP转换引理
      • 2、PRF⇒\Rightarrow⇒PRP:Feistel密码结构(Feistel construction)
    • 五、PRG、PRF、PRP小结

一、伪随机函数(PRF)

伪随机函数(pseudorandom function ,PRF)也是密码学中的一个重要工具,它是一个确定性的函数F:{0,1}λ×{0,1}in→{0,1}outF:\{0,1\}^\lambda\times\{0,1\}^{in}\rightarrow\{0,1\}^{out}F:{0,1}λ×{0,1}in→{0,1}out,其中输入为密钥空间×\times×输入空间。一个PRF是安全的,是希望对于每一个输入,其输出结果像是在{0,1}out\{0,1\}^{out}{0,1}out中随机选取(均匀采样)的。下面给出安全PRF的形式化定义。

定义6.1 对于一个确定性函数F:{0,1}λ×{0,1}in→{0,1}outF:\{0,1\}^\lambda\times\{0,1\}^{in}\rightarrow\{0,1\}^{out}F:{0,1}λ×{0,1}in→{0,1}out,FFF是一个安全的PRF当且仅当如下图定义的两个库不可区分(即Lprf−realF≈~Lprf−randFL_{prf-real}^F\widetilde\approx L_{prf-rand}^FLprf−realF​≈Lprf−randF​):

其中右边的随机库中的TTT可以理解为一个函数表格,而对于每一个输入xxx,都是在{0,1}out\{0,1\}^{out}{0,1}out中均匀采样。只不过上图的TTT没有一开始就直接把所有xxx对应的yyy都确定了,而是按需确定——这样的做法在实际中可以减少不必要的开销(毕竟所有的输入规模高达2in2^{in}2in,如果in≥λin\ge\lambdain≥λ这将是指数级别),而且整个过程与提前确定的效果没有区别(都是均匀采样)。

值得注意的是,伪随机函数中**“随机函数”是指该函数是在一组函数中被随机选择出来的**。在随机库中的TTT可以视为一个{0,1}in→{0,1}out\{0,1\}^{in}\rightarrow\{0,1\}^{out}{0,1}in→{0,1}out的函数,那么随机库中正是在所有这样的函数中随机选择了一个。而PRF则是通过密钥kkk随机选取了一个函数,它的效果需要和随机库的不可区分。这里并不能理解为函数TTT是一个带有随机性的函数,这也可以根据库的定义得知(FFF也是确定的函数,因为kkk是内置选定的)——也就是调用两次随机库/PRF,相同的输入xxx所得的输出是相同的。

二、PRF和PRG的相互构造

上一章已经介绍过密码学的一个重要工具PRG(伪随机数生成器)。实际应用中,通常使用PRF构造PRG;也可以用PRG构造PRF,但一般是在理论上,实际上并不这样构造。下面将分别介绍上述两种情况的一种构造。

1、PRF ⇒\Rightarrow⇒ PRG

假设有一个安全的PRG F:{0,1}λ×{0,1}λ→{0,1}λF:\{0,1\}^\lambda\times\{0,1\}^\lambda\rightarrow\{0,1\}^\lambdaF:{0,1}λ×{0,1}λ→{0,1}λ(即in=out=λin=out=\lambdain=out=λ),那么可以用如下方法构造一个length-doubling PRG:

上述构造也称为Counter PRG,因为它可以通过扩展FFF的输入(比如增加0…10,0…11)来构成更长的输出,就像计数器(counter)一样。而这个PRG的安全性是由均匀采样所得的密钥sss来保证的。下面将对其安全性进行证明。

定理6.1 如果FFF是一个安全的PRF,那么如上图所构造的Counter PRG G(s)G(s)G(s)是一个安全的PRG。

证明:根据PRG的安全性定义(定义5.1),我们需要证明如下两个库是不可区分的:

而我们已知的是FFF具备如定义6.1所示的安全性(下图只是方便阅读,和之前的图一样):

我们依然使用Hybrid方法去证明。但是值得注意的是,Lprf−realFL_{prf-real}^FLprf−realF​的密钥kkk在每次调用时不变的,而Lprg−realGL_{prg-real}^GLprg−realG​中的sss每次调用并不相同,因此无法直接将Lprg−realGL_{prg-real}^GLprg−realG​等价于Lprf−realFL_{prf-real}^FLprf−realF​。也就是说,Lprf−realFL_{prf-real}^FLprf−realF​的使用只能对应一次sss加密的情况。但是这也带给我们启示:sss的取值其实是和第几次调用QUERY有关,因为在一次调用内,sss取值是相同的。为此,这里的Hybrid证明的中间库将不向以前一样 个数是明确的,而是取决于调用QUERY的次数(变量)qqq——这样的证明称为Variable-Hybrid Proof

在个人理解里,Variable-Hybrid证明中用到的思路有些数学归纳法的影子。它希望证明的是如下式子(Lhyb−iL_{hyb-i}Lhyb−i​是中间库):

因此它的思路是:构造一个带变量的库Lhyb−iL_{hyb-i}Lhyb−i​,首先证明Lprg−realG≡Lhyb−0L_{prg-real}^G\equiv L_{hyb-0}Lprg−realG​≡Lhyb−0​、Lprg−randG≡Lhyb−qL_{prg-rand}^G\equiv L_{hyb-q}Lprg−randG​≡Lhyb−q​;然后证明Lhyb−(i−1)≈~Lhyb−iL_{hyb-(i-1)}\widetilde\approx L_{hyb-i}Lhyb−(i−1)​≈Lhyb−i​,利用不可区分的传递性得到结果。那么在本次Lhyb−iL_{hyb-i}Lhyb−i​的构造中,也应该充分利用证明思路中的特点:iii是从0开始依次递增证明的,相当于对于调用次数qqq而言也是从小到大逐步证明调用qqq次是安全的,所以在q+1q+1q+1次的时候可以利用前qqq次调用是安全的结论——这也是个人感觉有点像归纳法的原因。在本次证明中,构造的Lhyb−iL_{hyb-i}Lhyb−i​如下图所示:

首先对于i=0i=0i=0,可以得知必然走else分支,因此Lprg−realG≡Lhyb−0L_{prg-real}^G\equiv L_{hyb-0}Lprg−realG​≡Lhyb−0​。对于i=qi=qi=q,将执行if分支,因此Lprg−randG≡Lhyb−qL_{prg-rand}^G\equiv L_{hyb-q}Lprg−randG​≡Lhyb−q​。接下来只需证明Lhyb−(i−1)≈~Lhyb−iL_{hyb-(i-1)}\widetilde\approx L_{hyb-i}Lhyb−(i−1)​≈Lhyb−i​。观察上图可知,Lhyb−(i−1)L_{hyb-(i-1)}Lhyb−(i−1)​和Lhyb−iL_{hyb-i}Lhyb−i​的区别就是count=icount=icount=i的这一次执行,如果可以证明这一次与在{0,1}2λ\{0,1\}^{2\lambda}{0,1}2λ上均匀采样不可区分,就完成证明。而针对一次sss的取值,就可以使用PRF的安全性了。具体证明过程如下:

上述步骤1中将count=icount=icount=i这次的执行转换为PRF,然后步骤2中使用了PRF的安全性。由于对Lprf−randFL_{prf-rand}^FLprf−randF​的两次调用,xxx都是不同的(分别是0…00和0…01),因此都执行if分支,因此在步骤3可以简化为直接均匀采样。步骤4、5则是内联。至此,完成了Counter PRG的安全性证明。

2、PRG ⇒\Rightarrow⇒ PRF

这里介绍的构造方法是一种理论上的构造方法(效率不高,因此实际中未采用,但有理论价值)。假设有一个length-doubling PRG G:{0,1}λ→{0,1}2λG:\{0,1\}^\lambda\rightarrow\{0,1\}^{2\lambda}G:{0,1}λ→{0,1}2λ,可以根据如下的树型(完全二叉树)构造得到一个PRF F:{0,1}λ×{0,1}in→{0,1}λF:\{0,1\}^\lambda\times \{0,1\}^{in}\rightarrow\{0,1\}^\lambdaF:{0,1}λ×{0,1}in→{0,1}λ。

这个PRF是这样工作的:首先将密钥kkk作为根节点PRG的输入得到G(k)G(k)G(k),然后根据输入xxx的第一位是0(1)而保留前(后)λ\lambdaλ位GLG_{L}GL​(GRG_RGR​),作为下一个节点PRG的输入。后面的以此类推(上图中蓝色的部分标注了部分节点的输入,也就是每个节点的值)。由此可知,树高就是in+1in+1in+1(根节点为第一层),而对于不同的输入xxx相当于从根节点出发走了一条路径抵达叶节点(比如标黄的输入就是100…),而叶节点的值就是最终输出。

上述构造(称为GCM PRF)可以进行如下形式化定义:

下面将证明该PRG的安全性。

定理6.2 对于如上图定义的GCM PRF,如果GGG是一个安全的length-doubling PRG,那么FFF是一个安全的PRF。

证明:根据PRF的安全性定义(定义6.1,下图只是方便查看),我们需要证明如下两个库不可区分,其中FFF如上图定义。

我们依然使用Variable-Hybrid证明方法,而这次的变量是输入的长度ininin。证明的思路与上一小节类似,即证明:

类似的思路(对in递归的想法)构造如下中间库:

首先对于d=0d=0d=0时,p=ϵp=\epsilonp=ϵ,首次调用时将执行if分支,因此相当于随机选取了kkk(之后便固定了),后面循环与FFF的定义一致,故有Lprf−realF≡Lhyb−0L_{prf-real}^F\equiv L_{hyb-0}Lprf−realF​≡Lhyb−0​。对于d=ind=ind=in,p=xp=xp=x,而不执行for循环,而for循环之前的代码与Lprf−randFL_{prf-rand}^FLprf−randF​的一致,故有Lprf−randF≡Lhyb−inL_{prf-rand}^F\equiv L_{hyb-in}Lprf−randF​≡Lhyb−in​。

接下来只需证明Lhyb−(d−1)≈~Lhyb−dL_{hyb-(d-1)}\widetilde\approx L_{hyb-d}Lhyb−(d−1)​≈Lhyb−d​。类似地可以发现两者之差就是在于Lhyb−(d−1)L_{hyb-(d-1)}Lhyb−(d−1)​在in>d−1in>d-1in>d−1时会多执行一次循环。因此如果想要让其形式转化为Lhyb−dL_{hyb-d}Lhyb−d​,可以将这一次的循环拆解出来,并利用PRG的安全性证明它与均匀采样不可区分。完整的证明过程如下:

步骤1左侧是Lhyb−(d−1)L_{hyb-(d-1)}Lhyb−(d−1)​将i=di=di=d这一次循环拆解出来后的形式。虽然在原来的循环中只会计算一个子节点的值(只执行其中一个if),但是多计算(因为GGG是个确定性函数,所以整个树是确定的,只是不一定每个节点都计算出来了)并不影响。由于然后步骤1将undefined分支的内容写成调用PRG。步骤2则使用PRG的安全性定义。步骤3中,由于两者拼接起来是个均匀采样,因此每一部分也是均匀采样的。步骤4左侧与右侧相比,就是多计算了一个子节点,同理因为树是确定的,这不影响。至此,证毕。

这里书上的图在1-3步骤等号右侧的库中p′p'p′全部是firstfirstfirst d+1d+1d+1 bits,不知是否是有误。因为根据描述应该这一行没有做变换。

三、伪随机置换(PRP)/分组密码(Block Cipher)

现在我们考虑PRF的一种特殊的情况。假设这个PRF的输入和输出长度相同(in=outin=outin=out),而且对于每一个密钥kkk都是可逆的(invertible)。可逆是希望在知道密钥的条件下可以解密。具有这样特殊性质的PRF被称为伪随机置换(pseudorandom permutation ,PRP)或分组密码(block cipher,也称为块密码)。之所以称之为**“置换”,是因为满足可逆意味着这个函数是单射,而输入空间和输出空间相同则意味着满射,因此是双射函数**——这既是PRP的性质所要求的,也是置换的(集合论)数学定义。而**“随机置换”的含义和PRF中“随机函数”的含义是类似的,也就是在所有从输入空间到输出空间的置换中随机选择一个**。下面给出安全PRP的形式化定义。

定义6.2 对于一个确定性函数F:{0,1}λ×{0,1}blen→{0,1}blenF:\{0,1\}^\lambda\times\{0,1\}^{blen}\rightarrow\{0,1\}^{blen}F:{0,1}λ×{0,1}blen→{0,1}blen(blenblenblen称为分组长度,{0,1}blen\{0,1\}^{blen}{0,1}blen中任意一个元素称为一个分组),满足对于任意给定的密钥k∈{0,1}λk\in \{0,1\}^\lambdak∈{0,1}λ,存在逆函数F−1:{0,1}λ×{0,1}blen→{0,1}blenF^{-1}:\{0,1\}^\lambda\times\{0,1\}^{blen}\rightarrow\{0,1\}^{blen}F−1:{0,1}λ×{0,1}blen→{0,1}blen,对任意输入x∈{0,1}blenx\in\{0,1\}^{blen}x∈{0,1}blen都有F−1(k,F(k,x))=xF^{-1}(k,F(k,x))=xF−1(k,F(k,x))=x。FFF是一个安全的PRP当且仅当如下图定义的两个库不可区分(即Lprp−realF≈~Lprp−randFL_{prp-real}^F\widetilde\approx L_{prp-rand}^FLprp−realF​≈Lprp−randF​):

上图中标黄的部分是与PRF安全定义中不同的部分(real是一样的),这是因为PRP要求单射,所以需要不重复的均匀采样。

从上面的安全性定义可以知道,PRP的安全性只是要求FFF是安全的,并没有对其逆函数做任何要求。如果其逆函数F−1F^{-1}F−1也要求是安全的,这就引入强伪随机置换的概念:

定义6.3 对于一个确定性函数F:{0,1}λ×{0,1}blen→{0,1}blenF:\{0,1\}^\lambda\times\{0,1\}^{blen}\rightarrow\{0,1\}^{blen}F:{0,1}λ×{0,1}blen→{0,1}blen。FFF是一个安全的强伪随机置换(strong pseudorandom permutation,SPRP)当且仅当如下图定义的两个库不可区分(即Lsprp−realF≈~Lsprp−randFL_{sprp-real}^F\widetilde\approx L_{sprp-rand}^FLsprp−realF​≈Lsprp−randF​):

四、PRF和PRP的相互构造

从上一节可以看到PRF和PRP有所联系,因此本节将讨论它们的关系。

1、PRP⇒\Rightarrow⇒PRF:PRP转换引理

对比定义6.1和定义6.2(除去安全性的部分),可以发现定义上PRP就是PRF。但是一个安全的PRP未必是一个安全的PRF。而书上提到一种想法:如果PRP的输入空间特别大(比如blen=λblen=\lambdablen=λ),那么多项式级别的查询只是很少一部分,那么将不可区分。个人是这样理解如何提出这样一种想法的:可以看到在两者安全性定义不同的部分正是均匀采样和不重复选择这两个库的差别,而定理4.4已经给出了这两个库的advantage(可以理解为区分概率,实际上是两者调用结果相同的概率之差)紧确界为Θ(q22λ)\Theta(\frac{q^2}{2^\lambda})Θ(2λq2​),其中的2λ2^\lambda2λ是输入规模,qqq是采样次数(因为当时是用生日概率证明的)。因此要想两者不可区分,输入规模必须是超多项式的(比如blen=λblen=\lambdablen=λ),故有如下的转换引理。

定理6.3(PRP转换引理) 对于如定义6.1、定义6.2所定义的Lprf−randL_{prf-rand}Lprf−rand​、Lprp−randL_{prp-rand}Lprp−rand​,当in=out=blen=λin=out=blen=\lambdain=out=blen=λ时,有Lprf−rand≈~Lprp−randL_{prf-rand}\widetilde\approx L_{prp-rand}Lprf−rand​≈Lprp−rand​。

定理6.3是本书给出的PRP转换引理的版本,其含义(或者说推论)就是对于一个blen=λblen=\lambdablen=λ的PRP,如果它是安全的,那么它也是一个安全的PRF。在其他资料上还有其他描述,比如输入是超多项式,或者∣AdvPRP(A)−AdvPRF(A)∣≤q(q−1)2n+1|Adv_{PRP}(A)−Adv_{PRF}(A)|≤\frac{q(q−1)}{2^{n+1}}∣AdvPRP​(A)−AdvPRF​(A)∣≤2n+1q(q−1)​。个人认为其实都是用了定理4.4中两个库的advantage的确界的结论。

证明:其实用到的就是定理4.4中的不可区分库:均匀采样和不重复选(如下图左、右)。值得注意的是,定理4.4成立对输入规模是有条件的,才能使得advantage可忽略。此时advantage紧确界为Θ(q22blen)\Theta(\frac{q^2}{2^{blen}})Θ(2blenq2​),由于blen=λblen=\lambdablen=λ,因此advantage可忽略。

将Lprf−randL_{prf-rand}Lprf−rand​、Lprp−randL_{prp-rand}Lprp−rand​相同的部分定义为L∗L^*L∗:

使用定理4.4,易得Lprf−rand≡L∗⋄Lsamp−L≈~L∗⋄Lsamp−R≡Lprp−randL_{prf-rand}\equiv L^*\diamond L_{samp-L}\widetilde\approx L^*\diamond L_{samp-R}\equiv L_{prp-rand}Lprf−rand​≡L∗⋄Lsamp−L​≈L∗⋄Lsamp−R​≡Lprp−rand​。

这个引理的证明过程(定理4.4成立的条件)也说明了只有在输入规模足够大的时候,一个安全的PRP才是安全的PRF

2、PRF⇒\Rightarrow⇒PRP:Feistel密码结构(Feistel construction)

Feistel提出了一种用PRF构造PRP的方法,其主要思路就是利用不一定可逆的函数F:{0,1}n→{0,1}nF:\{0,1\}^n\rightarrow\{0,1\}^nF:{0,1}n→{0,1}n去构造一个可逆的函数F∗:{0,1}2n→{0,1}2nF^*:\{0,1\}^{2n}\rightarrow\{0,1\}^{2n}F∗:{0,1}2n→{0,1}2n。构造如下图所示,这个结构也称为Feistel轮(Feistel round),其中的FFF也被称为轮函数(round function)。

无论轮函数FFF是什么,函数F∗F^*F∗是可逆的,而且它的逆函数如从下图右侧所示(inverse Feistel)。这个逆函数的构造思路也十分简单,就是在得到y,F(y)⊕xy,F(y)\oplus xy,F(y)⊕x后如何恢复成x,yx,yx,y即可。

正如前文所说,轮函数FFF并没有太多的限制,因此它也可以是一个带有密钥的函数,此时的F∗F^*F∗被称为带有密钥的Feistel轮(keyed Feistel)。

现在回到用PRF构造PRP,上面的结构已经构造了一个可逆函数,那么是否只要FFF是一个安全的PRF,F∗F^*F∗就是一个安全的PRP呢?答案是否定的,因为F∗F^*F∗的输出中包含了一半的输入,这显然不能满足PRP的安全性(定义6.2)——因为对于每一个输入的输出都应该是像是均匀采样,但是如果按照F∗F^*F∗中输入的yyy相同那么输出的前半部分一定相同,这样无法和均匀采样出来的不可区分(advantage为1−12n1-\frac{1}{2^n}1−2n1​)。

为了避免上述的不安全性,Feistel密码(Feistel cipher)是采用如下图所示的构造方式:

它其实就是由多个Feistel轮构成,目的就是将输入明文的部分再次进行加密。由于每一个轮是可逆的,因此整体也是可逆的(逆函数也在上图下方给出)。值得一提的是,每一个轮的密钥kik_iki​可以不同,逆向解密时只要每一个轮对应使用之前加密时的密钥即可。关于Feistel密码的安全性,有以下结论:

定理6.4 如果F:{0,1}λ×{0,1}λ→{0,1}λF:\{0,1\}^\lambda\times\{0,1\}^\lambda\rightarrow\{0,1\}^\lambdaF:{0,1}λ×{0,1}λ→{0,1}λ是一个安全的PRF,那么以FFF为轮函数按照上图所示构造的Feistel密码F3F_3F3​是一个安全的PRP。

定理6.5 如果F:{0,1}λ×{0,1}λ→{0,1}λF:\{0,1\}^\lambda\times\{0,1\}^\lambda\rightarrow\{0,1\}^\lambdaF:{0,1}λ×{0,1}λ→{0,1}λ是一个安全的PRF,那么以FFF为轮函数按照上图所示构造的Feistel密码F4F_4F4​是一个安全的SPRP。

定理6.4说明3个轮的Feistel密码可以构建一个安全的PRF,但是该定理的证明超越本书内容。而2个轮的Feistel密码一定不是安全的PRP。然而F3F_3F3​并非一个安全的SPRP。不过定理6.5说明再增加一个轮(4个轮)就可以构建一个安全的SPRP,该定理的证明书中也未呈现。

2个轮的Feistel密码一定不是安全的PRP的证明 书上以练习题的形式给出,在此给出个人的解答。对于F2F_2F2​而言,它的输出是v2∣∣v3v_2||v_3v2​∣∣v3​,其中v2=F(k1,v0)⊕v1v_2=F(k_1, v_0)\oplus v_1v2​=F(k1​,v0​)⊕v1​。那么可以构建攻击者程序AAA:调用两次库,两次输入分别为v0∣∣v1v_0||v_1v0​∣∣v1​、v0∣∣v1′v_0||v_1'v0​∣∣v1′​(v1≠v1′v_1\neq v_1'v1​=v1′​,也就是两次输入的前半段相同,后半段不同),调用结果分别为v2∣∣v3、v2′∣∣v3′v_2||v_3、v_2'||v_3'v2​∣∣v3​、v2′​∣∣v3′​,程序返回值为v2⊕v1=?v2′⊕v1′v_2\oplus v_1 \overset{?}{=}v_2'\oplus v_1'v2​⊕v1​=?v2′​⊕v1′​。显然如果这个库是F2F_2F2​,那么AAA的返回值永远为真(因为输入只有后半段不一样,异或后消去)。但是如果这个库是PRP安全性定义中的随机库(rand),显然并非永远为真。由于程序执行过程中v2⊕v1v_2\oplus v_1v2​⊕v1​的结果是唯一的,而v1′v_1'v1′​也是确定的,因此使得等式成立的v2′v_2'v2′​也是唯一的。而v2′v_2'v2′​是不重复均匀采样所得,因此恰好成立的概率是12blen2−1\frac{1}{2^{\frac{blen}{2}}-1}22blen​−11​(这里v2′v_2'v2′​必然不与v2v_2v2​相等,因为如果相等且等式成立,则v1=v1′v_1=v_1'v1​=v1′​,矛盾。所以必然是剩余的2blen2−12^\frac{blen}{2}-122blen​−1个元素中的一个)。因此F2F_2F2​与随机库的advantage为1−12blen2−11-\frac{1}{2^{\frac{blen}{2}-1}}1−22blen​−11​,不是可忽略的(λ→∞\lambda \rightarrow \infinλ→∞时不趋向0),因此这两个库可区分,不满足PRP的安全性要求。

五、PRG、PRF、PRP小结

本章提到了PRG、PRF、PRP三个概念,其中PRG和PRF可以相互构造;安全的PRP在输入规模足够大时也是安全的PRF(转换引理),PRF可以用于构造PRP(对应本章的第二、四节的内容)。至于这三个概念(忽略安全性,只看定义),PRF和PRP可以说是最紧密的,PRF是函数,而PRP是输入输出空间相同的双射函数。而PRG和PRF相比,PRF有密钥空间而PRG没有。

而在实际应用当中,通常是使用PRP去构造所需要的PRF、PRG。目前并没有能够被证明的安全PRP(因为这个会解决P和NP问题)。但是目前有公认为安全的PRP:AES(Advanced Encryption Standard)。AES是一个加密标准,它是美国国家标准技术研究所(The National Institute of Standards & Technology,NIST)通过PRP设计比赛选拔所得。在2001年,比赛的胜者Rijndael密码成为了AES标准。目前并未发现攻破AES的方法。因此基于AES构造所得的PRF、PRG也是可以被认为是安全的。

【Joy of Cryptography 读书笔记】Chapter 6 伪随机函数(Pseudorandom Function)分组密码(Block Cipher)相关推荐

  1. 【Joy of Cryptography 读书笔记】Chapter 8 分组密码的工作模式(Modes of Operation)

    Chapter 8 分组密码的工作模式(Modes of Operation) 文章目录 Chapter 8 分组密码的工作模式(Modes of Operation) 一.常见的工作模式 1.EBC ...

  2. 【Joy of Cryptography 读书笔记】Chapter 1 一次性密码本(one-time pad)Kerckhoffs原则

    Chapter 1 一次性密码本(one-time pad)&Kerckhoffs原则 文章目录 Chapter 1 一次性密码本(one-time pad)&Kerckhoffs原则 ...

  3. 【Joy of Cryptography 读书笔记】Chapter 2 可证明安全(Provable Security)基础

    Chapter 2 可证明安全(Provable Security)基础 要想证明安全性,首先需要对安全进行定义,才能证明某一个方法能够保证什么安全性,或者说明它为什么不安全.毕竟密码学并不能解决所有 ...

  4. 【Joy of Cryptography 读书笔记】Chapter 4 基于难解计算(Intractable Computation)的密码学

    Chapter 4 基于难解计算(Intractable Computation)的密码学 John Nash提出一个观点:如果破解一个密码算法的计算耗费时间很长,那么这个密码算法从实用的角度上是安全 ...

  5. 《C++捷径教程》读书笔记--Chapter 16--模板(完结)

    //--<C++捷径教程>读书笔记--Chapter 16--模板(完结) //--Chapter 16--模板 //--04/16/2006 Sun. //--Computer Lab ...

  6. 《C++捷径教程》读书笔记--Chapter 14--继承(完结)

    //--<C++捷径教程>读书笔记--Chapter 14--继承(完结) //--Chapter 14--继承 //--04/14/2006 Friday //--Computer La ...

  7. 《C++捷径教程》读书笔记--Chapter 10--结构与联合

    //--<C++捷径教程>读书笔记--Chapter 10--结构与联合 //--Chapter 10--结构与联合 //--11/24/2005 Thurs. //--Computer ...

  8. [The Path to QUANT] 《Volatility Trading》by Euan Sinclair 读书笔记 Chapter 3

    <Volatility Trading> by Euan Sinclair Chapter 3 收益率和波动率的典型事实 典型事实列表 波动率并非常数 收益率分布 成交量和波动率 波动率分 ...

  9. [The Path to QUANT] 《Volatility Trading》by Euan Sinclair 读书笔记 Chapter 4

    <Volatility Trading> by Euan Sinclair Chapter 4 预测波动率 波动率是否可以被预测? 无摩擦交易市场(交易费用为零) 信息有效(完美信息流) ...

最新文章

  1. 动力电池检测电压c语言编程,动力电池PACK EOL测试系统
  2. 百度云Java三面,面试题及答案!
  3. mysql算法函数_mysql中的函数总结
  4. 英语是缺乏AOP的语言,汉语是具备AOP的语言。
  5. POJ3045 Cow Acrobats —— 思维证明
  6. 采用流水线技术实现8位加法器
  7. CSP认证201512-2 消除类游戏[C++题解]:模拟
  8. leetcode 467. Unique Substrings in Wraparound String | 467. 环绕字符串中唯一的子字符串(动态规划)
  9. UI控件Telerik UI for WinForms发布R1 2019|附下载
  10. 属羊的人2021年冲太岁运势预测
  11. 每日算法系列【LeetCode 881】救生艇
  12. pb数据窗口显示图片_AkShare股票数据A股市净率
  13. 极易上手搭建自己日志采集服务器分析日志(winlogbeat+Elasticsearch+Kibana)
  14. Mysql8.0下载(网盘云盘)
  15. input 输入框下划线
  16. 智能化有何魅力,让奇瑞鲍思语如此坚定
  17. java二维数组遍历与元素查找
  18. android 删除号码恢复,安卓手机删了联系人怎么恢复?这些方法很容易
  19. 【OpenSourceC#】PureMVC
  20. srs提供的rtmp客户端srs-librtmp

热门文章

  1. 罗克韦尔AB PLC RSLogix5000中创建新项目、任务、程序和例程的具体方法和步骤
  2. 详解ASEMI整流桥MB6S在恒流LED驱动电源中的应用
  3. C#利用DirectX显示.x三维动画
  4. 拼多多app是原生还是html,拼多多app下架了是怎么回事?原因及上线时间分析
  5. available: expected single matching bean but found 2
  6. 机器人基础技术教学_乒乓球推挡技术完整攻略[基础教学]
  7. logging level级别
  8. Humanoid动画显示与Generic不一致
  9. 设计中的设计-设计的意义
  10. OFPPT-CTF 2022 部分writeup