一、Rabin密码体制

  Rabin密码体制是RSA密码体制的一种,假定模数$n=pq$不能被分解,该类体制对于选择明文攻击是计算安全的。因此,Rabin密码体制提供了一个可证明安全的密码体制的例子:假定分解整数问题是整数上不可行的,那么Rabin密码体制是安全的。

Thm1 (Rabin密码体制)设$n=pq$,其中$p$和$q$是素数,且$p,q \equiv 3 (mod \, 4)$,设$P=C=Z^{\star}_{n}$,且定义$$\kappa =\{(n,p,q)\}$$对$K=(n,p,q)$,定义$$e_{K}(x)=x^{2} (mod \, n)$$和$$d_{K}=\sqrt{y} (mod \, n)$$ $n$为公钥,$p$和$q$为私钥。

注:条件$p,q \equiv 3 (mod \, 4)$可以省去,条件$P=C=Z^n_{\star}$也可以弱化为$P=C=Z^n$,只是在使用更多的限制性描述的时候,简化了许多方面的计算和密码体制分析。

  注意看到这个函数$y=x^{2}$对于加密来说不是一个单射,所以解密不能以一种明显的方式完成,特别的,对于$y \equiv x^{2} (mod \, n)$,对于某一个$x \in Z^{\star}_{n}$,存在$y$模$n$的是个解,除非有其他的冗余信息,否则无法确认是那一个值。

  从Bob的观点来看解密问题,它有一个密文y,要想得到x使得$$x^2 \equiv y(mod \, n)$$这是一个关于$Z_{n}$中未知元$x$的二次方程,解密需要求出模$n$的平方根,等价于求解以下两个同余方程。$$z^{2} \equiv y (mod \, p)$$ $$z^{2} \equiv y (mod \, q)$$虽然我们可以利用Euler准则来判断$y$是否为一个模$p$或模$q$的二次剩余。事实上,如果加密正确的执行,$y$是一个模$p$和模$q$的二次剩余,遗憾的是它并不能帮助我们找到$y$。

  当$p \equiv 3(mod \, 4)$时,有一个简单公式来计算模$p$的二次剩余的平方根,假定$y$是一个模$p$的二次剩余,且$y \equiv 3 (mod \, 4)$那么有$$\begin{align} (\pm y^{\frac {p+1}{4}})^{2} \equiv & y^{\frac{p+1}{2}} (mod \, p) \\ \equiv & y^{\frac{p-1}{2}}y (mod \, p)  \\ \equiv & y(mod \, p) \\ \end{align}$$这里又一次使用了Euler准则,即当$y$是一个模$p$的二次剩余时,有$y^{\frac{p-1}{2}} \equiv 1 (mod \, p)$,因此,$y$模$p$的两个平方根为$\pm y^{\frac{p+1}{4}} (mod \, p)$,同样的讨论可以知道,$y$模$q$的两个平方根为$\pm y^{\frac{p+1}{4}} (mod \, q)$,再利用中国剩余定理可以得到$y$模$n$的四个平方根。

二、Rabin密码体制的安全性

  它的安全性证明使用了一个图灵归约,定义如下:

Def2 (图灵归约)假定G和H为问题,一个从G到H的图灵归约是一个具有如下性质的算法SolveG:

1. SolveG假定了存在某一算法SolveH求解问题H;

2. SolveG可以调用SolveH并使用它的任一输出值,但SolveG不能对SolveH执行的实际运算做任何限定(也就是说,SolveH被看作一个黑盒子,称为一个谕示器);

3. SolveG是一个多项式时间算法;

4. SolveG正确地求解问题G。

如果存在一个从G到H的图灵归约,记为$G \varpropto _{T} H$。

  一个图灵归约$G \varpropto_{T} H$并不一定得到一个求解问题G的多项式时间算法,它实际上证明的是:如果存在一个多项式时间算法求解问题H,那么存在一个多项式时间算法求解时间G。

  下面将提供图灵归约的一个清晰的例子,可以证明,一个解密谕示器Rabin Decrypt可以并入到一个分解模数$n$的$Las Vegas$算法中且具有至少$\frac{1}{2}$的概率,也就是说,可以得到Factoring $\varpropto_{T}$ Rabin Decryption,其中图灵归约本身是一个随机算法。假定$n$是两个不同素数$p$和$q$的乘积,那么Rabin Decryption是一个执行Rabin解密过程的谕示器,对一个给定的密文返回对应四个可能的明文中的一个。

