凯撒加密, Vigenere 密码 和 一次一密加密方式(Decipher Classic Cryptography)

1. Classic Cryptography

1.1 Private-key Encryption 私有钥匙加密

1.11 应用场景

  • 秘密通讯
    在这里插入图片描述
  • 秘密存储
    在这里插入图片描述

1.12 方法介绍 Three algorithms

a. Gen - Key Generation algorithm (Generate key)
b. Enc - Encryption algorithm (take key and message m ∈ M as inputs and output ciphertext)
c. Dec - Decryption algorithm (take k and ciphertext as input and output the m or error)

For m ∈ M and k output by GEN
DECk(ENCK(M))=m

1.2 The shift cipher 移位暗文

1.21 Caesor cipher - 凯撒加密

加密英文文字
Generate Key: Associate a with 0; b with 1; …; z with 25 𝑘 ∈ {0, … , 25}
Enc: 把明文的每一个字母都向右shift k 位
在这里插入图片描述
Dec: Reverse the cipher (cipher - 密文, plaintext - 明文)
明文:XYZABCDEFGHIJKLMNOPQRSTUVW 懂的人看到的
暗文:ABCDEFGHIJKLMNOPQRSTUVWXYZ unauthorized parity

1.22 Modular arithmetic - 模运算

[x mod N] 和 x (mod N) 是不同的
例如 ? = [1 mod 13] ? = 1
然而 ? = 1 (mod 13) =14 这里 ? 其实 是和 1 除以13 得到相同余数(都是1) 的数
然后这里选择用 N 可以 整除 ? - x的 ?值
然后我们把模运算和凯撒密码结合
在这里插入图片描述
这个相当于把平移位数从k 上升到了 26+k 因为k 除 26的余数是 k, 其实实质上变成了左移k
就是改变了平移方向. 这样的话向右试k是没有意义的

1.23 shift cipher 是否安全

不安全

  1. 只有26种秘钥的可能性并且是线性的这意味着破译者只需要对所有暗文执行相同方式
  2. 可以猜所有的k值因为当明文足够长的时候只有解密方式是能解出来有意义的

之前的shift cipher最大的弊端在于线性映射不论你的映射方法多么高级我只需要对应一位执行那个对的方式就能破译掉 其实 对于 前一种来说它不是一维的双方不仅要知道秘钥还要知道加密方式这与我们之前一节讲的open design 有冲突 - 不能依靠别人不知道你的安全系统来保持加密这里就意味着不能隐藏你的加密算法只能隐藏秘钥.
同时这里也暴露出了秘钥空间过小的问题由此引入我们下面的两个设计原则

1.3 Kerckhoffs’s (科克霍夫假设)w principle 不能隐藏加密模式

这个原则说不能隐藏加密模式而只能保密秘钥

  • 秘钥必须是随机选择的并且是保密的
  • 保存秘钥比保存算法更容易
  • 改变秘钥比改变算法要简单
  • 标准化更容易实施 - 想想如果大家都有自己独特的算法还怎么普及哇
    更容易部署 (ease of deployment)
    公众验证(Public validation)

这里给我们留下的问题是怎样在公布加密模式的情况下升级破译难度

1.4 Sufficient key space principle 秘钥空间要足够大

  • 秘钥空间要足够大到防止暴力的详尽搜索攻击
  • 如果一种算法或者秘钥生成算法的秘钥空间太小就会受到蛮力破解威胁

这里给我们的启示是秘钥空间必须要是指数级别的

1. 5 The Vigenere cipher

基于上面两条原则 我们所要做的是怎么在公布密码模式的前提下提升破译难度, 现在能做的就是把线性的转化为非线性的-不是通过加密模式而是通过秘钥和加密模式的配合

这里采用了将秘钥和移动相结合的方式, 秘钥变成了字符串而不再是单个的字符, 通过将明文按照对应秘钥的字符移动相应的位数得到暗文这样不仅是一个非线性操作 秘钥量很大
这样就对应了上面的两个原则 , 下面详细说一下是怎么回事哈:
在这里插入图片描述
在这里插入图片描述
第一个字母t为什么变成了v呢 是因为c代表移动2位(c对应的字母位置-1)
这样通过对照秘钥和明文得到了暗文同理反推出明文 事实上根据上边的密码表很容易加解密

