《Introduction To Modern Cryptography》读书笔记二

本笔记纯粹个人读书习惯与相应见解,内容归纳完全出于个人需要与个人局限,如有修改意见(比如哪儿应该是值得加粗的重点),欢迎斧正,QQ:2570101165

二、 Perfectly Secret Encryption

上一章讲了古典密码,用很少的计算量就能攻破。

这章讲另一个极端——完美保密(perfectly secret),将从这个概念的定义和其应该满足的条件入手。

这章内容不是现代密码学!!!因为它只有1.4三个原则中的定义和证明,并没有依赖假设。虽然更简单但却因此有了局限性

改颜色方法1

改颜色方法2\color{blue} 改颜色方法2改颜色方法2

改颜色方法3

2.1 Generating randomness

本章使用 包含随机选择算法的概率实验 来定义安全性并分析方案,所以本节先讨论一下适用于密码学应用的随机生成问题

在整本书中,我们将简单地假设各方都能获得无限的、独立的、无偏的随机比特。本节就是讨论实际操作时,这些随机比特怎么生成。

2.1.1 手工生成

例如:投掷一枚均匀的硬币(fair coin

缺点:不方便,规模小

2.1.2 现代方法

  1. 收集一个有大量高熵数据的数据池(高度不可预测,但不一定uniform)
  2. 对这些高熵数据进行处理,以产生一个几乎独立且无偏置的比特序列(必要的,为了uniform)

“uniform”我的理解是均匀、等概、足够随机

2.1.3 现代方法第一步の解释与补充

  1. 需要一个不可预测的数据来源。例如:1)敲击键盘、网络延迟、鼠标移动等外部输入;2)热/散射噪声或放射性衰变等物理现象
  2. 收集的数据可能远非uniform(我理解为可能带有明显的个性),但足够多的话也会有足够的熵
  3. 因特尔把这个实现在处理器上了

2.1.4 现代方法第二步の解释与补充

  1. 分清楚高熵和均匀的区别!!!

  2. 一个真实硬币(正面概率:ppp 反面概率:1−p1-p1−p)抛一千次得到的数据具有高熵,但是并不uniform

  3. 上述问题解决办法(高熵->uniform)

    • “0”:先正后反 概率:p(1−p)p(1-p)p(1−p)
    • “1”:先反后正 概率:(1−p)p(1-p)p(1−p)p

    一个想法:把正正和反反定义为第三态,即三进制。“第三态”出现的概率会大于其它两种,会不会和这个世界的量子层面的规律重合?这样做还能把将近一半废弃的数据重新利用起来

  4. 应该使用为加密而设计的随机数生成器,而不是不适合密码学应用的“通用”随机数生成器。例如:C语言stdlib.h库中的rand()函数不符合密码学安全要求(随机化种子一样,产生的随机数就一样,因此是一种伪随机)

5.6.4将继续涉及如何把高熵数据转化为uniform的比特串

2.1.5 补充:m序列的伪随机性

只能要求截获比周期短的一段时不会泄露更多信息,这样的序列称为伪随机序列

流密码中经常用,这儿仅作为联系与补充

1.基本概念介绍

  1. 游程

    例如00110111,前两个数字00,称为0的2游程;接着是11,是1的2游程;再下来是0的1游程和1的3游程

  2. GF(2)上周期为TTT的序列{ai}\left\{a_i\right\}{ai​}的自相关函数定义
    R(τ)=1T∑k=1T(−1)ak(−1)ak+τ,0≤τ≤T−1R(\tau)=\frac{1}{T}\sum_{k=1}^T(-1)^{a_k}(-1)^{a_{k+\tau}},\quad 0\leq\tau\leq T-1 R(τ)=T1​k=1∑T​(−1)ak​(−1)ak+τ​,0≤τ≤T−1
    定义中的和式表示序列{ai}\left\{a_i\right\}{ai​}与{ai+τ}\left\{a_{i+\tau}\right\}{ai+τ​}(序列{ai}\left\{a_i\right\}{ai​}向后平移τ\tauτ位得到)在一个周期内对应位相同的位数与对应位不同的位数之差。当τ=0\tau=0τ=0时,R(τ)=1R(\tau)=1R(τ)=1;当τ≠0\tau\neq0τ​=0时,称R(τ)R(\tau)R(τ)为异相自相关函数

2. Golomb的3个随机性公设

  1. 在序列的一个周期内,0与1的个数相差最多为1

  2. 在序列的一个周期内,长为1的游程占游程总数的12\frac{1}{2}21​,长为2的游程占游程总数的122\frac{1}{2^2}221​,…,长为iii的游程占游程总数的12i\frac{1}{2^i}2i1​,…,且在等长的游程中0的游程个数和1的游程个数相等

  3. 异自相关函数是一个常数

    公设(1)说明{ai}\left\{a_i\right\}{ai​}中0与1出现的概率基本上相同

    公设(2)说明0与1在序列中每一位置出现的概率相同

    公设(3)意味着通过对序列与其平移后的序列做比较,不能给出任何信息

3. 密码学角度的补充

  1. {ai}\left\{a_i\right\}{ai​}的周期相当大
  2. {ai}\left\{a_i\right\}{ai​}的确定在计算上是容易的
  3. 由密文及相应的明文的部分信息,不能确定整个{ai}\left\{a_i\right\}{ai​}

