密码学(斯坦福)

密码学笔记 \huge{密码学笔记} 密码学笔记

斯坦福大学密码学的课程笔记

课程网址:https://www.bilibili.com/video/BV1Rf421o79E/?spm_id_from=333.337.search-card.all.click&vd_source=5cc05a038b81f6faca188e7cf00484f6

概述

密码学的使用背景


安全信息保护 :网络流量、无线网络流量
保护加密软件或者光盘 :EFS...
内容保护 :CSS(DVD)AACS(蓝光)事实证明CSS是比较容易被破解的。
用户认证等...

主机段与服务器段之间的传输协议保证了信息传输过程中不会被攻击者窃听或者篡改。

TLS协议简述

①. 传输双端的握手协议:双端握手之后,双端会获得一个只有双端知道的密钥,其他用户无法知道密钥的内容。

②. 信息记录方面:双端使用共享密钥对于传递的信息进行加密传输。

磁盘中的信息保护机制保证磁盘中的信息不会被篡改。对于磁盘来讲从Alice到Alice,不同的是访问磁盘信息的时间,这是磁盘在存储方面的问题。但是从Alice到Bob则是磁盘在信息传递方面的问题,这是两个不同层面的问题。

对称加密 简图:

Alice和Bob进行信息交互的时候,Alice使用E(加密算法)对于传递信息进行加密形成密文,Bob接收到密文使用D(解密算法)来得到传递的信息。

❗❗❗对于对称加密整个过程,E.D等其他环节都是完全公开的,只有双方要传递的信息k是不公开的。而且从安全性的角度来讲选择的各种加密算法一定是社会公认的,接受了大量测试认证的加密解密算法,防止使用小众的加密算法被人简单的逆向破解。

一次性密钥:一个密钥只能加密一条信息。

多次性密钥:一个密钥可以加密多条信息。

简介

密码学的核心 是两个方面

①. 信息传送双方的密钥建立

②. 双方利用密钥进行安全的信息交流

攻击者不能从截获的密文中解密出有效的消息,但是通信的双方能够通过加解密算法破解出完整且有效的消息(完整性和加密性)。

数字签名 Digital signatures

数字签名的本质是一种对应于物理对应物的数字对应物(有点绕)。现实世界中的文件签署都需要使用相同的签名作为认证,但是信息世界中的数字化使得签名可以被很简单的复制,所以数字签名需要保持变化,来防止攻击者窃取数字签名。通过将数字签名与相应文件的内容做对应,保证了双方的一致性,即使数字签名被窃取,那么在新的文件中,数字签名也是无效的。

匿名交流 anonymous communicattion

mix net :混合网络,如果Alice想要匿名联系Bob,标准的解决方法是使用混合网络。Alice发送的信息通过中间多个代理服务器,最后传递到Bob,但是Bob无从得知是谁发送的消息。这个网络具有双向性,Bob匿名向Alice交流时同理。

匿名数字现金 Anonymous digital cash

现实世界中,用户购买物品时,商家会聚焦于交易,并非用户的身份,但是如何在网络中实现匿名的支付?还有就是数字货币本身的可复制性,如何防止恶意用户的双花攻击?
同时解决这两个问题的方法

用户使用数字货币进行交易第一次保持匿名,一旦用户自己违规复制货币第二次交易的时候就会立即暴露。

协议 Protocols

问题


选举问题 :用户可以自由投票来选举支持的政党,但是希望统计票数的时候能够不记录个人的信息。
选举中心 :用户将加密后的投票结果发送给选举中心,中心统计后发送出获胜者的信息,但是对于各个用户的个人信息,用户的投票结果一概不知。(六方选举系统)
拍卖问题 :此处以victory auction标准拍卖流程举例(最高价者获得物品,但是实际支付的价格是第二高价)解决方法同选举问题,只不过拍卖中心需要放出胜者和第二高的价格。

Secure multi-play computation(多方安全计算) :多方参与者各自持有秘密输入,使用函数进行计算:
G o a l : c o m p u t e f ( x 1 , x 2 , x 3 , . . ) Goal:compute \quad f(x_{1},x_{2},x_{3},..) Goal:computef(x1,x2,x3,..)

但是公布函数的结果的时候,不能泄露个体的投票信息。

解决方式
引入可信第三方

引入一个可信的第三方来进行计票,但是必须确保绝对可信(非常不安全)。

定理

