你所能搜到的最全对称加密术讲解 - Symmetric Cryptography

Symmetric Cryptography

1. Symmetric Cryptography 的定义

对称加密术是定义在 Key-Space, Message - Space (或者plaintext - space) 以及 密文空间之上的一组高效算法 (E, D) E is entryption algorithm D is detryption algorithm.
E 是 一个 从 K-Space 和 M - Space 到 C - Space 的方程
D 是一个 从 K - Space 和 C - Space 到 M - Space 的方程
在这里插入图片描述
对称加密术其实就是加密秘钥和解密密钥是相同的加密方法

我们来拿 上节学的 one time pad 来对应下对称加密术的定义:
先来看看 K M C 分别是什么吧:
M = C = K {0,1}n
明文 密文 以及秘钥 都是长度为 n 的 随机比特串 (random bit string)
那么 E, D 分别是什么呢:
E(k,m)=k XOR m
D(k,m)=k XOR c

这里OTP 是不可实践的因为秘钥的长度等于信息的长度! 那下面就引入了流密文

2. Stream Cipher - 流密文 - 对称加密术 1

流密文让OTP变得可实践了(practical). 我们也知道变得可用的关键是秘钥长度.

2.1 Strean Cipher 的定义

因此流密文的主要思想是让随机秘钥变成伪随机秘钥!
Idea: replace “random” key by “pseudorandom” key
上面的pseudorandom 是一个function:
在这里插入图片描述
将长度为s的随机比特串映射为长度为n的为随机比特串

  • {0,1}S 为seed space 也就是种子空间
  • n>>s
  • G 就是伪随机数方程

2.2 Stream Cipher 让 OTP 变得可实践了

那么practical 的 one time pad 是什么样的呢 entrytion 和 detrytion 方程有什么改变呢
改变就是 E(k,m)=G(k) XOR M D(k,m)=G(k) XOR C
在这里插入图片描述
那么采用了流密文的OTP还是完美保密的么? 记得我们前面说的么 -> 不论任何密文想要实现完全保密key的长度一定不能小于明文的长度很明显这里不满足哦所以不是!

2.3 现实中的流密文: Realworld stream cipher->RC4

2.31 背景介绍

RC4是stream cipher的一个老列子了, 现在已经不再使用了! 曾是被最广泛使用的流密文, RC4(Rivest Cipher 4) 被广泛应用于https, WEP(第一个wifi加密标准). 但是RC4对于大多数应用来说还不够安全因此被Microsoft Edge 和 Internet Explorer 11给禁止了.

2.32 实现原理

  1. 创造密钥流
    创造密钥流的过程应该是不可侦测的
    创造密钥流其实包括了:
    1.1 Key Sheduling Algorithm - KSA 秘钥调度算法或者是秘钥初始化算法
    1.2 Pesudorandom Generation Algorithm - PRGA 伪随机算子生成算法
    1.2 其实也可以是Key Stream Generation Algorithm 密钥流生成算法
  2. 加密: 将明文的每一位与密钥流的每一位进行异或
  3. 解密: 将密文的每一位与密钥流的每一位进行异或
  4. 更改密钥流 注意是更改密钥流而不是更改秘钥 重新调用PRGA而已

KSA -> Initial State S -> PRGA/KGA -> Keystream -> Entrytion or DEtrytion.

上面的加密和解密算法是完全一致的, 加密解密秘钥也完全一致因此叫对称加密术.
下面从代码角度看一下这个破东西
KSA: 搅乱一个有256个元素并且元素值从0-255的数组
1.1 首先创建一个256位从0-255的有序数组
1.2 将key重复扩充至256位长的重复性数组
1.3 用上述获得的用seed key获得的数组搅乱第一个由于数组使其看似随机

代码上的体现:

void rc4_init(unsigned char*s,unsigned char*key, unsigned long Len)
{
    int i=0,j=0;
    //char k[256]={0};
    unsigned char k[256]={0};
    unsigned char tmp=0;
    for(i=0;i<256;i++) {
        s[i]=i;                 上述的1.1
        k[i]=key[i%Len];        上述的1.2 这里i%Len就是在重复的给k赋值key
    }
    for(i=0;i<256;i++) {
        j=(j+s[i]+k[i])%256;    这里在给j赋值j是将要吧该元素换到的位置j<256
        tmp=s[i];
        printf("copy for dongdeng");
        s[i]=s[j];//交换s[i]和s[j] 
        s[j]=tmp;               这里在交换两个index对应的值把水搅浑
    }
}

