对称加密术是定义在 Key-Space, Message – Space (或者plaintext – space) 以及 密文空间之上的一组高效算法 (E, D) E is entryption algorithm D is detryption algorithm. 我们来拿 上节学的 one time pad 来对应下对称加密术的定义: 这里OTP 是不可实践的因为秘钥的长度等于信息的长度! 那下面就引入了流密文 流密文让OTP变得可实践了(practical). 我们也知道变得可用的关键是秘钥长度. 因此流密文的主要思想是让随机秘钥变成伪随机秘钥! 那么practical 的 one time pad 是什么样的呢 entrytion 和 detrytion 方程有什么改变呢 RC4是stream cipher的一个老列子了, 现在已经不再使用了! 曾是被最广泛使用的流密文, RC4(Rivest Cipher 4) 被广泛应用于https, WEP(第一个wifi加密标准). 但是RC4对于大多数应用来说还不够安全因此被Microsoft Edge 和 Internet Explorer 11给禁止了. KSA -> Initial State S -> PRGA/KGA -> Keystream -> Entrytion or DEtrytion. 上面的加密和解密算法是完全一致的, 加密解密秘钥也完全一致因此叫对称加密术. 代码上的体现: Python 版本 Python版本 Advantage: Disadvantage: • Gradually replacing DES AES 从明文到密文的加密过程是通过 Substitution–permutation network (SPN) 得到的 在AES中一个块是128bit的也就是16Byte的二维数组(4行4列) 每一个位置上有1个字节的数据也就是8bit 也就是两个16进制数字也就是说每一个位置上是一个两位的16进制数一个块总共有16个2位的16进制数 把上面的到的结果中的每一位根据S-box替换成对应的其它位 把每一行的元素向前移动所在行的数字个位置 首先用初始的key 把每一列当成一个word这样就有4个word的K0了 (K0 就是初始的key) 第二步用这个K0区产生下一个 round key. 下面来看下Key Scheduling Function的点睛模块 g: 上面的Block Cipher 是完美的么? 当然不是下面给你个例子: 1. 相同的信息用相同的秘钥加密会得到相同的密文 这会让攻击者掌握信息变成选择明文攻击 这其实是我们选错加密模式的问题, 在这里我们选择了 Electronic Codebook Mode: 根据上面的叙述我们要解决两个问题: 来看看Block Chain 的特点: 上面这样是可以也解决了两个块内容相同用相同的key加密得到的密文相同的问题了(现在不存在相同的信息了) 首先把第一个block的明文与IV进行异或 IV一般放在信息的头部信息里所以可以逆解信息 只有那些知道合适秘钥的人才能解密信息 如果用对称加密术来确定是谁改变了一段数据的话: 因为只有两个人有秘钥那么不是我就是你 由于每一个块都包含了前面所有块的信息, 你改一个就会导致后面全都是错的, 最后即使转化成明文了也不可读, 因为不是原来有意义的明文了, 如果你想找到哪出错了可以加上检验和就可以知道哪里出了问题, 同时如果你不想加密数据, 只加密检验和也是一样的能保证数据不被更改, 这句话的意思是说你只想让别人不能改但是别人可以看.Symmetric Cryptography
1. Symmetric Cryptography 的定义
E 是 一个 从 K-Space 和 M – Space 到 C – Space 的方程
D 是一个 从 K – Space 和 C – Space 到 M – Space 的方程
对称加密术其实就是加密秘钥和解密密钥是相同的加密方法
先来看看 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 c2. Stream Cipher – 流密文 – 对称加密术 1
2.1 Strean Cipher 的定义
Idea: replace “random” key by “pseudorandom” key
上面的pseudorandom 是一个function:
将长度为s的随机比特串映射为长度为n的为随机比特串
2.2 Stream Cipher 让 OTP 变得可实践了
改变就是 E(k,m)=G(k) XOR M D(k,m)=G(k) XOR C
那么采用了流密文的OTP还是完美保密的么? 记得我们前面说的么 -> 不论任何密文想要实现完全保密key的长度一定不能小于明文的长度很明显这里不满足哦所以不是!2.3 现实中的流密文: Realworld stream cipher->RC4
2.31 背景介绍
2.32 实现原理
创造密钥流的过程应该是不可侦测的
创造密钥流其实包括了:
1.1 Key Sheduling Algorithm – KSA 秘钥调度算法或者是秘钥初始化算法
1.2 Pesudorandom Generation Algorithm – PRGA 伪随机算子生成算法
1.2 其实也可以是Key Stream Generation Algorithm 密钥流生成算法
下面从代码角度看一下这个破东西
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对应的值把水搅浑 } }
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位得到了 } }
之后就是用KS和相应的明文进行加密了(这一不可以卸载上面的最后一步解密也是)2.33 RG4 的 特点
2.1 初始的密钥流不够随机: 可以扔掉前100个秘钥位来修复这个问题
2.2 秘钥的重复使用也是RG4的一个大问题3. Block Cipher – 块密码 – 对称加密术 2
3.1 Block Cipher 的介绍
3.2 Block Cipher的工作原理
3.3 Block Cipher的应用
• 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
• 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的优缺点
3.5 目前最流行的块密码AES
3.51 Increased popularity of AES
—– 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 OS3.52 AES加密流程 – 史上最详细 (SPN 网络详解)
上图中包含了两个算法模块:
—– AddRoundKey
—– SubBytes
—– ShiftRound
—– MixColumns3.521 AEC的核心加密模块
1. AddRoundKey: 把roundKey和中间状态进行异或
好了接下来看看流程
这就是这一步干的事情 把中间状态和用key产生的128bit的round key 的对应位进行异或获得第一步的输出.2. SubBytes 字节替换
有没有看到x和y都是16进制的, 那么根据我的猜测它是根据每个位置的数值把它替换成对应的数值, 因为每个数值刚好是两个16进制数, 不然的话想要用到s16,16需要有256个Byte也就是2048bits AES中跟本没有这么大的块3. ShiftRows 行位移变换
这一步每一列都包含了所有行的信息4. MixColumn 通过矩阵相乘把一列的每个元素混合在一起
这一步每一个元素都包含了它所在列的所有元素信息 比如 S00 = 02S00+01S10+01S20+03S303.522 Key Sheduling Function 用来产生round key
1. K0 的产生
2. 其它round key的产生
Kn也是由4个word组成的其中每个word都是用上一轮key和前一位的word进行异或得到的. 这里W4 是最为特殊的因为它的前一位是上一位的W3和剩下的word都不同, 它是由W0和处理后的W3异或得到的, 总的来说就是每一位新的word都是由上一轮对应位置的word和该word前面一个word异或得到的.3. 末尾word处理算法g
3.53 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
最新的边缘攻击-new channel attack4. Cryptographic modes – 加密模式 -解决插入攻击
4.1 为什么要有加密模式 – 从AES引入加密模式的概念
每一个block 是7个字节码并且用同样的秘钥加密 会有什么问题呢
现在开始变得有点奇怪了 发现了么当明文相同时用同样的key加密会得到相同的密文. 这有问题么? 接着看
两家银行之间用AES的方式传递信息.
其中加解密都同样的秘钥, Bank1 加密信息传给 Bank2, Bank2 解密之后根据明文更新账户信息. 目前还没有问题
问题现在来了如果有意个bad guy 能够获取两个银行之前的通讯(唯密文攻击), 但是由于这个账号是他的他现在就进化成了 已知明文攻击, 这个时候由于每个block之间是独立的, 用相同的key加密会获得相同的密文, 那么现在这个人就相当于掌握了加密机的权限变成了选择明文攻击, 这样的话由于每个block之间相互独立, 那么他就可以自己伪造一个block 用于给自己的账户加钱(他可以选择明文获得密文现在 所以可以知道对应钱的密文). 所以看到了么问题出来了, 有两个:
2. 不同的blocks之间相互独立, 这导致攻击者可以随意加入新的block来非法盈利.
其实AES选择的是区块链加密模式这也是为什么它能抗击insertion attack的原因, 因为block之间是相互关联按顺序到来的, 你想改其中的一个你就要都给改了.4.2 加密模式的介绍
同一个密文可以用于多个加密模式
但是加密模式选不好会有严重的安全问题如AES选择了ECM4.3 Cipher Block Chain 加密模式 – AES所应用的加密模式
这两条特性 -> Resists insertion attacks
我们下面来看看是怎么实现的4.31 Add feedback 把所有块都给连起来
在加密过程中加上反馈之前不是每个block都是独立的经过SPN网络并得到对应的暗文么, 现在还是一样不过输入的明文不再是对应的块的明文了而是先把对应的明文与之前的密文进行异或对应的才是:
之后在进入和round key 异或的 AddRoundKey:
这一步实现的: Each block’s encryption depends on all previous blocks’ contents4.32 Initialization Vector – 用来避免第一个块内容相同
但是这里还有个问题, 如果两个消息的第一个Block的内容相同那么两个消息的加密方式不是一模一样. 而且这种情况其实很容易发生, 尤其是在有信息头部并且有标准的文件格式的情况下. 所以我们引入了初始化向量.
步骤:
这一步带来的好处是:4.33 加密过程可视化
得到了中间明文, 把他通过加密算法得到 CB1- Cipher Block 1 (包含了PB1和IV信息的密文块1)
这个CB1是会和PB2进行异或的到中间明文2的
再用中间明文2通过SPN得到包含了PB2, PB1, IV 信息的 CB2 (因为CB2包含了CB1和PB2的信息)4.34 解密过程可视化:
先看第一个黑色的, 第一个黑色的密文直接用解密算法(不是直接异或哈, 因为加密算法可不是简单的异或, 逆着过一遍加密算法就好, 因为是伪随机的) 解除带有IV和PB1信息的中间明文1, 注意这时候CB1也就是第一个密文块还是有用的用来解下一个中间明文中包含的明文块信息. 现在我们有了中间明文块1, 由于它是用PB1和IV直接异或得到那么我们直接用它和IV异或就能得到PB1了
上面所提的密文块1其实就是00110111, 在上面的图中并没有显示它而直接给出了解出的中间明文1, 现在有了中间明文2了那我们就可以用密文1异或上中间明文2来获得PB2, 因为PB2本来就是通过密文1和PB2异或得到的4.4 其它重要的加密模式
Both convert block to stream cipher5. Uses of Symmetric Cryptography – 对称加密术的使用
5.1 Secrecy (Confidentiality) – 机密性
5.2 Authentication – 认证
但是这明显是有问题的
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.
公共秘钥方案 或者 非对称加密术可以很好地解决这个问题
Encryption is not necessary. 这个看着很绕, 其实刚开始两个人的时候成立就是因为这是个秘密, 非我既你, 但是如果我不想利用保密性去证明是我改的呢, 如果大家都知道这段数据, 我怎么证明是我改的呢, 这个其实是区块链中的一部分内容.5.3 Non – alterability 不可更改性
6. Advantages and Disvantages of Symmetric Encrytion
Advantages
尽管秘钥服务站很有用Disadvantages
本章终于结束了!
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算