4. ***扩展到n长m序列(随便看看就行)

  1. 在一个周期内,0与1出现的次数分别为2n−1−12^{n-1}-12n−1−1和2n−12^{n-1}2n−1

  2. 在一个周期内,总游程数为2n−12^{n-1}2n−1;对1≤i≤n−21\leq i\leq n-21≤i≤n−2,长为iii的游程有2n−i−12^{n-i-1}2n−i−1个,且0、1游程各半;长为n−1n-1n−1的0游程一个,长为nnn的1游程一个

  3. {ai}\left\{a_i\right\}{ai​}的自相关函数为(证明略)
    R(τ)={1,τ=0−12n−1−1,0<τ≤2n−2R(\tau)= \begin{cases} 1,\qquad\qquad\tau=0\\\\ -\frac{1}{2^{n-1}-1},\quad 0<\tau\leq2^n-2 \end{cases} R(τ)=⎩⎪⎨⎪⎧​1,τ=0−2n−1−11​,0<τ≤2n−2​

2.2 Definitions

2.2.1 前情回顾+概念补充

  1. 一个加密方案包含三个算法(Gen,Enc,Dec\mathrm{Gen,Enc,Dec}Gen,Enc,Dec)和一个有限的消息空间M\mathcal{M}M(∣M∣>1\lvert\mathcal{M}\rvert>1∣M∣>1)

  2. Gen\mathrm{Gen}Gen是个概率(probabilistic)算法,它生成的全部密钥kkk构成的(有限)集合称为密钥空间K\mathcal{K}K

  3. Enc\mathrm{Enc}Enc也是一个概率算法(所以Enck(m)\mathrm{Enc}_k(m)Enck​(m)在多次运行时可能会输出不同的密文ccc),我们用c←Enck(m)c\leftarrow\mathrm{Enc}_k(m)c←Enck​(m)表示这个过程(如果Enc\mathrm{Enc}Enc是确定性的,我们可以用c:=Enck(m)c:=\mathrm{Enc}_k(m)c:=Enck​(m)来强调),m∈M,k∈Km\in\mathcal{M},k\in\mathcal{K}m∈M,k∈K

    有一说一我没想到合适的例子(学长提示,很多用到随机数的公钥加密会用到,例如Elgamal加密算法)

    以后我们也可以用 x←Sx\leftarrow Sx←S 来表示从集合SSS中均匀挑选xxx(uniform selection)

  4. 我们把Enck(m)\mathrm{Enc}_k(m)Enck​(m)的所有输出ccc构成的集合称为C\mathcal{C}C

  5. Dec\mathrm{Dec}Dec是一个不失一般性的确定性算法,完美正确性(perfect
    correctness)要求每次解密都百分百正确,即m:=Deck(c)m:=\mathrm{Dec}_k(c)m:=Deck​(c),c∈C,k∈K,m∈Mc\in\mathcal{C},k\in\mathcal{K},m\in\mathcal{M}c∈C,k∈K,m∈M

    我认为这儿在强调解密的不二性

  6. K,M,C\mathcal{K},\mathcal{M},\mathcal{C}K,M,C的分布

    • Pr[K=k]\mathrm{Pr}[K=k]Pr[K=k],取决于方案本身,即Gen\mathrm{Gen}Gen算法
    • Pr[M=m]\mathrm{Pr}[M=m]Pr[M=m],取决于应用方案的环境,与上面的KKK是相互独立的
    • Pr[C=c]\mathrm{Pr}[C=c]Pr[C=c],取决于上面两个因素

2.2.2 Perfect secrecy

背景:攻击者知道mmm的概率分布 + 知道加密方案 + 仅不知道密钥 + 唯密文攻击

1. 定义1

Pr[M=m∣C=c]=Pr[M=m]Pr[C=c]>0(2.1)\mathrm{Pr}[M=m\mid C=c]=\mathrm{Pr}[M=m]\qquad \mathrm{Pr}[C=c]>0 \tag{2.1} Pr[M=m∣C=c]=Pr[M=m]Pr[C=c]>0(2.1)
一个方案若满足等式2.1,则该方案是完美保密的

解释:消息m被发送的先验概率priori probability),与 以密文c被观察到为前提而推出消息m被发送 的后验概率posteriori probability)相同

即,密文不会透露任何关于底层明文的信息

2. 引理1