Python 版本
在这里插入图片描述
PRGA: 用搅浑了的状态S, 生成和明文长度一样的密钥流

void rc4_crypt(unsigned char*s,unsigned char*Data,unsigned long Len)
{
    int i=0,j=0,t=0;
    unsigned long k=0;
    unsigned char tmp;
    for(k=0;k<Len;k++)                   这里的Len 是明文的长度
    {
        i=(i+1)%256;
        j=(j+s[i])%256;                  又在随机的选位置
        tmp=s[i];
        s[i]=s[j];                       交换当前位置和随机选好位置的值
        s[j]=tmp;
        t=(s[i]+s[j])%256;               获取准备从状态流准取出的秘钥位的位置
        KS[k]=s[t]                       Keysteam中的第k位得到了                                        
    }
}

Python版本
在这里插入图片描述
之后就是用KS和相应的明文进行加密了(这一不可以卸载上面的最后一步解密也是)

2.33 RG4 的 特点

  1. 运行速度快 效率高: 比DES (Data Encryption Standard - 一种典型的块密码) 快10倍
  2. 安全上有一些不足:
    2.1 初始的密钥流不够随机: 可以扔掉前100个秘钥位来修复这个问题
    2.2 秘钥的重复使用也是RG4的一个大问题

3. Block Cipher - 块密码 - 对称加密术 2

3.1 Block Cipher 的介绍

  • Block Cipher 是非常常见的加密算法, 比如DES 和 AES 都是美国政府核定的标准加密算法, 从电子邮件加密到银行交易转账应用十分普遍.
  • 是对称加密的一种典型实例, 因此它的加密解密所用的秘钥是同一个, 这也是对称加密的定义.
  • 流密码是对一串明文一位一位加密得到密文, 然而块密码是对一个特定长的快进行加密 最后得到整体密文

3.2 Block Cipher的工作原理

  1. 将一个整数据块分成一个个特定长度的块, 如果最后一个块的长度不够, 就用特定的算法将它补齐, 比如说增加一个标志位剩下的位数全部补零.
  2. 对每一个整块的数据运行加密算法, 这个加密算法本质上就是一种映射算法 -> 将已有的块映射到一个新的块, 如果一个块的长度是64bit 那么就存在264 种映射关系, 具体采用哪一种映射关系取决于你的key值. DES才用的是64 bit 但是由于可被暴力攻破现在被Advanced Encryption Standard 所取代, 这几种典型应用下面会介绍.
  3. 加密解密过程和流密码很像唯一不同的就是一位一位处理 -> 整块处理但是注意流密文是块密码的10倍快
    在这里插入图片描述

3.3 Block Cipher的应用

  1. DES: DES 的块是64bit的 但是秘钥是56bit的 后来发现不安全已被其他的加密方式取代
    • Well known symmetric cipher
    • Developed in 1977, still much used
    • Shouldn’t be, for anything serious
    • Block encryption, using substitutions, permutations, table lookups
    ----- With multiple rounds
    ----- Each round is repeated application of operations
    • Only serious problem based on short key
  2. AES: 专门用来取代DES的, 块是128bit的 秘钥可以使128bit, 192bit 和 256 bit.
    • A relatively new cryptographic algorithm
    • Intended to be the replacement for DES
    • Chosen by NIST 美国国家标准技术研究所
    -----Through an open competition 通过公开竞争获胜的
    • Chosen cipher was originally called Rijndael
    ----- Developed by Dutch researchers 被荷兰的研究者研发的
    • Uses combination of permutation and substitution 采用置换和替换相结合的形式
    ----- RC5: 就是上面RC4的进化版采用了块密码可能是因为它的流密码因为安全性被淘汰了

3.4 Block Cipher的优缺点

Advantage:

  • Good diffusion: 更容易使一组加密的字符依赖于彼此
  • Immunity to insertions: 被加密的数据以已知的长度到达
  • 很多常见的网络加密术使用块密码完成的