可以消除对于第三方计票的依赖,用户无需发送信息给第三方,只需要用户间使用特殊协议进行通信,通信完成后函数结构就会立刻返回给所有的用户,也不会泄露用户个人信息。

crypto magic

Privately outsourcing computation

❗对于复杂的计算还只停留在理论阶段,但是简单计算已经能够使用了!(可行性✔)

Alice向Google发送加密的信息,Google在密文基础上进行运算,将结果发送给Alice,然后Alice进行解密,获得计算后的results。
特点:Google进行了计算,但是不知道加密前的信息是什么。

Zero knowledge (proof of knowledge)

举例:N是由p与q两个质数相乘的结果,Alice手头有这个公式 N = p × q N=p×q N=p×q,Bob手上有N,**Bob本身连因数分解的概念都不知道。**但是Alice有方法可以在Bob什么都不知道的条件下向Bob证明N可以被因数分解,同时Bob也不知道N可以被分成p与q两个数的乘积。

密码学的历史

Symmetric Ciphers

流程:m是要加密的信息,k是加密的密钥 , c = E ( k , m ) c = E(k,m) c=E(k,m)这是加密后的密文c,传输到Bob之后,Bob用k与解密算法D来进行解密,获得原文m。
对称加密说的是双方使用的k是相同的。

Few Historic Examples

Substitution cipher

替换密码是使用特定的字母映射来对原有的密文进行替换。

并且使用的密文k是一种对称加密,k是不变的(k是对照表)。
Caesar Cipher

凯撒密码是一种特殊的替换密码,但是其实严格来讲他不是一种替换密码,因为它的加密方式是将每个字母替换为向右平移三个单位的结果:

它没有密钥。所谓的替换表是硬表,是固定的,而非随机生成的替换表,非常容易被破解。

描述26个字母替换表的密文需要多少空间?

替换映射本质是26个字母的排列组合,即26!

如何破解替换加密?

①. 统计英文字母中每个字母出现的频率。然后统计密文中字母出现的频率,进行对应。一般适用于前几个密文中字母的破解,因为有些字母出现的频率是基本一致的。

②. 统计英文单词中出现的字母组和频率,来定位密文中更多字母的替换情况。

