对称加密术是定义在 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 是不可实践的因为秘钥的长度等于信息的长度! 那下面就引入了流密文
流密文让OTP变得可实践了(practical). 我们也知道变得可用的关键是秘钥长度.
因此流密文的主要思想是让随机秘钥变成伪随机秘钥!
Idea: replace “random” key by “pseudorandom” key
上面的pseudorandom 是一个function:
那么practical 的 one time pad 是什么样的呢 entrytion 和 detrytion 方程有什么改变呢
改变就是 E(k,m)=G(k) XOR M D(k,m)=G(k) XOR C
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.
上面的加密和解密算法是完全一致的, 加密解密秘钥也完全一致因此叫对称加密术.
下面从代码角度看一下这个破东西
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 版本
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版本
Advantage:
Disadvantage:
• 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
AES 从明文到密文的加密过程是通过 Substitution–permutation network (SPN) 得到的
在AES中一个块是128bit的也就是16Byte的二维数组(4行4列) 每一个位置上有1个字节的数据也就是8bit 也就是两个16进制数字也就是说每一个位置上是一个两位的16进制数一个块总共有16个2位的16进制数
好了接下来看看流程
这就是这一步干的事情 把中间状态和用key产生的128bit的round key 的对应位进行异或获得第一步的输出.
把上面的到的结果中的每一位根据S-box替换成对应的其它位
有没有看到x和y都是16进制的, 那么根据我的猜测它是根据每个位置的数值把它替换成对应的数值, 因为每个数值刚好是两个16进制数, 不然的话想要用到s16,16需要有256个Byte也就是2048bits AES中跟本没有这么大的块
把每一行的元素向前移动所在行的数字个位置
这一步每一列都包含了所有行的信息
这一步每一个元素都包含了它所在列的所有元素信息 比如 S00 = 02S00+01S10+01S20+03S30
首先用初始的key 把每一列当成一个word这样就有4个word的K0了 (K0 就是初始的key)
第二步用这个K0区产生下一个 round key.
Kn也是由4个word组成的其中每个word都是用上一轮key和前一位的word进行异或得到的. 这里W4 是最为特殊的因为它的前一位是上一位的W3和剩下的word都不同, 它是由W0和处理后的W3异或得到的, 总的来说就是每一位新的word都是由上一轮对应位置的word和该word前面一个word异或得到的.
下面来看下Key Scheduling Function的点睛模块 g:
上面的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之间是相互关联按顺序到来的, 你想改其中的一个你就要都给改了.
根据上面的叙述我们要解决两个问题:
来看看Block Chain 的特点:
在加密过程中加上反馈之前不是每个block都是独立的经过SPN网络并得到对应的暗文么, 现在还是一样不过输入的明文不再是对应的块的明文了而是先把对应的明文与之前的密文进行异或对应的才是:
之后在进入和round key 异或的 AddRoundKey:
这一步实现的: Each block’s encryption depends on all previous blocks’ contents
上面这样是可以也解决了两个块内容相同用相同的key加密得到的密文相同的问题了(现在不存在相同的信息了)
但是这里还有个问题, 如果两个消息的第一个Block的内容相同那么两个消息的加密方式不是一模一样. 而且这种情况其实很容易发生, 尤其是在有信息头部并且有标准的文件格式的情况下. 所以我们引入了初始化向量.
步骤:
首先把第一个block的明文与IV进行异或
得到了中间明文, 把他通过加密算法得到 CB1- Cipher Block 1 (包含了PB1和IV信息的密文块1)
这个CB1是会和PB2进行异或的到中间明文2的
再用中间明文2通过SPN得到包含了PB2, PB1, IV 信息的 CB2 (因为CB2包含了CB1和PB2的信息)
IV一般放在信息的头部信息里所以可以逆解信息
先看第一个黑色的, 第一个黑色的密文直接用解密算法(不是直接异或哈, 因为加密算法可不是简单的异或, 逆着过一遍加密算法就好, 因为是伪随机的) 解除带有IV和PB1信息的中间明文1, 注意这时候CB1也就是第一个密文块还是有用的用来解下一个中间明文中包含的明文块信息. 现在我们有了中间明文块1, 由于它是用PB1和IV直接异或得到那么我们直接用它和IV异或就能得到PB1了
上面所提的密文块1其实就是00110111, 在上面的图中并没有显示它而直接给出了解出的中间明文1, 现在有了中间明文2了那我们就可以用密文1异或上中间明文2来获得PB2, 因为PB2本来就是通过密文1和PB2异或得到的
只有那些知道合适秘钥的人才能解密信息
如果用对称加密术来确定是谁改变了一段数据的话: 因为只有两个人有秘钥那么不是我就是你
但是这明显是有问题的
由于每一个块都包含了前面所有块的信息, 你改一个就会导致后面全都是错的, 最后即使转化成明文了也不可读, 因为不是原来有意义的明文了, 如果你想找到哪出错了可以加上检验和就可以知道哪里出了问题, 同时如果你不想加密数据, 只加密检验和也是一样的能保证数据不被更改, 这句话的意思是说你只想让别人不能改但是别人可以看.
因篇幅问题不能全部显示,请点此查看更多更全内容