Disadvantage:

  • slower: 再加解密之前需要等待每一个块到达
  • Worse error propagation: 错误会影响整个块

3.5 目前最流行的块密码AES

3.51 Increased popularity of AES

• Gradually replacing DES
----- As was intended
• Various RFCs describe using AES in IPsec (Internet Protocol Security) 网际协议安全
• FreeS/WAN IPsec (for Linux) includes AES (Wide Area Network) 广域网
• Some commercial VPNs use AES (Virtual Private Network) 虚拟私人网络
• Used in modern Windows systems
----- Also recent versions of Mac OS

3.52 AES加密流程 - 史上最详细 (SPN 网络详解)

AES 从明文到密文的加密过程是通过 Substitution–permutation network (SPN) 得到的
在这里插入图片描述
上图中包含了两个算法模块:

  1. Four building block: 用来用round key加密 改round的块中的内容的
    ----- AddRoundKey
    ----- SubBytes
    ----- ShiftRound
    ----- MixColumns
  2. Key Sheduling Algorithm: 用来讲key生成每一轮的round key
3.521 AEC的核心加密模块
1. AddRoundKey: 把roundKey和中间状态进行异或
  1. 先来说下什么是roundKey, roundKey就是用最原始的key为当前轮的状态(block中的内容)产生的加密秘钥, 其值是根据本身的秘钥以及前几轮的所有秘钥根据相应的流程得出的, 具体的相关方法后面会详细讲解.
  2. 再来说说什么是中间状态, 状态其实就是当前的块也被叫做状态, 但是每一轮后块的值都会发生变化, 起始的块叫做起始状态, 进入算法后的块都叫做中间状态. 下面就是一个中间状态或者初始状态.

在这里插入图片描述

在AES中一个块是128bit的也就是16Byte的二维数组(4行4列) 每一个位置上有1个字节的数据也就是8bit 也就是两个16进制数字也就是说每一个位置上是一个两位的16进制数一个块总共有16个2位的16进制数
好了接下来看看流程
在这里插入图片描述
这就是这一步干的事情 把中间状态和用key产生的128bit的round key 的对应位进行异或获得第一步的输出.

2. SubBytes 字节替换

把上面的到的结果中的每一位根据S-box替换成对应的其它位
在这里插入图片描述
有没有看到x和y都是16进制的, 那么根据我的猜测它是根据每个位置的数值把它替换成对应的数值, 因为每个数值刚好是两个16进制数, 不然的话想要用到s16,16需要有256个Byte也就是2048bits AES中跟本没有这么大的块

3. ShiftRows 行位移变换

把每一行的元素向前移动所在行的数字个位置
在这里插入图片描述
这一步每一列都包含了所有行的信息

4. MixColumn 通过矩阵相乘把一列的每个元素混合在一起

在这里插入图片描述
这一步每一个元素都包含了它所在列的所有元素信息 比如 S00 = 02S00+01S10+01S20+03S30

3.522 Key Sheduling Function 用来产生round key

在这里插入图片描述

1. K0 的产生

首先用初始的key 把每一列当成一个word这样就有4个word的K0了 (K0 就是初始的key)
在这里插入图片描述

2. 其它round key的产生

第二步用这个K0区产生下一个 round key.
在这里插入图片描述
Kn也是由4个word组成的其中每个word都是用上一轮key和前一位的word进行异或得到的. 这里W4 是最为特殊的因为它的前一位是上一位的W3和剩下的word都不同, 它是由W0和处理后的W3异或得到的, 总的来说就是每一位新的word都是由上一轮对应位置的word和该word前面一个word异或得到的.

3. 末尾word处理算法g

下面来看下Key Scheduling Function的点睛模块 g:
在这里插入图片描述

  1. 把每一位向前提一位
  2. 根据S-box把对应位置的word值映射到其它word值
  3. 把每一位和新的4个word的每一位进行异或, 新的4个word的第一个word是根据r当前round数定义
  4. 我们得到了经过算法处理的上一轮round key的最后一个word 并把它第一个word进行异或得到下一轮word1