Alg3 Rabin Oracle Factoring(n)

external Rabin Decrypt

随机选择一个整数$r \in Z^n_{\star}$

$y \leftarrow r^{2} (mod \, n)$

$x \leftarrow Rabin Decrypt(y)$

if $x \equiv \pm r(mod \, n)$

  then return ("failure")

else

  $p \leftarrow gcd(x+r , n)$

  $q \leftarrow n/p$

  return("n = p × q")

  计算过程没有太多问题,Rabin Decrypt(y)将返回四个可能明文中的一个作为$x$的值,有$x \equiv \pm r(mod \, n)$或者$x \equiv \pm \omega r(mod \, n)$,其中$\omega$是1模$n$的一个非平凡平方根,在第二种情形下计算$gcd(x+r,n)$一定能够得到$p$或$q$,这就完成了$n$的分解。

  剩下的一个问题是计算所有可能的随机值$r \in Z^{\star}_{n}$的成功概率,对于一个剩余$r \in Z^{\star}_{n}$,定义$$[r] = \{ \pm r (mod \, n) \ , \ \pm \omega r (mod \, n) \}$$显然在$[r]$中分别有两个剩余能用算法得到相同的$y$值,且由谕示器Rabin Decrypt给出的输出$x$值也在$[r]$中,而算法能够成功当且仅当$x \equiv \pm \omega r (mod \, n)$,这个谕示器并不知道用四个可能的$r$值中的哪一个来构造$y$,且$r$是调用谕示器Rabin Decrypt之前随机选择,因此$x \equiv \pm \omega r (mod \, n)$的概率为$\frac{1}{2}$,即成功概率为$\frac{1}{2}$。

  这就证明了Rabin密码体制对选择明文攻击是可证明安全的,然而该体制对选择密文攻击是完全不安全的,因为假想的谕示器Rabin Decrypt用实际解密算法来代替,就可以攻破了密码体制。

三、RSA的语义安全性

  前面所说的所有攻破密码体制实际上是试图找出秘密密钥(对称密码体制的情形)或者私钥(公钥密码体制的情形)。然而,可能敌手的目标并没有那么大的野心,即不能找到秘密密钥或者私钥,他仍可以获得比我们所希望的更多的信息,如果要确保一个密码体制是“安全”的,我们应该考虑这些敌手所具有的适度的目标。

  完全攻破

  敌手能够找出Bob的秘密密钥(对称密码体制的情形)或者私钥(公钥密码体制的情形),因此,他能解密利用给定密钥加密的任意密文。

  部分攻破

  敌手能以某一不可忽略的概率解密以前没有见过的密文(无需知道密钥),或者,敌手能够对于给定的密文,得出明文的一些特定信息。

  密文识别

  敌手能够以超过$\frac{1}{2}$的概率识别两个给定明文对应的密文,或者识别出给定明文的密文和随机串。

  下面的内容中,我们考虑一些针对RSA类密码体制达到上面某种类型的目的的可能攻击,我们也描述在一定的计算假设成立的情形下如何构造一个公钥密码体制使得敌手不能在多项式时间内识别密文。这样的密码体制称为语义安全的,为了达到这个目的是很困难的,因为是要针对非常弱的目的提供保护。

  首先来讨论与明文比特相关的部分信息。容易想到的是,一些关于明文的信息可以通过密文“泄露”出去,这表示对系统的一种部分攻破。假定我们给定密文$y=x^{b} (mod \, n)$,其中$x$表示明文,由于$gcd(b,\phi (n)) = 1$,必然包含了$b$为奇数的情形,因此Jacobi符号$$\lgroup \frac{y}{n} \rgroup = \lgroup \frac{x}{n} \rgroup ^ {b} = \lgroup \frac{x}{n} \rgroup $$这表明,在给定密文$y$的情况下,任何人无须解密密文就可以有效的计算$\lgroup \frac{x}{n} \rgroup$,它泄漏了关于明文的信息。

  我们考虑由密码体制泄漏的一些其他特定类型的部分信息。

  1. 给定$y=e_{K}(x)$,计算$parity(y)$,其中$parity(y)$表示$x$的二进制表示的最低位数,即当$x$为偶数时$parity(y) = 0$;$x$为奇数时$parity(y)=1$。

  2. 给定$y=e_{K}(x)$,计算$half(y)$,其中当$0 \leq x < \frac{n}{2}$时$half(y) = 0$;当$\frac{n}{2} < x \leq n-1$时$half(y) = 1$

  如果假定RSA加密是安全的,那么它的密码体制就不会泄漏这种类型的信息,更精确的说,RSA解密问题可以图灵归约为计算$half(y)$的问题,这意味着,如果存在一个多项式算法$half(y)$,那么存在RSA解密的多项式时间算法。现在讨论,在给定计算$half(y)$的假设算法(谕示器)的前提下,如何计算$x=d_{K}(y)$,则该算法为:

Alg4 Oracle RSA Decryption(n,b,y)

external HALF

$k \leftarrow \lfloor lbn \rfloor$

for $i \leftarrow 0$ to $k$

  $h_{i} \leftarrow $ HALF $(n,b,y)$

  $y \leftarrow (y × 2^{b}) (mod \, n)$

$l_{o} \leftarrow 0$

$hi \leftarrow n$

for $i \leftarrow 0$ to $k$

  $mid \leftarrow \frac{hi+lo}{2}$

  if $h_{i} = 1$

    then $lo \leftarrow mid$

  else $hi \leftarrow mid$

return $(\lfloor hi \rfloor)$

  根据RSA加密满足在$Z_{n}$中的如下性质$$e_{K}(x_{1})e_{K}(x_{2})=e_{K}(x_{1}x_{2})$$现在,利用如下事实$$y=e_{K}(x)=x^{b}(mod \, n)$$容易看到,对于$0 \leq i \leq \lfloor lbn \rfloor$,第一个for循环运行第$i$次,有$$h_{i}=half(y×(e_{K}(2))^{i})=half(e_{K}(x×2^{i}))$$于是根据half函数的特殊性,我们可以利用二分查找的技术的找到$x$,这是在第二个for循环中找到的。

  因此,如果half是一个多项式时间算法,那么我们可以得到一个RSA解密的多项式时间算法。上述算法的时间复杂度是$o((log(n))^{3})+o(logn)×half的复杂度$。容易看到的是,计算parity(y)是多项式等价于计算half(y),这是由于在RSA加密过程中涉及两个等式$$half(y)=parity((y×e_{K}(2))mod \, n)$$ $$parity(y)=half((y×e_{K}(2^{-1}))mod \, n)$$以及前面的乘法规则。

  最后需要注意的是,我们只是说明了计算parity和half是很困难的,即RSA解密是很困难的,但并没有排除说我们可以以75%的准确率计算parity和half的有效算法,还有其他的一些可能泄露的攻击。

四、最优非对称加密填充

  我们真正想要的是找到一个设计这样的密码体制的方法,这个密码体制允许我们证明(在一些似是而非的计算假设下)不可能在多项式时间内通过检查密文的手段找到任何有关明文的信息,可以证明这等价于证明如下问题:敌手不能区别密文。因此我们需要考虑一个密文识别问题。

Def5 (密码识别问题)

一个加密函数$f:X \rightarrow X$;两个明文$x_{1},x_{2} \in X$和一个密文$y=f(x_{i})$,其中$i \in {1,2}$,问是否$i=1?$

  如果加密函数$f$是确定性的,由于此时能够计算$f(x_{1})$和$f(x_{2})$,只要看哪一个能得到密文$y$即可。要使得密文识别在计算上是不可行,就要求加密过程是随机的,我们想具体的办法来达到这个目标。为此提出下面的密码体制。