注意上两幅图的加密过程略有不同, 一个是右移一个是左移下面的那个:
在这里插入图片描述
多了个 kn mod 26 其实就是向左移, 而第一张图是没有这一步的是右移

秘钥空间=26k k 是 秘钥的长度 这已将约等于 266 基本不可能蛮力破译 更别说k不一定
然后他又是非线性的意味着你必须找到秘钥才能把暗文整体翻译下来. 因为位移是不定的哈

那么 Vigenere cipher 安全么 - 在很多年间一直被认为是无比安全的 明天再接着写破译.

1.6 Vigenere cipher 或是传统密码学的失败

破译Vigenere cipher 需要三部

1.61 从非线性解密降维成线性解密

我们先看看这个和凯撒加密的区别在于什么, 在于移位量不是一样的了, 但是真的是这样么?
如果我们知道了秘钥长度那么是不是没隔一个秘钥长度对应位置的暗文被位移了相同的量.
在这里插入图片描述
从上图可以看出当秘钥长度为14的时候, vudkoi其实是经历了相同的位移量得来的.
这样一来我们在有了秘钥长度后就有了一组组的标准凯撒密码解密就在即了.

1.62 解密凯撒密码的关键频率对比(非暴力法)

在这里插入图片描述
上面是英文文本中每个字母出现的频率, 那么对于一组卡撒密码 我们可以对照频率找出明文,
比如说在这一段凯撒暗文中a是频率最高的那么就可以假设暗文a对应了明文e, 有了这条线索, 我们就得到了位移量(卡撒密码中的关键因素), 又因为是卡撒密码我们直接对其余的所有暗文进行相同操作就好了, 同时可以对比每个字母出现的频率找出几率最大是明文对应的进行操作,
所以凯撒密码不用暴力法也是很好破解的(文本足够多, 如果就一句话哪有频率可言)

从这里我们可以看出当维吉尼亚密码退化成一组组的凯撒密码破解就没什么难度了.

1.63 破解秘钥长度 (破解维吉尼亚密码的关键)

那么怎么破解秘钥长度呢, 没有秘钥长度我们就根本无法进行破译.

1. kasisiki 测试法

在英文中,一些常见的单词如the有几率被密钥的相同部分加密,即原文中的the可能在密文中呈现为相同的三个字母。这是因为他们出现的概率较高很有可能被相同部分加密成相同的暗文, 那么这个时候秘钥的长度一定是两个重复相同词的距离的因数.
ksisika解秘钥长度 python

2. Friedman 测试法 ( index of coincidence )

重合指数表示两个随机选出的字母是相同的的概率,即随机选出两个A的概率+随机选出两个B的概率+随机选出两个C的概率+……+随机选出两个Z的概率。

对英语而言,根据上述的频率表,我们可以计算出英语文本的重合指数为

P(A)2 + P(B)2+……+P(Z)2 = 0.65

利用重合指数推测密钥长度的原理在于,对于一个由凯撒密码加密的序列,由于所有字母的位移程度相同,所以密文的重合指数应等于原文语言的重合指数。

对于一个给定暗文:
ABCDEABCDEABCDEABC
先尝试key为1的时候的重合指数:

首先测试密钥长度=1:
对密文ABCDEABCDEABCDEABC统计每个字符出现的次数:
A: 4 B: 4 C: 4 D:3 E:3
那么对于该序列的重合指数就为:(4/18)2 + (4/18)2 + (4/18)2 +(3/18)2 +(3/18)2 != 0.65

接下来再试 key 长度为2:
将密文ABCDEABCDEABCDEABC分解为两组:
组1:A C E B D A C E B
组2:B D A C E B D A C
我们知道如果密钥长度真的是2,那么组1,组2都是一个凯撒密码.对组1组2分别计算重合指数
如果组1的重合指数接近0.65,组2的重合指数也接近0.65,那么基本可以断定密钥长度为2。

2. 现代密码学原则

  1. Formal definitions: 精准的数学模型以及安全的定义
    –Threat model: 现实生活中攻击者被假设拥有的能力
    –安全保证或者安全目标: 我们要组织攻击者做什么事情
  2. Assumptions: 现代密码学几乎没有例外的需要计算性假设
    – 这种假设应该是明确定义的 no ambiguous
  3. Proofs of security: 安全性的证明
    – 跳出 设计 - 突破 - 补丁 这一流程
    – 提供严格的证明, 证明在特定的安全定义和假设下是没有问题的
    – 安全性的证明在如今的密码学中至关重要