3.53 AES 的安全性

  • AES 达到了块密码所能达到的最高的安全程度
    输出以复杂的方式依赖于所有输入:
    (1). 通过AddRoundKey把每个位置进行异或 这一步还是互相独立
    (2). SubBytes 改变每个位置值的映射关系
    (3). ShiftRows 把每个列融入了每个行的信息
    (4). MixColumn 把每个元素都融合了元素所在列的所有元素值
    (5). 通过不同的round 把上面的再搅和的更乱
    (6). 每个round key 都和原始的key和之前所有的round key有关这也让数据跟不可破解
    10 rounds for 128-bit keys ------------12 for192-bit keys ------------ 14 for 256-bit keys
  • 但是没有证据能证明AES能免疫所有攻击:
    最新的边缘攻击-new channel attack

4. Cryptographic modes - 加密模式 -解决插入攻击

4.1 为什么要有加密模式 - 从AES引入加密模式的概念

上面的Block Cipher 是完美的么? 当然不是下面给你个例子:
在这里插入图片描述
每一个block 是7个字节码并且用同样的秘钥加密 会有什么问题呢
在这里插入图片描述
现在开始变得有点奇怪了 发现了么当明文相同时用同样的key加密会得到相同的密文. 这有问题么? 接着看
在这里插入图片描述
两家银行之间用AES的方式传递信息.
在这里插入图片描述
其中加解密都同样的秘钥, Bank1 加密信息传给 Bank2, Bank2 解密之后根据明文更新账户信息. 目前还没有问题
在这里插入图片描述
问题现在来了如果有意个bad guy 能够获取两个银行之前的通讯(唯密文攻击), 但是由于这个账号是他的他现在就进化成了 已知明文攻击, 这个时候由于每个block之间是独立的, 用相同的key加密会获得相同的密文, 那么现在这个人就相当于掌握了加密机的权限变成了选择明文攻击, 这样的话由于每个block之间相互独立, 那么他就可以自己伪造一个block 用于给自己的账户加钱(他可以选择明文获得密文现在 所以可以知道对应钱的密文). 所以看到了么问题出来了, 有两个:

1. 相同的信息用相同的秘钥加密会得到相同的密文 这会让攻击者掌握信息变成选择明文攻击
2. 不同的blocks之间相互独立, 这导致攻击者可以随意加入新的block来非法盈利.

这其实是我们选错加密模式的问题, 在这里我们选择了 Electronic Codebook Mode:
在这里插入图片描述
其实AES选择的是区块链加密模式这也是为什么它能抗击insertion attack的原因, 因为block之间是相互关联按顺序到来的, 你想改其中的一个你就要都给改了.

4.2 加密模式的介绍

  • 一种加密模式是应用一种特定密文的形式.
    同一个密文可以用于多个加密模式
    但是加密模式选不好会有严重的安全问题如AES选择了ECM
  • 一种加密模式是密文, 秘钥, 以及反馈(feedback) 的 结合(combination) 其实是一种简单的操作

4.3 Cipher Block Chain 加密模式 - AES所应用的加密模式

根据上面的叙述我们要解决两个问题:

  1. 块之间相互独立
  2. 两个相同的块信息用相同的key加密会得到相同的密文

来看看Block Chain 的特点:

  1. Ties together a group of related encrypted blocks
  2. Hides that two blocks are identical
    这两条特性 -> Resists insertion attacks
    我们下面来看看是怎么实现的

4.31 Add feedback 把所有块都给连起来

在这里插入图片描述
在加密过程中加上反馈之前不是每个block都是独立的经过SPN网络并得到对应的暗文么, 现在还是一样不过输入的明文不再是对应的块的明文了而是先把对应的明文与之前的密文进行异或对应的才是:
在这里插入图片描述
之后在进入和round key 异或的 AddRoundKey:

在这里插入图片描述
这一步实现的: Each block’s encryption depends on all previous blocks’ contents

4.32 Initialization Vector - 用来避免第一个块内容相同

上面这样是可以也解决了两个块内容相同用相同的key加密得到的密文相同的问题了(现在不存在相同的信息了)
但是这里还有个问题, 如果两个消息的第一个Block的内容相同那么两个消息的加密方式不是一模一样. 而且这种情况其实很容易发生, 尤其是在有信息头部并且有标准的文件格式的情况下. 所以我们引入了初始化向量.
步骤:

  1. 将第一个block的明文与一个随机string异或然后进入SPN
  2. 对剩下的blocks实行CBC
    在这里插入图片描述
    这一步带来的好处是:
  3. 加密结果总是独一无二的 即使两条消息一模一样 在没有IV的时候如果两条消息一模一样, 密文也是一样的.