以上破解方式称为 C T o n l y a t t a c k \red{CT \quad only \quad attack} CTonlyattack(唯密文破解
只是单纯的截获了密文,就能够对于密文进行破解

vigener chipher

维吉尼亚加密(相加取模26加密)

对于给定的密钥k,进行若干重复排列,直到长度与明文m对齐,然后对应位置相加然后取模26,将结果作为加密后的对应位置结果。接收方接收到了加密之后减去k的序列即可得到原文。
如何进行破解?

假设知道密钥k的长度(很重要)

破解流程:对于给定的密文c按照k的长度进行分组。对于每组中第一个字母而言,统计最常出现的字母,这个字母很可能就是E加密后得到的字母,反推就可以推出k中对应位置的字母。例如图中的H在c的每组中第一个字母出现的最多,那么H就有可能是E加密得到的,H-E = C,即k密钥中第一个字母为C,后续的位置以此类推。这样就能确定k的详细内容,从而用c-k来得到加密前信息m(也是唯密文破解)。

特别地,如果连密钥k长度都不知道,那么必须枚举长度试探了。

Rotor Machines

单转子机

key承载在一个物理的圆盘,加密前信息输入到key中,key对应给出一个加密后的信息(本质是一个替换表),但是里面的替换表会转动,例如输入三次C,输出的分别是T,S,K。这个机器形成的密文也可通过分析字母出现频率进行破解。

改进后的机器:

多个圆盘并且转速不同,进行强加密。

离散概率速成

描述一个系统的安全性使用的是语言是离散概率。

简单的定义:

U:完全空间,包括了所有的元素。
U = ( 0 , 1 ) n U=({0,1})^{n} U=(0,1)n:表示n个比特位的二进制序列。

P:对于U完全空间的中的所有元素都给予一个权重(0<=P<=1),并且所有的元素对应的权重相加的结果是1.

Uniform distrustion

均匀分布,空间中所有元素的概率相等。

Point distraction

点分布,只对于空间中一个元素进行概率赋值(1),对于其他元素的概率均为0。

分布向量:将每个元素的概率构成一个集合,成为分布向量。

Events

事件定义:事件属于U的子集,事件的概率是时间包含的所有独立元素 的概率和。

The union bound

事件概率相加时的联合边界问题 (通俗点就是概率加重了)
Random Variables

随机变量X本质是一个函数的取值。将U空间中的元素按照X的规则映射到V中的元素对应的取值。

X:将n位的二进制字符串,映射到{0,1}集合中,映射规则为,取二进制字符串最低位作为X的取值。


Randomized algorithms

确定算法 :给定的输入数据不变,算法运行的结果必然一致。
随机算法 :即使给定的输入数据不变,但是算法的运行结果可能会发生改变。

随机算法中伴随着输入信息还会有一个隐式的输入r,这个r会根据算法自身进行动态调整。使得对于相同的输入,输出的结果是一个取值范围。

Independence

AB两个时间发生的概率互不影响。
P r [ A a n d B ] = P r [ A ] × P r [ B ] Pr[AandB]=Pr[A]×Pr[B] Pr[AandB]=Pr[A]×Pr[B]


XOR(异或)

An important property of XOR

**内容:**对于一个 ( 0 , 1 ) n (0,1)^{n} (0,1)n空间上的随机变量(无论遵从什么分布 ),一个 ( 0 , 1 ) n (0,1)^{n} (0,1)n空间上的随机变量X(与Y相互独立并且遵从均匀分布 ),假设 Z = Y ⊕ X Z=Y⊕X Z=Y⊕X,那么Z将服从均匀分布。

证明如上图,本质就是将Y的两个事件取值假设出来,计算就可以了。

特别提醒 :这个定理证明了,即使一个变量本身是恶意分布,那么与一个均匀分布异或之后,得到的变量分布也是均匀的(安全性体现)。

The birthday paradox(生日悖论)

**内容:**对于n个独立同分布的随机变量(服从什么分布不重要),如果取样的数据数量>=样本空间中总数量的平方根,那么很有可能会取到两个相同的数据。

**生日悖论:**请问最少需要多少个人就有可能实现有两个人的生日相同?

此处的 1.2 1.2 1.2是经验修正系数,让结果更加准确。最后答案大约是24人。也就是说找到24个人就有可能实现有两个人的生日是同一天。被称为悖论的原因是24远远小于365天,比较反直觉。

样本空间元素数量为 1 0 6 10^{6} 106,取样元素相同的概率曲线图。1200次时概率就已经到了50%,符合预期。

信息安全论与一次性密码本

密码的定义:密码定义在三元组(K,M,C)之上

K:用于加密的密钥

M:原信息

C:加密后的密文

密码本身是一对"高效"的加密解密算法。

E:加密算法

D:解密算法

加密解密的过程: K × M → C K×M→C K×M→C, K × C → M K×C→M K×C→M
一致性方程:
∀ m ∈ M , k ∈ G : k ⋅ D ( k , E ( k , m ) ) = m \forall m \in M, k \in G: k \cdot D(k, E(k, m)) = m ∀m∈M,k∈G:k⋅D(k,E(k,m))=m

所有的密码都必须保证一致性

E是一个随机算法,意味着每次生成用于加密的比特位是随机的。D是解密算法,D是确定算法,给定特定的密文与解密算法,解密出的答案必然是一致的。

The One Time Pad(Vernam 1917)

一次性密码本,一种"安全"的密码。

特征:信息与密文都是n位二进制序列串( ( 0 , 1 ) n (0,1)^{n} (0,1)n),密钥K的长度与信息长度相同。

一次性密码本的加密原理就是将原信息与K逐位异或获得密文C。解密的时候C与K逐位异或,获得原文M。

如果只是知道原文M与密文C,能不能得到加密密钥K?

可以并且非常简单: K = M ⊕ C K = M⊕C K=M⊕C

一次性密码本加密很适合加密长度很长的信息,因为异或计算的快速性,所以一次性密码本加密又叫做超高速加密算法。但是这个方法只是理论上比较好用,实际上用处不大。

因为一次性密码本加密的时候需要传输一个与密文登场的密钥K,但是如果都有能力传输K了,还不如直接传输M,有点多此一举。

Information Theoretic Security(Shannon 1949)
完美保密性的定义

什么是好的密码?如何定义一个密码的安全性?如何确定一个密码的好坏?

基础思想:

一个好的密码应当是以下这种情况:单单接收到了密文之后,不能获得关于原文的任何信息。

定义(香农):
∀ m 0 , m 1 ∈ M , ( ln ⁡ ( m 0 ) = ln ⁡ ( m 1 ) ) ∧ ∀ c ∈ C \forall m_{0}, m_{1} \in M,( \ln ( m _ { 0 } ) = \ln ( m _ { 1 } ) ) \land \forall c \in \mathbb{C} ∀m0,m1∈M,(ln(m0)=ln(m1))∧∀c∈C

在密文中间M中, m 0 m_{0} m0与 m 1 m_{1} m1等长,且生成的密文c属于密文空间 C \mathbb{C} C。
P r [ E ( k , m 0 ) = c ] = P r [ E ( k , m 1 ) = c ] \mathrm{Pr}[E(k, m_0) = c] = \mathrm{Pr}[E(k, m_1) = c] Pr[E(k,m0)=c]=Pr[E(k,m1)=c]
m 0 m_{0} m0与 m 1 m_{1} m1都使用k加密后结果为c的概率相同,即密文空间是均匀的。
where k is uniform in K ( k ← R K ) \text{where } k \text{ is uniform in } \mathbb{K} (\ k\xleftarrow[]{R}K) where k is uniform in K( kR K)

安全性保证:

attacker截获了一段密文之后,他无法具体判断密文是来自哪个明文的加密结果,因为所有明文加密成这个密文的概率是相同的。

密文不会提供任何关于明文的信息。

无论攻击者多么高明都无法从密文中获取信息。

不存在唯密文攻击。

一次性密码本加密方法的完美保密性证明


Bad News

香农证明了一次性密码本加密具有完美密码性之后,也证明了如果一个加密算法具有完美密码性,那么它的密钥k长度 >= 明文m 长度。

一次性密码本加密中 密钥k长度 = 明文m长度,这个算法是取等号条件下最优的加密算法。

Stream ciphers

前情回顾:

流密码思想 :不使用完全随机的密钥,而是使用伪随机的密钥进行加密。

假定有一个伪随机数生成器,将原始的短密钥k使用伪随机数生成器扩充与m等长 ,然后进行与之前一次性密码本加密相同的操作去加密解密即可。

这种加密方法不安全,密钥长度远远小于原文长度。

PRG must be unpredictable

PRG的不可预测性是非常重要的。

如何认为一段扩充后的密文是不安全的?如果通过密文的一部分可以推理出剩余部分的信息,就说明这个扩充的密文是不安全的。

predictable

存在一种高效的算法并且存在一个位置 1 < = i < = n − 1 1<=i<=n-1 1<=i<=n−1
P r [ A ( G ( k ) ) ∣ 1 , . . . , i = G ( k ) ∣ i + 1 ] ≥ 1 2 + ε ( n o n − n e g l ) Pr \left[ A(G(k))\vert_{1,...,i} = G(k)\vert_{i+1} \right] \geq \frac{1}{2} + \varepsilon(non-negl) Pr[A(G(k))∣1,...,i=G(k)∣i+1]≥21+ε(non−negl)

上式说明的是,从扩充的密文中存在一个位置i,对于i之后的位置预测的概率 >= 1 2 + ε \frac{1}{2} + \varepsilon 21+ε,并且 ε \varepsilon ε无法忽略,就说明这个PRG是可以预测的。
unpredictable

**不可预测性:**对于所有的位置i,都无法根据i处的信息去预测i+1位置的信息,就说明具有不可预测性。

Weak PRGs (do not use for crypto)

绝对不应该被使用的PRG(可预测性太高)

线性同余生成器:

python 复制代码
r[i] ← (a·r[i-1] + b) mod p  # 线性同余递推公式
output Few bits of r[i]       # 输出部分低位比特
i++                           # 计数器自增

很容易就会被预测。

negligible and non-negligible

流密码与一次性密码本加密的攻击方法

Attack 1:two time pad is insecure

一次性密码本加密之所以叫做一次性,就是因为加密的时候只能是一个密码本加密一条信息 。如果使用同一个密码本加密了多条信息,那么整个加密的安全性就会荡然无存。

上述加密后的密文 C 1 C_{1} C1与 C 2 C_{2} C2,两者异或的结果等于 m 1 m_{1} m1与 m 2 m_{2} m2异或。但是英文有着足够的冗余性,并且英文在系统是以ASCII码的形式记录的,所以知道了 m 1 ⊕ m 2 m_{1}⊕m_{2} m1⊕m2的结果,就能分别还原出 m 1 m_{1} m1与 m 2 m_{2} m2,非常不安全。

Real world examples

Project Venona

苏联使用一次性密码本用来加密,但是苏联制作密码本的时候使用的是人工扔骰子的方法,非常费时,所以为了节约时间就用同一个密码本加密了多条信息,之后就被美军截获,然后轻易破解。
MS---PPTP(windows NT)

客户端与服务端交互的时候,是客户端发送信息,服务端相应,循环往复。但是PPTP传输协议,将双方交流方式看作一个流,输入方输入的时候将所有的m组成一个流,然后进行加密,到了输出端将密文进行解密,其实就是使用了同一个密钥加密了多条信息。所以正确的做法应当是有一对密钥,K1作为用户端到服务器端的加密密钥,K2作为服务器端到用户端的密钥。
802.11b WEP

通俗来讲就是Wifi数据传输的时候,加密的时候生成的拓展密钥是帧变化的(每帧生成的密钥都改变),但是生成的拓展密钥是伪随机的,也就是说一段时间之后加密的密钥又与之前使用的某个密钥相同了(循环),于是发生了使用一次性密码加密多条信息的不安全情况。

A better construction

解决方式的本质就是让随机生成的密钥k不再发生重复。

Yet another example:disk encryption

本质是磁盘不适合使用一次性密码本进行加密。

**磁盘加密中的安全漏洞:**对于一份协议Bob签署之后,生成对应的加密信息。Eve同样签署之后,生成的密文与Bob生成的密文来讲除了表示名字的密文修改了,其他位置的密文都没有改变。所以攻击者虽然无法获得原文信息,但是可以轻而易举的定位到原文信息改变的位置。最理想的情况应当是只要有一部分更改,生成的密文就要完全进行更改。

Attack 2:no integrity

完整性攻击:完整性差的密文是可以被修改的。

m m m与 k k k异或加密之后,使用一个扰动值 p p p与 m k mk mk异或的结果作异或运算,之后使用 k k k解密,解密出的结果就是 m ⊕ p m⊕p m⊕p,对于密文进行操作,会精准地影响到解密后原文的内容。

这种攻击主要是用于密文伪造

❗一次性密码本加密没有完备性。

现实中的流密码算法

RC4(sofeware)


缺点

①. 加密输出偏差,RC4加密的前256个字节的加密都会有偏差,所以建议257在使用。

②. ( 0 , 0 ) (0,0) (0,0)序列出现的概率偏高

③. 可以使用上节的关联密钥攻击。

CSS(hardware)

设计出能够在硬件层面实现的加密方法。

CSS基于线性反馈移位寄存器(LFSR)机制。
LFSR

linear feedback shift register(LFSR)

对于一个寄存器,选取特定的位置作为抽头 ,将几个抽头处的结果进行异或,保存异或值,然后寄存器向右位移,最右侧的数据丢弃,刚才的异或值补充在最左侧。

DVD、蓝牙中的CSS都已经能够被破解了。

eStream

对于之前的PRG额外增加一个临时值一起计算得到新的随机数。这个临时值从不重,那么每次PRG生成的随机数就不会重复,自然加密结果是从不重复的。

Salsa 20(software and hardware)

Salsa非常安全,并且具有不可预测性。

各种流密码的速率

相关推荐
Turbo正则2 天前
量子计算基础概念以及八大分支
密码学·量子计算
网安INF12 天前
公钥加密与签名算法计算详解(含计算题例子)
网络·算法·网络安全·密码学
电院工程师13 天前
基于机器学习的侧信道分析(MLSCA)Python实现(带测试)
人工智能·python·嵌入式硬件·安全·机器学习·密码学
电院工程师15 天前
SM3算法C语言实现(无第三方库,带测试)
c语言·算法·安全·密码学
小七mod16 天前
【BTC】密码学原理
web3·区块链·密码学·比特币·btc·肖臻·北大区块链
电院工程师21 天前
轻量级密码算法PRESENT的C语言实现(无第三方库)
c语言·算法·安全·密码学
电院工程师22 天前
轻量级密码算法CHAM的python实现
python·嵌入式硬件·算法·安全·密码学
电院工程师22 天前
SM3算法Python实现(无第三方库)
开发语言·python·算法·安全·密码学
网安INF23 天前
SHA-1算法详解:原理、特点与应用
java·算法·密码学