Thm6 (语义安全的公钥密码体制)

  设$m,k$为正整数:设$F$为一组陷门单向置换,且对任意的$f \in F$,有$f:\{ 0,1 \}^{k} \rightarrow \{ 0,1 \}^{k}$,且设$G:\{ 0,1 \}^{k} \rightarrow \{ 0,1 \} ^{m}$为一个随机谕示器。令$P=\{ 0,1 \} ^{m}$,且$C=\{ 0,1 \}^{k} × \{ 0,1 \}^{m}$。定义$$K= \{ (f,f^{-1},G): f \in F \}$$对$k= \{ (f,f^{-1},G)$,随机选取$r \in \{ 0,1 \} ^{k}$,且定义$$e_{K}(x)=(y_{1},y_{2})=(f(r),G(r) \oplus x)$$其中$y_{1} \in \{ 0,1 \} ^{k},x,y_{2} \in \{ 0,1 \} ^{m}$。进一步,定义$$d_{K}(y_{1},y_{2}) = G(f^{-1}(y_{1}) \oplus y_{2})$$($y_{1} \in \{ 0,1 \} ^{k},y_{2} \in \{ 0,1 \} ^{m}$)。函数$f$和$G$为公钥;函数$f^{-1}$为私钥。

注:所谓陷门单向置换的意思就是说集合$X$到自身的(双射)陷门单向函数。

  在RSA密码体制的情况下,取$n=pq,X=Z_{n},f(x) = x^{b} mod \, n$,且$f^{-1}(x) = x^{a} mod \, n$其中$ab \equiv 1 mod \, \phi (n)$,该密码体制引入了一个特定的随机函数$G$,实际上,$G$是通过一个随机谕示器模型化。

  我们观察到密码体制是非常有效的,相对于底层的基于$f$的公钥密码体制而言,只需要添加很少的运算。实际中,函数$G$可以由安全Hash函数如SHA-1用很有效的方式给出,密码体制的主要缺点是数据扩展:$m$比特的明文加密成$k+m$比特的密文,如果$f$基于RSA加密函数,那么为了使体制安全,需要取$k \geq 1024$。

  容易知道,在语义安全的公钥密码体制中必须有一定的数据扩展,因此需要做到加密是随机的。然而,存在更为有效的方案,仍可以证明是安全的,其中最重要的一种是最优非对称加密填充。

  关于这个密码体制,随机谕示模型中语义安全的一个直觉的论据如下:为了确定关于明文$x$的任一信息,我们需要知道关于$G(r)$的信息,假定$G$是一个随机谕示器,确定关于$G(r)$值的任一信息的唯一方式是首先计算$r=f^{-1}(y_{1})$,因此我们必须得到关于$r$的全部信息,如果$f$是单向的,那么对于不知道陷门$f^{-1}$的敌手而言,不能在合理的时间算出$r$。

  现在考虑一种比图灵归约更一般的归约。假定存在一个算法Distinguish可以对两个明文$x_{1},x_{2}$求解密文识别问题,那么我们可以修改这个算法得到$f$的逆算法。算法Distinguish必然是一个完善的算法,我们仅需要它以$\frac{1}{2}+ \epsilon$的概率给出正确的答案即可。这样子,Distinguish允许询问一个随机谕示器,它就可以计算明文的加密,也就是说可以假定它是一个选择明文攻击。

  下面详细来论证上面的密码体制在随机谕示模型中是语义安全的,这个模型的主要特性和归约如下:

  (1) 假定$G$是一个随机谕示器,所以确定关于值$G(r)$的任何信息的唯一输入方式就是用输入$r$调用函数$G$。

  (2) 通过修改算法Distinguish来构造一个新算法Invert,可以以不为0的概率对随机选择的元素$y$来逆(即给定一个值$y=f(x)$,其中$x$随机选择,那么算法Invert能够以某一特定的概率找出$x$)。

  (3) 算法Invert将用我们描述的一个特定函数SIMG替换随机谕示器,它的所有输出为随机数,SIMG是随机谕示器的一个完善的模拟。

Alg7 Invery(y)

external f

global RList,GList,$l$

procedure SIMG(r)

$i \leftarrow 1$

$found \leftarrow $ false

while $i \leq l$ and not found

  if RList[i] = r

    then fount $\leftarrow$ true

  else $i \leftarrow i+1$

if found

  then return(GList[i])

if $f(r)=y$

  then 随机选择 $j \in \{ 1,2 \}$

    $g \leftarrow y_{2} \oplus x_{j}$

else

  随机选择g

$l \leftarrow l+1$

RList[l] $\leftarrow$ r

GList[l] $\leftarrow$ g

return g

main

  $y_{1} \leftarrow y$

  随机选择$y_{2}$

  $l \leftarrow 0$

  在Distinguish($x_{1}$,$x_{2}$,($y_{1}$,$y_{2}$))中插入代码

  for $i \leftarrow 1$ to $l$

    if $f(RList[i]) = y$

      then return(RList[i])

  return("failure")

  给定两个明文$x_{1}$和$x_{2}$,算法Distinguish以$\frac{1}{2}+ \epsilon$的概率求解密文识别问题。算法Invert的输入$y$是需要求逆的;目的是输出$f^{-1}(y)$,算法Invert开始时构造$(y_{1},y_{2})$,其中$y_{1},y_{2}$随机选取,算法Invert对密文$(y_{1},y_{2})$运行算法Distinguish,试图确定它是$x_{1}$或者$x_{2}$的密文,算法Distinguish将会在执行过程中不同的地方询问SIMG,SIMG的操作概括如下:

  (1) SIMG包含一个列表,记为RList,记录了算法在Distinguish执行过程中询问的所有输入$r$;相应的列表,记为GList,记录了SIMG的所有输出。

  (2) 如果一个输入$r$满足$f(r)=y$,那么SIMG定义为使得$(y_{1},y_{2})$是$x_{1}$和$x_{2}$其中一个的有效加密。

  (3) 如果前面已经用输入$r$询问过谕示器,那么SIMG(r)已定义。

  (4) 其他情况下,SIMG(r)的值随机选取。

  可以看到,对于任一明文$x_{0} \in X$,$(y_{1},y_{2})$是$x_{0}$的一个有效加密,当且仅当$SIMG(f^{-1}(y_{1})) = y_{2} \oplus x_{0}$。特别地,假定$SIMG(f^{-1}(y_{1}))$被适当定义,$(y_{1},y_{2})$可能是$x_{1}$或者$x_{2}$的有效加密,算法SIMG的描述保证了$(y_{1},y_{2})$是$x_{1}$或者$x_{2}$的有效加密。

  最后,算法Distinguish将会以回答1或者2终止,回答可能正确也可能不正确,到此,算法Invert检查列表RList看是否对其询问的$r$有$y=f(r)$,如果有,那么它就是$f^{-1}(y)$,算法Invert成功,如果没有发现就是失败。

  事实上,通过观察函数SIMG对每个询问$r$检测是否有$y=f(r)$可以使得算法Invert更有效,一旦发现这样的$r$可以立即结束,返回$r$值,没有必要继续运行。

  现在需要计算算法Invert的成功概率的一个下界,通过检查算法Distinguish的成功概率来做到这一点,假定Distinguish与一个随机谕示器相互作用的成功概率至少为$\frac{1}{2}+\epsilon$,在算法Invert中,算法Distinguish与模拟随机谕示器SIMG相互作用。显然,SIMG对任何输入与一个真正随机谕示器的输出是完全不可区分的,除了可能对于输入$r=f^{-1}(y)$例外。因此,只要$f(r)=y$且$(y_{1},y_{2})$是$x_{1}$或者$x_{2}$的有效加密,那么必然有$SIMG(r)=y_{2} \oplus x_{1}$或者$SIMG(r)=y_{2} \oplus x_{2}$。SIMG从这两个选择中随机选取,它对于输入$r=f^{-1}(y)$的输出也是与真正的随机谕示器不可区分的,于是算法Distinguish与模拟随机谕示器SIMG相互作用时,其成功概率为至少$\frac{1}{2}+\epsilon$。

  接下来,还需要计算算法Distinguish的成功概率,以是否$f^{-1}(y) \in RList$来考虑$$P[Distinguish succeeds] = P[Distinguish succeeds | f^{-1}(y) \in RList]P[f^{-1}(y) \in RList]+ P[Distinguish succeeds | f^{-1}(y) \notin RList]P[f^{-1}(y) \notin RList]$$

  显然有$$P[Distinguish succeeds | f^{-1}(y) \notin RList] = \frac{1}{2}$$因为如果不知道$SIMG(f^{-1}(y))$的值,就无法区别由$x_{1}$还是由$x_{2}$加密的密文,利用如下事实:$$P[Distinguish succeeds | f^{-1}(y) \in RList] \leq 1$$容易得到如下关系$$\begin{align} \frac{1}{2}+ \epsilon \leq & P[Distinguish succeeds]\\ \leq & P[f^{-1}(y) \in RList]+\frac{1}{2}P[f^{-1}(y) \notin RList]\\ \leq & P[f^{-1}(y) \in RList]+\frac{1}{2} \\ \end{align}$$

  因此可以得到$$P[f^{-1}(y) \in RList] \geq \epsilon$$由于$$P[Invert succeeds] = P[f^{-1}(y) \in RList]$$就可以推出$$P[Invert succeeds] \geq \epsilon$$

  综合以上所述,可以直接考虑算法Invert相对于算法Distinguish的运行时间,假定$t_{1}$是算法Distinguish的运行时间,$t_{2}$是对函数$f$求值需要的时间,用$q$记算法Distinguish所做的询问谕示器的次数,算法Invert的运行时间为$t_{1}+o(q^2+qt_{2})$

  最后,给出一个完整的最优非对称加密填充密码体制。

Thm8 Optimal Asymmetric Encryption Padding

  设$m,k$为正整数,且$m < k$。令$k_{0}=k-m$。设$F$为一族陷门单向置换,使得对于所有的$f \in F$,有$f:\{ 0,1 \} ^{k} \rightarrow \{ 0,1 \} ^{k}$。设$G:\{ 0,1 \} ^{k_{0}} \rightarrow \{ 0,1 \} ^{m}$,且设$H:\{ 0,1 \} ^{m} \rightarrow \{ 0,1 \} ^{k_{0}}$为随机函数。定义$$P=\{ 0,1 \} ^{m},C= \{ 0,1 \}^{k},K=\{ (f,f^{-1},G,H):f \in F \}$$

  对于当中的某个$K=\{ (f,f^{-1},G,H):f \in F \}$,设$r \in \{ 0,1 \} ^{k_{0}}$随机选择,定义$$e_{K}(x) = f(y_{1} || y_{2})$$其中$$y_{1} = x \oplus G(r)$$且$$y_{2} = r \oplus H(x \oplus G(r))$$其中有$x,y_{1} \in \{ 0,1 \} ^{m},y_{2} \in \{ 0,1 \} ^{k_{0}}$,其中“||”表示向量的串联,进一步定义$$f^{-1}(y)=x_{1} || x_{2}$$其中$x_{1} \in \{ 0,1 \} ^{m}$且$x_{2} \in \{ 0,1 \} ^{k_{0}}$,最后定义$$r=x_{2} \oplus H(x_{1})$$且$$d_{K}(y) = G(r) \oplus x_{1}$$函数$f,G,H$为公钥,函数$f^{-1}$为私钥。

  在这个密码体制中,只需要取$k_{0}$足够大即可,这样子有$2^{k_{0}}$是一个不可行的大运行时间,而且密文长度比明文长度多出了$k_{0}$比特,有了一定的数据扩展位。关键在于,观察到任一明文有$2^{k_{0}}$种可能的有效加密,解决密文识别问题的一种方式就是直接计算两个给定明文中的一个的所有可能密文,但是这个密文有$2^{k_{0}}$的可能性,使得计算也成为不可能。

  至此,第五章RSA密码体制已经介绍完毕,其实还没补完这些博客的时候我已经在阅读第六章了,寒假剩下一半的时间了,老师要求的7-14章我还一点没动,至少还有接近100多页,希望能按时读完和做完读书笔记。

密码学笔记(5)——Rabin密码体制和语义安全性的更多相关文章

  1. 密码学笔记(4)——RSA的其他攻击

    上一篇详细分析了几种分解因子的算法,这是攻击RSA密码最为明显的算法,这一篇中我们考虑是否有不用分解模数n就可以解密RSA的密文的方法,这是因为前面也提到,当n比较大的时候进行分解成素数的乘积是非常困 ...

  2. 密码学笔记(2)——RSA密码

    上一篇笔记中讲述了大量的代数知识,这一篇中我们看看如何将这些代数知识应用到RSA密码体制中. 一.公钥密码学简介 在经典密码学的研究模型中,我们根据已选择的秘钥K得到一条加密规则$e_{k}$和一条解 ...

  3. 密码学笔记——eval(function(p,a,c,k,e,d) 加密破解

    密码学笔记——eval(function(p,a,c,k,e,d) 的加密破解 例题: 小明某天在看js的时候,突然看到了这么一段代码,发现怎么也理不出代码逻辑,你能帮帮他吗? 格式:SimCTF{} ...

  4. 【密码学】RSA公钥密码体制

    RSA公钥密码体制是美国麻省理工学院(MIT)的三位科学家Rivest.Shamir.Adleman于1978年提出的,简称RSA公钥秘密系统.实际上,RSA稍后于MH背包公钥密码实用系统,但它的影响 ...

  5. 笔记二:常用的h5语义化标签

    0.前言: 所谓语义化标签就是一种 我们仅通过标签名就能判断出该标签内容的语义的标签,见名知意. 总结这部分内容,主要是为了能从繁琐的div嵌套div中,改成带有h5标签码.这样更有利于读写代码. 人 ...

  6. HTML5学习笔记(三):语义化和新增结构元素

    在HTML5之前,使用机器来阅读一个网页是非常困难的,我们使用不同样式的div来标记不同的内容,所以实际上机器无法得知页面的哪个部分是正文,哪个部分是标题,那么在HTML5里,针对这个问题就引入了语义 ...

  7. 密码学笔记——zip明文攻击

    明文攻击(Known plaintext attack):是一种攻击模式,指攻击者已知明文.密文及算法,求密钥的过程. 例题: 这就是一个坑 密码是十位大小写字母.数字.特殊符号组成的,你爆破的开么? ...

  8. 密码学笔记——playfair密码

     Playfair密码(Playfair cipher 或 Playfair square)一种替换密码,1854年由查尔斯·惠斯通(Charles Wheatstone)的英国人发明. 例题: 某种 ...

  9. 密码学笔记——Rot13

    Rot13:将每个在字母表上的字母,用后数13个后的字母代替,若超过时则重新绕回26字母开头即可. eg:A换成N.B换成O.依此类推到M换成Z,然后序列反转:N换成A.O换成B.最后Z换成M 1.密 ...

随机推荐

  1. startup_stm32f10x_xx.s 启动代码文件选择

    引用http://blog.csdn.net/gasbi/article/details/7545568 整体感觉stm32给的库文件太琐碎了,正如它的芯片型号一样繁多,例如启动文件: 网上查到的各个 ...

  2. 论文阅读笔记---ShuffleNet V1

    01 ShuffleNet V1要解决什么问题 为算力有限的嵌入式场景下专门设计一个高效的神经网络架构. 02 亮点 使用了两个新的操作:pointwise group convolution和cha ...

  3. Spark运行基本流程

  4. struts使用

    下载文件 <action name="download" class="thirdIssueAction" method="getDownloa ...

  5. Algo: Basic

    1. 二维数组的查找 2. 替换空格 3. 从尾到头打印链表 4. 重建二叉树 5. 用两个栈实现队列 6. 旋转数组的最小数字 7. 斐波那契数列 8. 跳台阶 9. 变态跳台阶 10. 矩阵覆盖 ...

  6. virtualbox manager命令小记

    virtualbox 控制虚拟机 VBoxManage list runningvms 列出运行的虚拟机 (返回名称和UUID): VBoxManage list runningvms Stop ru ...

  7. leetcode-241-为运算表达式设置优先级*

    题目描述: 方法:分治* class Solution: def diffWaysToCompute(self, input: str) -> List[int]: if input.isdig ...

  8. Linux tee命令使用详解分享

    tee命令主要被用来向standout(标准输出流,通常是命令执行窗口)输出的同时也将内容输出到文件,下面是tee的man 信息 read from standard input and write ...

  9. colormap 参数及对应色卡

    [参考] [1]matlab帮助文档

  10. thinkphp 异常处理

    和PHP默认的异常处理不同,ThinkPHP抛出的不是单纯的错误信息,而是一个人性化的错误页面,如下图所示: 只有在调试模式下面才能显示具体的错误信息,如果在部署模式下面,你可能看到的是一个简单的提示 ...