4.33 加密过程可视化

首先把第一个block的明文与IV进行异或
在这里插入图片描述
得到了中间明文, 把他通过加密算法得到 CB1- Cipher Block 1 (包含了PB1和IV信息的密文块1)
在这里插入图片描述
这个CB1是会和PB2进行异或的到中间明文2的
在这里插入图片描述
再用中间明文2通过SPN得到包含了PB2, PB1, IV 信息的 CB2 (因为CB2包含了CB1和PB2的信息)

4.34 解密过程可视化:

IV一般放在信息的头部信息里所以可以逆解信息
在这里插入图片描述
先看第一个黑色的, 第一个黑色的密文直接用解密算法(不是直接异或哈, 因为加密算法可不是简单的异或, 逆着过一遍加密算法就好, 因为是伪随机的) 解除带有IV和PB1信息的中间明文1, 注意这时候CB1也就是第一个密文块还是有用的用来解下一个中间明文中包含的明文块信息. 现在我们有了中间明文块1, 由于它是用PB1和IV直接异或得到那么我们直接用它和IV异或就能得到PB1了

在这里插入图片描述
上面所提的密文块1其实就是00110111, 在上面的图中并没有显示它而直接给出了解出的中间明文1, 现在有了中间明文2了那我们就可以用密文1异或上中间明文2来获得PB2, 因为PB2本来就是通过密文1和PB2异或得到的

4.4 其它重要的加密模式

  • Electronic codebook mode (ECB)
  • Cipher block chaining mode (CBC)
  • Cipher-feedback mode (CFB) and Output-feedback mode (OFB)
    Both convert block to stream cipher

5. Uses of Symmetric Cryptography - 对称加密术的使用

5.1 Secrecy (Confidentiality) - 机密性

只有那些知道合适秘钥的人才能解密信息

5.2 Authentication - 认证

如果用对称加密术来确定是谁改变了一段数据的话: 因为只有两个人有秘钥那么不是我就是你
但是这明显是有问题的

  1. Problems with non-repudiation
    e.g., I create a data and encrypt it using a secret key known only
    by you and me; later, I deny that the data is created by me.
  2. What if three parties want to share a key? 当有第三者或超过两个人的时候就不好使了
    公共秘钥方案 或者 非对称加密术可以很好地解决这个问题
  3. What if I want to prove authenticity without secrecy? 如果我不想用这个秘密来证明是我做的呢
    Encryption is not necessary. 这个看着很绕, 其实刚开始两个人的时候成立就是因为这是个秘密, 非我既你, 但是如果我不想利用保密性去证明是我改的呢, 如果大家都知道这段数据, 我怎么证明是我改的呢, 这个其实是区块链中的一部分内容.

5.3 Non - alterability 不可更改性

由于每一个块都包含了前面所有块的信息, 你改一个就会导致后面全都是错的, 最后即使转化成明文了也不可读, 因为不是原来有意义的明文了, 如果你想找到哪出错了可以加上检验和就可以知道哪里出了问题, 同时如果你不想加密数据, 只加密检验和也是一样的能保证数据不被更改, 这句话的意思是说你只想让别人不能改但是别人可以看.

6. Advantages and Disvantages of Symmetric Encrytion

Advantages

  1. 比非对称加密术快很多
  2. 不需要很多中心化的权威中心
    尽管秘钥服务站很有用

Disadvantages

  1. 加密和认证是一步完成的, 也就是说如果我只想认证而不想加密是不可能的 就像上面那个认证问题3一样
  2. 没有服务器难以实现不可抵赖性 (公共秘钥方案 和 非对称加密方案都有的中心化server)
  3. 秘钥的分布会是个问题
  4. 秘钥的大范围扩展是个大问题, 因为和一个人通讯就需要一个秘钥, 那么整个互联网你要拥有多少秘钥啊
    在这里插入图片描述
    本章终于结束了!
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值