3. 完美的秘密 - Perfect Secrecy

3.1 现代密码学4中强度不同的攻击方式

在这里插入图片描述

注意在下面的所有攻击方式中均有已知加密模式

  • open design
  • Kerckhoffs’s principle

3.11 唯密文攻击 Ciphertext-only attack

攻击者的能力:
只知道密文也就是上述的 c1, c2 ,c3 不知道以外的其他信息
攻击者的目的: 按照破译成功度排序

  • 取得原始明文中的部分资讯。
  • 取得原始明文。
  • 得知解密用的钥匙。

穷举法是Ciphertext-only attack的常用方法

3.12 已知明文攻击 Plaintext-known attack

攻击者的能力:
知道了某些明文-密文对, 也就是攻击者掌握了 {(p1,c1), (p2,c2),(p3,c3)}的子集
拿维吉尼亚密码举例, 攻击者很有可能知道了

  1. I love you 对应了 adadadw
  2. 知道加密方式 - 用key的每个字母当做特定的偏移量

很有可能是攻击者通过某种其它途径得知了明文 那么他可以利用相应的关系来破译, 如果是凯撒密码到这一步已经结束了, 但是对于维吉尼亚密码来说由于偏移量升维了知道一段是不够的, 还需要知道这对应了key的那一部分(因为攻击者现在可以推出秘钥的一部分).
注意:
已知明文攻击相对于唯密文攻击 多知道了一点对应信息(往往和key有关)
已知明文攻击相对于选择明文攻击 只知道特定的明文-密文对 而无法构造特定的明文 - 密文

希尔密码用唯密文攻击很难识破但是已知明文攻击相对容易破解

3.13 选择明文攻击 Chosen-plaintext attack

攻击者的能力:
相比之上只能被动地获取明文-密文对, 这里攻击者有了加密机(没有机密机的权限)的权限可以构造随意构造对
攻击者的目的:
通过用明文构造密文的方式来获得加密算法的一些信息, 并企图在未来更有效的破解该算法以及相关秘钥加密的其他明文信息. 在最坏的情况下攻击者可以直接获得解密秘钥.

这里要解释下为什么这个加密算法没有公布, 其实公布只是为了普及以大规模实用, 那如果一个盒子封装好了所有相关算法那我需要告诉大众的就只是用这个盒子就行, 而没有必要公布盒子里面的内容了, 其实上面公布给大众的也就是使用方法, 当有了相应的封装使用方法也就更简洁更便于加强破译的难度.

在这里具体给个例子就是说攻击者现在可以 通过尝试的办法来获取密文中的内容, 比如我大概知道地方的通讯中AF是个地名, 那我就去用加密机加密所有地名看它说的到底是哪个, 这其实也是二战中美军破获日军密文的一次成功案例:
中途岛海战,一次成功的选择明文攻击——美军故意透露出假情报(明文)来诱使日军(密文),从而得知“AF”指的是中途岛而非阿留申群岛. 这里可以把日军想象成那个加密机, 美军给了明文, 这个加密机给出了对应的密文, 美军利用这选择明文攻击获得了自己想要的信息.

其实这里还有另一个令人疑惑的地方, 攻击者怎么可以选择明文并让加密机加密呢?
因为在公共密钥学中 公共秘钥是公开的, 那么攻击者就可以选择明文得到密文了.

注意这个和选择密文攻击的区别在于 这个只有加密机的权限而没有解密的权限信息较少.

3.14 选择密文攻击 Chosen-ciphertext attack

攻击者的能力: 攻击者的能力又提高了, 不仅有了加密机的访问权限还有解密的访问权限, 这就意味着攻击者不仅能选择明文得到暗文, 还能够选择暗文得到明文, 这样有了双重的信息更好去破解加密解密机制.
这里信息已经被破解了但是加密机制还没被破解 对应的现实情境就是, 解密机被敌人拿走了, 但是敌人不知道加解密的工作原理只是会用而已, 但是有了相应信息他很有可能破解.

3.2 Perfect Secrecy 完美的秘密

先来看下完美秘密的定义吧

不规范的来说:
观察密文不应该改变攻击者对明文分布了解的情况, 或者说是不泄露任何明文相关的信息
规范的来说:
Pr[𝑀 = 𝑚|𝐶 = 𝑐] = Pr[𝑀 = 𝑚] ->已知了密文的情况下,得到明文的概率”和“在不知道密文的情况下,得到明文的概率”是相等的