Pr[EncK(m)=c]=Pr[EncK(m′)=c](2.2)\mathrm{Pr}[\mathrm{Enc}_K(m)=c]=\mathrm{Pr[\mathrm{Enc}_K(m')=c]} \tag{2.2} Pr[EncK​(m)=c]=Pr[EncK​(m′)=c](2.2)

一个方案对任意m,m′∈Mc∈Cm,m'\in\mathcal{M}\ \ \ c\in\mathcal{C}m,m′∈M   c∈C都满足等式2.2,则该方案是完美保密的

解释:密文的概率分布不依赖于明文

3. 引理1→\rightarrow→定义1的证明

假设Pr[M=m]>0Pr[C=c]>0\mathrm{Pr}[M=m]>0\quad\mathrm{Pr}[C=c]>0Pr[M=m]>0Pr[C=c]>0,则有
Pr[C=c∣M=m]=Pr[EncK(M)=c∣M=m]=Pr[EncK(m)=c]\mathrm{Pr}[C=c\mid M=m]=\mathrm{Pr}[\mathrm{Enc}_K(M)=c\mid M=m]=\mathrm{Pr}[\mathrm{Enc}_K(m)=c] Pr[C=c∣M=m]=Pr[EncK​(M)=c∣M=m]=Pr[EncK​(m)=c]

第一个等号:根据随机变量CCC的定义;第二个等号:我们的前提条件就是M=mM=mM=m,即明文已知

设:
δc=defPr[EncK(m)=c]=Pr[C=c∣M=m]=Pr[EncK(m′)=c]=Pr[C=c∣M=m′]\begin{aligned} \delta_c &\overset{\text{def}}=\mathrm{Pr}[\mathrm{Enc}_K(m)=c]=\mathrm{Pr}[C=c\mid M=m]\\ &=\mathrm{Pr}[\mathrm{Enc}_K(m')=c]=\mathrm{Pr}[C=c\mid M=m'] \end{aligned} δc​​=defPr[EncK​(m)=c]=Pr[C=c∣M=m]=Pr[EncK​(m′)=c]=Pr[C=c∣M=m′]​
则:
Pr[M=m∣C=c]=Pr[C=c∣M=m]⋅Pr[M=m]Pr[C=c]=Pr[C=c∣M=m]⋅Pr[M=m]∑m′∈MPr[C=c∣M=m′]⋅Pr[M=m′]=δc⋅Pr[M=m]∑m′∈Mδc⋅Pr[M=m′]=Pr[M=m]∑m′∈MPr[M=m′]=Pr[M=m]′′\begin{aligned} \mathrm{Pr}[M=m\mid C=c] &=\frac{\mathrm{Pr}[C=c\mid M=m]\cdot \mathrm{Pr}[M=m]}{\mathrm{Pr}[C=c]}\\ &=\frac{\mathrm{Pr}[C=c\mid M=m]\cdot \mathrm{Pr}[M=m]}{\sum_{m'\in\mathcal{M}}\mathrm{Pr}[C=c\mid M=m']\cdot \mathrm{Pr}[M=m']}\\ &=\frac{\delta_c\cdot\mathrm{Pr}[M=m]}{\sum_{m'\in\mathcal{M}}\delta_c\cdot\mathrm{Pr}[M=m']}\\ &=\frac{\mathrm{Pr}[M=m]}{\sum_{m'\in\mathcal{M}}\mathrm{Pr}[M=m']}\ =\ \mathrm{Pr}[M=m] \end{aligned}'' Pr[M=m∣C=c]​=Pr[C=c]Pr[C=c∣M=m]⋅Pr[M=m]​=∑m′∈M​Pr[C=c∣M=m′]⋅Pr[M=m′]Pr[C=c∣M=m]⋅Pr[M=m]​=∑m′∈M​δc​⋅Pr[M=m′]δc​⋅Pr[M=m]​=∑m′∈M​Pr[M=m′]Pr[M=m]​ = Pr[M=m]​′′

2.2.3 Perfect (adversarial) indistinguishability

前者从理论出发,后者从实验实践角度出发

1. The adversarial indistinguishability experiment PrivKA,Πeav\mathrm{PrivK}^\mathrm{eav}_{\mathcal{A},\Pi}PrivKA,Πeav​

Π=(Gen,Enc,Dec)\Pi=(\mathrm{Gen,Enc,Dec})Π=(Gen,Enc,Dec)是带有消息空间M\mathcal{M}M的加密方案,A\mathcal{A}A是敌人(形式上只是一个(有状态的)算法),eav我盲猜是eavesdrop

  1. A\mathcal{A}A输出一对消息$m_0,m_1\in $M\mathcal{M}M

  2. Gen\mathrm{Gen}Gen生成一个密钥kkk,再选择一个统一均匀的比特b∈{0,1}b\in\left\{0,1\right\}b∈{0,1}。计算密文c←Enck(mb)c\leftarrow\mathrm{Enc}_k(m_b)c←Enck​(mb​)并交给A\mathcal{A}A。将ccc称为挑战密文(challenge ciphertext)。

  3. A\mathcal{A}A输出一个比特b′b'b′

  4. ①b′=b,output=1①b'=b,output=1①b′=b,output=1;

    ②b′≠b,output=0b'\neq b,output=0b′​=b,output=0;

    ③output=1,PrivKA,Πeav=1③output=1,\mathrm{PrivK}^\mathrm{eav}_{\mathcal{A},\Pi}=1③output=1,PrivKA,Πeav​=1,即A\mathcal{A}A攻击成功

    是Π\PiΠ不是∏\prod∏

2. 定义2

当Π\PiΠ对所有攻击者A\mathcal{A}A,都能保证满足下式,则称该方案是完美不可区分(perfectly indistinguishable
PrivKA,Πeav=12(2.3)\mathrm{PrivK}^\mathrm{eav}_{\mathcal{A},\Pi}=\frac{1}{2} \tag{2.3} PrivKA,Πeav​=21​(2.3)

一个只会选一边的傻子都能猜对一半,而我们目的就是把所有人尽量变成傻子

3. 引理2

当且仅当加密方案Π\PiΠ是完美不可区分时,该方案是完美保密的

4. 证明Vigenère不是完美不可区分

  1. 前提:假设消息空间是两个字符的字符串,密钥长度在{1,2}\left\{1,2\right\}{1,2}中均匀等概选择

  2. A\mathcal{A}A执行以下操作

    • 输出明文m0=aa,m1=abm_0=aa,m_1=abm0​=aa,m1​=ab

    • 得到挑战明文c=c1c2c=c_1c_2c=c1​c2​,c1=c2c_1=c_2c1​=c2​时,输出0;c1≠c2c_1\neq c_2c1​​=c2​时,输出1

      这儿的c1c_1c1​和c2c_2c2​表示单个字符

      这儿的输出是A\mathcal{A}A的输出,不是实验的输出

  3. 攻击成功率的通用算法
    Pr[PrivKA,Πeav=1]=12⋅Pr[PrivKA,Πeav=1∣b=0]+12⋅Pr[PrivKA,Πeav=1∣b=1]=12⋅Pr[Aoutputs0∣b=0]+12⋅Pr[Aoutputs1∣b=1](2.4)\begin{aligned} &\mathrm{Pr}[\mathrm{PrivK}^\mathrm{eav}_{\mathcal{A},\Pi}=1]\\ &=\frac{1}{2}\cdot\mathrm{Pr}[\mathrm{PrivK}^\mathrm{eav}_{\mathcal{A},\Pi}=1\mid b=0]+\frac{1}{2}\cdot\mathrm{Pr}[\mathrm{PrivK}^\mathrm{eav}_{\mathcal{A},\Pi}=1\mid b=1]\\ &=\frac{1}{2}\cdot\mathrm{Pr}[\mathcal{A}\ \mathrm{outputs\ 0}\mid b=0]+\frac{1}{2}\cdot\mathrm{Pr}[\mathcal{A}\ \mathrm{outputs\ 1}\mid b=1] \end{aligned} \tag{2.4} ​Pr[PrivKA,Πeav​=1]=21​⋅Pr[PrivKA,Πeav​=1∣b=0]+21​⋅Pr[PrivKA,Πeav​=1∣b=1]=21​⋅Pr[A outputs 0∣b=0]+21​⋅Pr[A outputs 1∣b=1]​(2.4)

  4. 对于该例子本身

    • Pr[Aoutputs0∣b=0]=12+12⋅126≈0.52\mathrm{Pr}[\mathcal{A}\ \mathrm{outputs\ 0}\mid b=0]=\frac{1}{2}+\frac{1}{2}\cdot\frac{1}{26}\approx 0.52Pr[A outputs 0∣b=0]=21​+21​⋅261​≈0.52

      ①密钥长度为1

      ②密钥长度为2,且密钥两个字符相同

    • Pr[Aoutputs1∣b=1]=1−Pr[Aoutputs0∣b=1]=1−12⋅126≈0.98\mathrm{Pr}[\mathcal{A}\ \mathrm{outputs\ 1}\mid b=1]=1-\mathrm{Pr}[\mathcal{A}\ \mathrm{outputs\ 0}\mid b=1]=1-\frac{1}{2}\cdot\frac{1}{26}\approx 0.98Pr[A outputs 1∣b=1]=1−Pr[A outputs 0∣b=1]=1−21​⋅261​≈0.98

      明文选ababab,密文两个字符还能相同,仅当密钥长度为2且密钥的后一个字符比前一个字符大1(例如:ba,cb,dcba,cb,dcba,cb,dc等)

    • Pr[PrivKA,Πeav=1]=12⋅(12+12⋅126+1−12⋅126)=0.75>12\mathrm{Pr}[\mathrm{PrivK}^\mathrm{eav}_{\mathcal{A},\Pi}=1]=\frac{1}{2}\cdot\Big(\frac{1}{2}+\frac{1}{2}\cdot\frac{1}{26}+1-\frac{1}{2}\cdot\frac{1}{26}\Big)=0.75>\frac{1}{2}Pr[PrivKA,Πeav​=1]=21​⋅(21​+21​⋅261​+1−21​⋅261​)=0.75>21​

2.3 The One-Time Pad

这个“一次(one-time)”我的理解:1. 一次性;2. 每个明密文对和一个密钥字符对应,即每个密钥字符用一次

2.3.1 结构1

  • 确定整数l>0\mathscr{l}>0l>0,M,K,C={0,1}l\mathcal{M,K,C}=\left\{0,1\right\}^{\mathscr{l}}M,K,C={0,1}l(长度为l\mathscr{l}l的二进制字符串)

    例如{0,1}3={000,001,010,011,100,101,110,111}\left\{0,1\right\}^3=\left\{000,001,010,011,100,101,110,111\right\}{0,1}3={000,001,010,011,100,101,110,111}

  • Gen\mathrm{Gen}Gen:从{0,1}l\left\{0,1\right\}^{\mathscr{l}}{0,1}l(共2l2^{\mathscr{l}}2l个比特串)中均匀地随机选择一个作为密钥,每个比特串被选择的概率均为2−l2^{-\mathscr{l}}2−l

  • Enc:c:=k⊕m\mathrm{Enc}:\ c:=k\oplus mEnc: c:=k⊕m

  • Dec:m:=k⊕c\mathrm{Dec}:\ m:=k\oplus cDec: m:=k⊕c

"⊕\oplus⊕’'表示逐位异或(exclusive-or(XOR)),与二进制加减法等价(1⊕1=0,1⊕0=1,0⊕1=1,0⊕0=01\oplus1=0,1\oplus0=1,0\oplus1=1,0\oplus0=01⊕1=0,1⊕0=1,0⊕1=1,0⊕0=0)

即Deck(Enck(m))=k⊕k⊕m=m\mathrm{Dec}_k(\mathrm{Enc}_k(m))=k\oplus k\oplus m=mDeck​(Enck​(m))=k⊕k⊕m=m

2.3.2 定理1

1. 阐述

The one-time pad encryption scheme is perfectly secret.

2. 证明

  1. 首先计算对于任意c∈C,m′∈Mc\in\mathcal{C},m'\in\mathcal{M}c∈C,m′∈M

Pr[C=c∣M=m′]=Pr[EncK(m′)=c]=Pr[m′⊕K=c]=Pr[K=m′⊕c]=2−l\begin{aligned} \mathrm{Pr}[C=c\mid M=m']=\mathrm{Pr}[\mathrm{Enc}_K(m')=c]&=\mathrm{Pr}[m'\oplus K=c]\\ &=\mathrm{Pr}[K=m'\oplus c]\\ &=2^{-\mathscr{l}} \end{aligned} Pr[C=c∣M=m′]=Pr[EncK​(m′)=c]​=Pr[m′⊕K=c]=Pr[K=m′⊕c]=2−l​

Pr[C=c]=∑m′∈MPr[C=c∣M=m′]⋅Pr[M=m′]=2−l⋅∑m′∈MPr[M=m′]=2−lPr[M=m′]≠0\begin{aligned} \mathrm{Pr}[C=c]&=\sum_{m'\in\mathcal{M}}\mathrm{Pr}[C=c\mid M=m']\cdot\mathrm{Pr}[M=m']\\ &=2^{-\mathscr{l}}\cdot\sum_{m'\in\mathcal{M}}\mathrm{Pr}[M=m']\\ &=2^{-\mathscr{l}}\qquad \qquad \qquad \quad \quad \mathrm{Pr}[M=m']\neq0 \end{aligned} Pr[C=c]​=m′∈M∑​Pr[C=c∣M=m′]⋅Pr[M=m′]=2−l⋅m′∈M∑​Pr[M=m′]=2−lPr[M=m′]​=0​

举个我理解的Pr[M=m′]=0\mathrm{Pr}[M=m']=0Pr[M=m′]=0的例子:l=3,m′=1010\mathscr{l}=3,m'=1010l=3,m′=1010

  1. Pr[M=m∣C=c]=Pr[C=c∣M=m]⋅Pr[M=m]Pr[C=c]=2−l⋅Pr[M=m]2−l=Pr[M=m]\begin{aligned} \mathrm{Pr}[M=m\mid C=c] &=\frac{\mathrm{Pr}[C=c\mid M=m]\cdot \mathrm{Pr}[M=m]}{\mathrm{Pr}[C=c]}\\ &=\frac{2^{-\mathscr{l}}\cdot \mathrm{Pr}[M=m]}{2^{-\mathscr{l}}}\\ &=\mathrm{Pr}[M=m] \end{aligned} Pr[M=m∣C=c]​=Pr[C=c]Pr[C=c∣M=m]⋅Pr[M=m]​=2−l2−l⋅Pr[M=m]​=Pr[M=m]​

3. 补充

  1. 上世纪中期很多国家机关用这个方案,冷战时苏联和美国通信时就用过(red phone),一堆特工带着一个放着密钥的黑箱子,物 理 转 移

    这个男人可能就干过这事儿

  1. 缺点1:消息长度与时效性之间的冲突

    消息一长,就很难预测长度(上限),密钥就难确定。确定一个新的密钥很浪费时间,传输也是个问题。

  2. 缺点2:只有使用第一次时才绝对安全,用了两次就会出现下面这种情况:
    c⊕c′=(m⊕k)⊕(m′⊕k)=m⊕m′c\oplus c'=(m\oplus k)\oplus(m'\oplus k)=m\oplus m' c⊕c′=(m⊕k)⊕(m′⊕k)=m⊕m′

    该结果就是两条消息的不同之处,很有可能会泄露一些信息,至少绝对不算完美保密了。苏联当年就是因为这个在英国和美国面前裸奔了几十年(VENONA 计划)

有缺点不代表one-time pad无效!!

2.4 Limitations of Perfect Secrecy

2.4.1 定理2

1. 阐述

如果Π\PiΠ是完美保密方案,则∣K∣≥∣M∣\lvert\mathcal{K}|\geq|\mathcal{M}\rvert∣K∣≥∣M∣

任何完全保密的加密方案都必须有一个密钥空间,这个密钥空间至少与消息空间一样大。

2. 证明

反证法,假设∣K∣<∣M∣\lvert\mathcal{K}|<|\mathcal{M}\rvert∣K∣<∣M∣

  1. 令M(c)\mathcal{M}(c)M(c)为密文ccc解密后所有可能明文消息的集合,即:

M(c)=def{m∣m=Deck(c)forsomek∈K}\mathcal{M}(c)\overset{\text{def}}=\left\{m\mid m=\mathrm{Dec}_k(c)\ \mathrm{for\ some\ }k\in\mathcal{K}\right\} M(c)=def{m∣m=Deck​(c) for some k∈K}

  1. 很显然∣M(c)∣≤∣K∣\vert\mathcal{M}(c)\vert\leq \lvert\mathcal{K}|∣M(c)∣≤∣K∣(“=”时,所有密钥加密后的结果都一样),且∣K∣<∣M∣\lvert\mathcal{K}|<|\mathcal{M}\rvert∣K∣<∣M∣,所以肯定存在m′m'm′,有m′∈Mm'\in\mathcal{M}m′∈M但m′∉Mm'\notin\mathcal{M}m′∈/​M,则有:

Pr[M=m′∣C=c]=0≠Pr[M=m′]\mathrm{Pr}[M=m'\mid C=c]=0\neq\mathrm{Pr}[M=m'] Pr[M=m′∣C=c]=0​=Pr[M=m′]

​ 所以不是完美保密

书上原话:Recall that we may assume Dec\mathrm{Dec}Dec is deterministic.

我认为这儿是再次强调解密的不二性

表明one-time pad的缺点并不是特定于该方案,而是完全保密的固有限制。(长度与次数都是)

3. 辟谣

上述证明过程已经显示出完美保密的固有局限性,因此以后出现任何宣称自己用短密钥实现完美保密的均按神经病处理(理解妄想成打破密码学的能量守恒定律)

4. 补充+个人想法

  1. 虽然one-time pad是完美保密,但两者并不是完全等价的

  2. 如果所有密钥的长度都相同,并且消息空间由长度固定的所有字符串组成,这意味着密钥至少与消息一样长。(one-time pad的密钥长度是最优解)

    第4点马上再次提到

  3. 老师提到密钥空间大一般只是说防止暴力攻击,没提到这是完美保密的条件之一

  4. 加密其实就是打乱明密文映射的一个过程(如下)

  • 根本目的是打乱这个“

  • 移位密码(m和c代表单个字母)

    密钥长度为1(26进制),密钥空间大小为26

    注意区分“space”和“length”之间的区别,下同

    所以只有在加密一个字母(26进制)时,移位密码是完美保密的

  • 单表代换密码(m和c代表单个字母)

    密钥空间为26!≈28826!\approx2^{88}26!≈288,理论上很安全,那为什么实际不安全呢?

    因为没做到 the probability distribution of the ciphertext does not depend on the plaintext(P29倒数第10行),即密文不uniform

    当然移位密码也没做到

    此处建议回忆一下对该两种密码的攻击方式

  • 至于多表代换密码(m和c代表单个字母)

    可能会出现下面这种情况

    设密钥长度为lKl_KlK​,则密钥空间大小为26lK26^{l_K}26lK​;明文长度为lMl_MlM​,明文空间大小为26lM26^{l_M}26lM​

    所以lK≥lMl_K\geq l_MlK​≥lM​时,Vigenère密码是完美保密的(结合上面第2点)

    我觉得为one-time pad申请专利的Vernam(弗纳姆)就是个白嫖Vigenère的坏蛋(个人偏见)

  • 那如果∣K∣>∣M∣\lvert\mathcal{K}|>|\mathcal{M}\rvert∣K∣>∣M∣呢?

    可能会发生这种情况(m和c代表明密文本身)

    即两个密钥加密某个明文得到一摸一样的结果(殊途同归),攻击者是不是会多条破解密文的道路?(更直观的说:以前必须找到k1k_1k1​才行,现在找到k1,k2k_1,k_2k1​,k2​甚至k3k_3k3​中的一个就能成功破解)是不是变得不安全了?

    应该不是,举个例子

    1. 明文:000;密文:111;密钥111(长度为3),密钥空间是{0,1}3\left\{0,1\right\}^3{0,1}3,盲猜猜对的概率的18\frac{1}{8}81​
    2. 现在把密钥空间扩展到4位,即{0,1}4\left\{0,1\right\}^4{0,1}4(仍是低位用于加密)
    3. 那密钥可能为1111,0111,盲猜猜中的概率为216=18\frac{2}{16}=\frac{1}{8}162​=81​。可以看出被破解的概率并没有发生本质改变
    4. 直观解释:通往正确的路确实多了,但通往错误的路也多了。况且你也不知道错误的道路从哪里通往哪里,参考联系2.3.也并没有更安全,还造成了密钥空间浪费(花冤枉钱修了一堆没用的路)

综上,一个密钥对应着一种随机的明密文映射关系。如果密钥比消息少的话,肯定会有部分映射关系可以排除,即减少了错误路线的数量

而攻击者一可以减少工作量,二可以从排除的路线中推导出一些额外信息,这些信息可能足以攻破该系统

2.5 *Shannon’s Theorem

香农就是这位大兄弟(苹果我放的)

2.5.1 阐述

  1. 前提:∣M∣=∣K∣=∣C∣\vert\mathcal{M}\vert=\vert\mathcal{K}\vert=\vert\mathcal{C}\vert∣M∣=∣K∣=∣C∣

    理解这个“=”:看做完美保密的“最优解”(至少做到了不浪费)

  2. 条件

    • 每个密钥k∈Kk\in\mathcal{K}k∈K由算法Gen\mathrm{Gen}Gen以(相等的)概率1/∣K∣1/\vert\mathcal{K}\vert1/∣K∣选择
    • Foreverym∈Mandc∈C,thereexistsauniquekeyk∈KsuchthatEnck(m)outputsc.For\ every\ m\in\mathcal{M}\ and \ c\in\mathcal{C},there\ exists\ a\ unique\ key\ k\in K\ such\ that\ \mathrm{Enc}_k(m)\ outputs\ c.For every m∈M and c∈C,there exists a unique key k∈K such that Enck​(m) outputs c.

    一个密钥唯一对应着一种随机的明密文映射关系,也意味着任何密文都可能是加密任何可能明文的结果

    示例如下图:

    下面这个我原来举的例子(m和c代表明密文本身)是错的!!(至少对一次一密钥来说)

    因为不同的密钥却有一组一样的明密文映射关系:e.g.:m1−>c4(k2,kn)m_1\ ->c_4\ (k_2,k_n)m1​ −>c4​ (k2​,kn​)


    3. 结论 在该前提下,满足以上两个条件的加密方案是完美保密的

2.5.2 证明

假设Enc\mathrm{Enc}Enc是一个确定性算法(可以证明这样不失一般性)

理所当然地没太理解

1. 充分性

满足条件1,2—> perfectly secret

Pr[C=c∣M=m]=Pr[K=k]=1/∣K∣forEnck(m)=c\mathrm{Pr}[C=c\mid M=m]=\mathrm{Pr}[K=k]=1/\vert\mathcal{K}\vert\qquad for\quad\mathrm{Enc}_k(m)=c Pr[C=c∣M=m]=Pr[K=k]=1/∣K∣forEnck​(m)=c

条件2保证kkk是唯一密钥,条件1保证最后一个等号成立

所以
Pr[C=c]=∑m∈MPr[EncK(m)=c]⋅Pr[M=m]=1/∣K∣\mathrm{Pr}[C=c]=\sum_{m\in\mathcal{M}} \mathrm{Pr}[\mathrm{Enc}_K(m)=c]\cdot\mathrm{Pr}[M=m]=1/\vert\mathcal{K}\vert Pr[C=c]=m∈M∑​Pr[EncK​(m)=c]⋅Pr[M=m]=1/∣K∣

注意是大写KKK(下同),所以Pr[EncK(m)=c]=1/∣K∣\mathrm{Pr}[\mathrm{Enc}_K(m)=c]=1/\vert\mathcal{K}\vertPr[EncK​(m)=c]=1/∣K∣

该式子对于呈任何分布的M\mathcal{M}M都成立

对于任何Pr[M=m]≠0\mathrm{Pr}[M=m]\neq0Pr[M=m]​=0
Pr[M=m∣C=c]=Pr[C=c∣M=m]⋅Pr[M=m]Pr[C=c]=Pr[EncK(m)=c]⋅Pr[M=m]Pr[C=c]=∣K∣−1⋅Pr[M=m]∣K∣−1=Pr[M=m]\begin{aligned} \mathrm{Pr}[M=m\mid C=c] &=\frac{\mathrm{Pr}[C=c\mid M=m]\cdot \mathrm{Pr}[M=m]}{\mathrm{Pr}[C=c]}\\ &=\frac{\mathrm{Pr}[\mathrm{Enc}_K(m)=c]\cdot \mathrm{Pr}[M=m]}{\mathrm{Pr}[C=c]}\\ &=\frac{\vert\mathcal{K}\vert^{-1}\cdot \mathrm{Pr}[M=m]}{\vert\mathcal{K}\vert^{-1}}=\mathrm{Pr}[M=m] \end{aligned} Pr[M=m∣C=c]​=Pr[C=c]Pr[C=c∣M=m]⋅Pr[M=m]​=Pr[C=c]Pr[EncK​(m)=c]⋅Pr[M=m]​=∣K∣−1∣K∣−1⋅Pr[M=m]​=Pr[M=m]​

注意理解Pr[C=c∣M=m]=Pr[EncK(m)=c]\mathrm{Pr}[C=c\mid M=m]=\mathrm{Pr}[\mathrm{Enc}_K(m)=c]Pr[C=c∣M=m]=Pr[EncK​(m)=c],这儿的M=mM=mM=m可不是给定的条件,因为mmm是任取的(arbitrary)

所以该方案是完美保密的

2. 必要性

perfectly secret—>条件1,2成立(在∣M∣=∣K∣=∣C∣\vert\mathcal{M}\vert=\vert\mathcal{K}\vert=\vert\mathcal{C}\vert∣M∣=∣K∣=∣C∣ 的前提下)

2.1 证明条件2
  1. 对于任意c∈Cc\in\mathcal{C}c∈C,一定存在信息m∗∈Mm^*\in Mm∗∈M满足Pr[EncK(m∗)=c]≠0\mathrm{Pr}[\mathrm{Enc}_K(m^*)=c]\neq0Pr[EncK​(m∗)=c]​=0

  2. 引理1暗含着对于所有m∈Mm\in Mm∈M,Pr[EncK(m)=c]≠0\mathrm{Pr}[\mathrm{Enc}_K(m)=c]\neq0Pr[EncK​(m)=c]​=0。换言之,令M={m1,m2,...}\mathcal{M}=\left\{m_1,m_2,...\right\}M={m1​,m2​,...},则对于每个mi∈Mm_i\in\mathcal{M}mi​∈M,都有一个非空集Ki⊂K\mathcal{K}_i\subset\mathcal{K}Ki​⊂K,当且仅当k∈Kik\in\mathcal{K}_ik∈Ki​时,Enck(mi)=c\mathrm{Enc}_k(m_i)=cEnck​(mi​)=c

  3. 当i≠ji\neq ji​=j时,Ki\mathcal{K}_iKi​和Kj\mathcal{K}_jKj​是不相交的,否则正确性会不成立

    一旦相交,就会变成一个密钥解密一个密文,得到两个不同明文的结果,和Dec\mathrm{Dec}Dec是确定性算法这一事实相悖

  4. 又因为∣K∣=∣M∣\vert\mathcal{K}\vert=\vert\mathcal{M}\vert∣K∣=∣M∣,所以每个Ki\mathcal{K}_iKi​里面只有一个元素kik_iki​,条件2证毕。

2.2 证明条件1

根据引理1,易知:对于任意mi,mj∈Mm_i,m_j\in\mathcal{M}mi​,mj​∈M,可得
Pr[K=ki]=Pr[EncK(mi)=c]=Pr[EncK(mj)=c]=Pr[K=kj]\mathrm{Pr}[K=k_i]=\mathrm{Pr}[\mathrm{Enc}_K(m_i)=c]=\mathrm{Pr}[\mathrm{Enc}_K(m_j)=c]=\mathrm{Pr}[K=k_j] Pr[K=ki​]=Pr[EncK​(mi​)=c]=Pr[EncK​(mj​)=c]=Pr[K=kj​]
又因为1≤i,j≤∣M∣=∣K∣1\leq i,j\leq\vert\mathcal{M}\vert=\vert\mathcal{K}\vert1≤i,j≤∣M∣=∣K∣,且当i≠ji\neq ji​=j时,ki≠kjk_i\neq k_jki​​=kj​,这意味着每个密钥出现概率相同,即均为1/∣K∣1/\vert\mathcal{K}\vert1/∣K∣。条件1证毕。

2.5.3 补充

  1. 香农定理对于判断一个给定的系统是不是完美保密是很有帮助的

    • 条件1很容易检查

    • 条件2无需计算任何概率就可以被证明(或反驳)(与直接使用定义1相反)。

      所以我们设计方案的工作本质上就是尽可能让方案uniform来满足这两个条件?

  2. 该定理只适用于∣M∣=∣K∣=∣C∣\vert\mathcal{M}\vert=\vert\mathcal{K}\vert=\vert\mathcal{C}\vert∣M∣=∣K∣=∣C∣

    毕竟是大前提

2.6 英语积累

appendix 附录
justify     证明合法,是...的正当理由
unbiased    无偏置的,无偏见的,公正的
entropy     熵
sophisticated   见多识广的,老练的,复杂巧妙的
chip    芯片
dedicated   专用的
specification   详述
notation    符号
conditional probability 条件概率
prominent   卓越的,显著的,突出的
courier     送快递的人,情报员
notwithstanding 尽管如此
portion     部分;加大份量
inherent    固有的
optimal     最佳的
radically   根本地,彻底地
blatantly   公然地
in its own right    凭借自身能力,独立地
undetectably    不可检测地
random tape Tape is a basic concept from Turing machines.The random tape is the tape with random bits on it.

概率图灵机

我认为把random tape理解成一串真随机比特就行了

2.7 课后练习(有时间再往完做吧…)

  1. 方法一:设M,K,C={0,1}3,c=000\mathcal{M,K,C}=\left\{0,1\right\}^3,c=000M,K,C={0,1}3,c=000,则
    Pr[C=000∣M=111]=(Pr[Enck=000(111)=000]+Pr[Enck=001(111)=000]+Pr[Enck=010(111)=000]+Pr[Enck=011(111)=000]+Pr[Enck=100(111)=000]+Pr[Enck=101(111)=000]+Pr[Enck=110(111)=000]+Pr[Enck=111(111)=000])/∣K∣=18\begin{aligned} \mathrm{Pr}[C=000\mid M=111]=( &\mathrm{Pr}[\mathrm{Enc}_{k=000}(111)=000]+\mathrm{Pr}[\mathrm{Enc}_{k=001}(111)=000]+\\ &\mathrm{Pr}[\mathrm{Enc}_{k=010}(111)=000]+\mathrm{Pr}[\mathrm{Enc}_{k=011}(111)=000]+\\ &\mathrm{Pr}[\mathrm{Enc}_{k=100}(111)=000]+\mathrm{Pr}[\mathrm{Enc}_{k=101}(111)=000]+\\ &\mathrm{Pr}[\mathrm{Enc}_{k=110}(111)=000]+\mathrm{Pr}[\mathrm{Enc}_{k=111}(111)=000])/\vert\mathcal{K}\vert\\ =\frac{1}{8} \end{aligned} Pr[C=000∣M=111]=(=81​​Pr[Enck=000​(111)=000]+Pr[Enck=001​(111)=000]+Pr[Enck=010​(111)=000]+Pr[Enck=011​(111)=000]+Pr[Enck=100​(111)=000]+Pr[Enck=101​(111)=000]+Pr[Enck=110​(111)=000]+Pr[Enck=111​(111)=000])/∣K∣​
    同理,任取m∈M,m∈M,Pr[C=c∣M=m]=18m\in\mathcal{M},m\in\mathcal{M},\mathrm{Pr}[C=c\mid M=m]=\frac{1}{8}m∈M,m∈M,Pr[C=c∣M=m]=81​

    同理,令M,K,C={0,1}l,Pr[C=c∣M=m]=12l\mathcal{M,K,C}=\left\{0,1\right\}^{\mathscr{l}},\mathrm{Pr}[C=c\mid M=m]=\frac{1}{2^{\mathscr{l}}}M,K,C={0,1}l,Pr[C=c∣M=m]=2l1​

    方法二:假设∣M∣=∣K∣=∣C∣\vert\mathcal{M}\vert=\vert\mathcal{K}\vert=\vert\mathcal{C}\vert∣M∣=∣K∣=∣C∣,令K={k1,k2,...k∣K∣}\mathcal{K}=\left\{k_1,k_2,...k_{\vert\mathcal{K}\vert}\right\}K={k1​,k2​,...k∣K∣​},设Encki(m)=ci,i∈(1,∣K∣),m∈M\mathrm{Enc}_{k_i}(m)=c_i,i\in(1,\vert\mathcal{K}\vert),m\in\mathcal{M}Encki​​(m)=ci​,i∈(1,∣K∣),m∈M
    Pr[C=c∣M=m]=Pr[EncK(m)=c]=∑ki∈KPr[Encki(m)=c]∣K∣=∑ki∈K∑j=1∣K∣Pr[Encki(m)=cj]∣K∣⋅∣K∣=∑ki∈KPr[Encki(m)=ci]∣K∣⋅∣K∣(Pr[Encki(m)=cj]=0forj≠i)=∣K∣∣K∣⋅∣K∣=1∣K∣\begin{aligned} \mathrm{Pr}[C=c\mid M=m] &=\mathrm{Pr}[\mathrm{Enc}_K(m)=c]\\ &=\sum_{k_i\in\mathcal{K}}\frac{\mathrm{Pr}[\mathrm{Enc}_{k_i}(m)=c]}{\vert\mathcal{K}\vert}\\ &=\sum_{k_i\in\mathcal{K}}\frac{\sum_{j=1}^{\vert\mathcal{K}\vert}\mathrm{Pr}[\mathrm{Enc}_{k_i}(m)=c_j]}{\vert\mathcal{K}\vert\cdot\vert\mathcal{K}\vert}\\ &=\sum_{k_i\in\mathcal{K}}\frac{\mathrm{Pr}[\mathrm{Enc}_{k_i}(m)=c_i]}{\vert\mathcal{K}\vert\cdot\vert\mathcal{K}\vert}\qquad\ \ \ \ (\mathrm{Pr}[\mathrm{Enc}_{k_i}(m)=c_j]=0\ for\ j\neq i)\\ &=\frac{\vert\mathcal{K}\vert}{\vert\mathcal{K}\vert\cdot\vert\mathcal{K}\vert}=\frac{1}{\vert\mathcal{K}\vert} \end{aligned} Pr[C=c∣M=m]​=Pr[EncK​(m)=c]=ki​∈K∑​∣K∣Pr[Encki​​(m)=c]​=ki​∈K∑​∣K∣⋅∣K∣∑j=1∣K∣​Pr[Encki​​(m)=cj​]​=ki​∈K∑​∣K∣⋅∣K∣Pr[Encki​​(m)=ci​]​    (Pr[Encki​​(m)=cj​]=0 for j​=i)=∣K∣⋅∣K∣∣K∣​=∣K∣1​​

    由此可见Gen\mathrm{Gen}Gen算法从密钥空间均匀随机地选取不同密钥并不改变Pr[C=c∣M=m]\mathrm{Pr}[C=c\mid M=m]Pr[C=c∣M=m]的值

  2. TODO(我连Enc确定是什么意思都没理解)

  3. 设明文是1比特,密文是2比特,密钥是3比特,且满足下列算法
    c0=m0⊕k0c1=(k2∧k1)⊕m0⊕k0c_0=m_0\oplus k_0\\ c_1=(k_2\wedge k_1)\oplus m_0\oplus k_0 c0​=m0​⊕k0​c1​=(k2​∧k1​)⊕m0​⊕k0​
    如下图表格

    0 1
    (0,0,0) (0,0) (1,1)
    (0,0,1) (0,0) (1,1)
    (0,1,0) (0,0) (1,1)
    (0,1,1) (0,1) (1,0)
    (1,0,0) (1,1) (0,0)
    (1,0,1) (1,1) (0,0)
    (1,1,0) (1,1) (0,0)
    (1,1,1) (1,0) (0,1)
    \begin{table}\begin{tabular}{r|c|c}& $0$ & $1$ \\\hline$(0,0,0)$ & $(0,0)$ & $(1,1)$ \\$(0,0,1)$ & $(0,0)$ & $(1,1)$ \\$(0,1,0)$ & $(0,0)$ & $(1,1)$ \\$(0,1,1)$ & $(0,1)$ & $(1,0)$ \\$(1,0,0)$ & $(1,1)$ & $(0,0)$ \\$(1,0,1)$ & $(1,1)$ & $(0,0)$ \\$(1,1,0)$ & $(1,1)$ & $(0,0)$ \\$(1,1,1)$ & $(1,0)$ & $(0,1)$\end{tabular}
    \end{table}实名举报Typora(暂时)画不了LaTeX表格
    

    P[M=0∣C=(0,0)]=P[M=0]⋅(P[K=(0,0,0)+P[K=(0,0,1)+P[K=(0,1,0)])P[C=(0,0)]=P[M=0]⋅38616=P[M=0]P[M=0∣C=(0,1)]=P[M=0]⋅P[K=(0,1,1)P[C=(0,1)]=P[M=0]⋅18216=P[M=0]...etc.\begin{aligned} P[M=0\mid C=(0,0)]&=\frac{P[M=0]\cdot(P[K=(0,0,0)+P[K=(0,0,1)+P[K=(0,1,0)])}{P[C=(0,0)]}\\ &=\frac{P[M=0]\cdot\frac{3}{8}}{\frac{6}{16}}=P[M=0]\\ P[M=0\mid C=(0,1)]&=\frac{P[M=0]\cdot P[K=(0,1,1)}{P[C=(0,1)]}\\ &=\frac{P[M=0]\cdot\frac{1}{8}}{\frac{2}{16}}=P[M=0]\\ .\\.\\.\\ etc. \end{aligned} P[M=0∣C=(0,0)]P[M=0∣C=(0,1)]...etc.​=P[C=(0,0)]P[M=0]⋅(P[K=(0,0,0)+P[K=(0,0,1)+P[K=(0,1,0)])​=166​P[M=0]⋅83​​=P[M=0]=P[C=(0,1)]P[M=0]⋅P[K=(0,1,1)​=162​P[M=0]⋅81​​=P[M=0]​

    但是38=P[C=(0,0)]≠P[C=(0,1)]=18\frac{3}{8}=P[C=(0,0)]\neq P[C=(0,1)]=\frac{1}{8}83​=P[C=(0,0)]​=P[C=(0,1)]=81​

    所以任取c0,c1∈Cc_0,c_1\in Cc0​,c1​∈C,不能得到Pr[C=c0]=Pr[C=c1]\mathrm{Pr}[C=c_0]=\mathrm{Pr}[C=c_1]Pr[C=c0​]=Pr[C=c1​]

  4. TODO

《Introduction To Modern Cryptography》读书笔记二相关推荐

  1. 《Docker 技术入门与实践》-读书笔记二

    <Docker 技术入门与实践>-读书笔记一 <Docker 技术入门与实践>-读书笔记二 一.数据管理 用户在使用 Docker 的过程中,往往需要能查看容器内应用产生的数据 ...

  2. python基础学习[python编程从入门到实践读书笔记(连载一)]

    写在前面:本文来自笔者关于<python编程从入门到实践>的读书笔记与动手实践记录. 程序员之禅 文章目录 02变量和简单数据类型 03 列表简介 04 操作列表 05 if语句 06 字 ...

  3. 测试工程师全栈技术进阶与实践读书笔记

    第一章 软件测试基础知识精要(上) 1.1 从"用户登录"测试谈起 1.1.1 功能测试用例 1.1.2 更多的测试用例 1.1.3 功能性需求与非功能性需求 对显式功能性需求的验 ...

  4. python基础学习[python编程从入门到实践读书笔记(连载三)]:django学习笔记web项目

    文章目录 Django项目:学习笔记web网页 项目部署 参考 自己部署的网站,还是小有成就感的,毕竟踩过很多坑,实战技能也有些许进步. 网站链接:http://lishizheng.herokuap ...

  5. python基础学习[python编程从入门到实践读书笔记(连载五)]:数据可视化项目第16章

    文章目录 下载数据 制作全球地震散点图:JSON格式 end 几个实验结果: 每日最高气温: 地震图绘制: 下载数据 CSV文件格式 在文本文件中存储数据,一个简单方式是将数据作为一系列以逗号分隔的值 ...

  6. 【Docker技术入门与实践(第2版)】Docker入门_学习笔记

    第一章 1 Docker入门须知 1.1 Docker基本知识 Docker是基于Go语言实现的开源容器项目,诞生于2013年年初,最初发 起者是dotCloud公司.Docker自开源后受到广泛的关 ...

  7. python编程从入门到实践读书笔记-《Python编程:从入门到实践》项目部分读书笔记(二)...

    鸽了一个暑假没有更新,现在趁着还没开学更一下.咕咕咕 上期作业: 请创建一个Django项目,命名为Blog,建不建立虚拟环境随便你,最后本地跑成了就行. 步骤: ①在需要创建工程的文件夹下打开cmd ...

  8. python基础学习[python编程从入门到实践读书笔记(连载二)]:外星人入侵项目

    第一版游戏demo 添加计分系统:中间是最高得分,右边是本次得分. 显示余下的飞船数 主函数如下,完整程序将上传到笔者的github:https://github.com/shizhengLi/lea ...

  9. 深入浅出Istio:Service mesh快速入门与实践-读书笔记(By GisonWin)

    01 服务网格历史 (以后补充) 02 服务网格的基本特性 连接 微服务错综复杂,要完成其业务目标,连接问题是首要问题.连接存在于所有服务的整个lifcecycle中,用于维持服务的运行. 安全 保障 ...

  10. 深度学习框架Pytorch入门与实践——读书笔记

    2 快速入门 2.1 安装和配置 pip install torch pip install torchvision#IPython魔术命令 import torch as t a=t.Tensor( ...

最新文章

  1. httpWebRequest 错误
  2. Linux编程中的坑——C++中exit和return的区别
  3. 基于 Docker 的微服务架构实践
  4. Clonezilla制作镜像时报错:extfsclone.c:bitmap free count err解决办法
  5. 源代码遭泄露,大疆员工被罚20万,判刑半年。
  6. linux确定刻录机目录,在Linux操作系统下使用DVD刻录机(转)
  7. Elasticsearch学习之基本核心概念
  8. FaceApp 一键变老?别丧失了你的隐私!
  9. postman使用之二:数据同步和创建测试集
  10. dtcms传递多个参数怎么获取
  11. 十大硬盘数据恢复软件介绍
  12. 100位量子计算机算力,最快!我国量子计算机实现算力全球领先
  13. 以P2P网贷为例互联网金融产品如何利用大数据做风控?
  14. 电脑开机无logo,进不了bios
  15. 关于travis scott的网名_小仙女可爱单纯的网名
  16. CUDA是什么-CUDA简介
  17. 迷你世界云服务器不见了,迷你世界:主动下架已经一周了,各位小伙伴你们怎么看?...
  18. jackson-databind 版本升级遇到的问题
  19. 马士兵内部资料—《Java面试突击核心讲》共1658页
  20. 计算机erp基础入门,ERP基础知识73条 - ERP新手入门-基础知识理论

热门文章

  1. 哎, 安全,一声叹息
  2. Docker快速上手指南
  3. networkx设置labels大小和颜色
  4. Oracle ERP 11i中英对照词汇表(转)
  5. android获取图片的rgb,使用ImageReader读取RGB图像
  6. 一只入门级python爬虫
  7. 微软 oracle ibm,IBM:Oracle和SAP大战的制高点
  8. c语言第六章数组测试题,计算机二级C语言测试题
  9. 第一个iBATIS测试就通不过
  10. [软考] 计算机技术与软件专业技术资格考试之扫盲贴