举例来说, 考虑下偏移密文:
在这里插入图片描述
上面这段的意思是在不知道暗文的情况下明文是one和ten的可能性各1/2, 然而在知道了暗文后呢, 暗文rqh 要么对应了 ten 那么 Pr[M=‘ten’|C=‘rqh’]就等于1 要么 rqh对应了one 那么上述表达式的结果就是0, 不论怎么样都改变了原来攻击者对明文分布的了解. 举个实际点的例子就是本来攻击者猜到AF是洛杉矶的可能性是1/2 因为就洛杉矶和纽约两个选择, 但是当你这个密文出现以后根据密文和明文的对应关系就能直接锁定一种答案就改变了分布, 因此其实这里要求明文和密文是完全独立的.

上面的举例告诉我们shift cipher是不可靠的不是完全秘密的, 那么该怎么构建完全秘密的呢:

3.3 The one-time pad - 一次一密

知乎经典回答-什么是一次一密
具体的流程大概是什么样子的呢:

  1. 和之前大家共享一个秘钥不同 这次我们来一个密码本, 每一页是一个独一无二的随机二进制表秘钥用完一页撕掉一页-一次一密
  2. 对明文进行ASCII或者Unicode编码
  3. 对编码后的明文与密码本上当前一页(发送接收双发必须在同一页)的秘钥进行异或操作
  4. 将密码传给接收方 并把当前一页秘钥作废
  5. 接收方收到密文用当前一页秘钥进行异或解码(异或的可逆性) 并且作废当前秘钥页

这里面用到的经典的知识点:

  1. k XOR m1 = c1 ------------ k XOR c1 = m1
  2. 一个密文位置是0明文既可能是0有可能是1 同理当时1的时候明文可能是0也可能是1
    完全取决于秘钥才能得到明文, 所以说看密文就像在看那个随机生成的密码本一样完全
    无法改变攻击者对明文分布的认识, 所以在每次撕掉当前密码页的情况下是完全保密的

那么每次都要撕掉好麻烦, 我如果不撕掉还是完全保密的么?
我们来看一下:
第一次 -> c1=k XOR m1
第二次 -> c2=k XOR m2
那么根据这两个密文我们能得到关于原来明文的信息么?
c1 XOR c2 = m1 XOR m2 好了完蛋了泄露了原文的相关信息不是完全保密的了.

那么为什么我们在实际的工作生活中不这么用一次一密呢?

  1. 密钥太长------秘钥和信息是一样长的
  2. 密钥不能重复使用---------一个秘钥只能使用一次加密一次信息
  3. 密钥的配送--------秘钥和信息是等长的, 那如果能机密的配送秘钥为什么不能机密的配送信息呢?
  4. 密钥的保存--------如果你能够安全的保存密钥为什么不能安全的保存明文
    这一条实际上是我们以前讲过的加密的另一种用途保存信息.
    相对与shift cipher 和 维吉尼亚密文来说 一次一密加密机制是好的密文符合完美保密性但是却不可实践因为它的秘钥长度和信息长度一样长. 实际上对于任何符合完美加密的密文,
    一定有 秘钥的长度不小于铭文的长度.

4. 计算保密 Computational Secrecy

4.1 计算安全的定义

加密模式可行如果只有很小的概率信息被有有限计算资源的窃听者获取.
这里放宽了完美保密:

  1. 允许安全机制有很小的可能性被攻破
  2. 只考虑高效的攻击者

这里我们来看一下上面说的tiny possibility 指的是多小: 2-60 大概是发送方和接收方同时被闪电劈中的概率, 大概每100万年发生一次

这里我们再看下有限的计算资源的定义: 如果用暴力法去破解秘钥 每个时钟信号能获得一个值
• Desktop computer ≈ 257 keys/year
• Supercomputer ≈ 280 keys/year
• Supercomputer since Big Bang ≈ 2112 keys
‒ Restricting attention to attackers who can try 2112 keys is reasonable…
• Modern key space: 2128 keys or more…

4.2 Encrytion and Plaintext Length 加密和明文长度

  1. 我们想要一种能够加密任何长度明文的加密模式
  2. 明文长度通常是可以被公布出去的
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值