赞
踩
目录
AES五种加密模式(CBC、ECB、CTR、OCF、CFB)
ECB (Electronic Codebook Book电码本模式)
CBC(Cipher Block Chaining 密码分组链接模式)
ECB(电子密本方式)其实非常简单,就是将数据按照8个字节一段进行DES加密或解密得到一段段的8个字节的密文或者明文,最后一段不足8个字节(一般补0或者F),按照需求补足8个字节进行计算(并行计算),之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。
优点:
缺点:
优点:
缺点:
CBC(密文分组链接方式)有点麻烦,它的实现机制使加密的各段数据之间有了联系。其实现的机理如下:
加密步骤如下:
原文链接:https://blog.csdn.net/honeygirl_/article/details/90716328
分组密码有五种工作体制:1.电码本模式(Electronic Codebook Book (ECB));2.密码分组链接模式(Cipher Block Chaining (CBC));3.计算器模式(Counter (CTR));4.密码反馈模式(Cipher FeedBack (CFB));5.输出反馈模式(Output FeedBack (OFB))。
以下逐一介绍一下:
这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。
这种模式是先将明文切分成若干小段,然后每一小段与初始块(IV)或者上一段的密文段进行异或,再与密钥进行加密。
初始化向量
当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量(Initialization Vector),通常缩写为IV,一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。
我们来比较一下ECB模式与CBC模式的区别
ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。
3.计算器模式(Counter (CTR))
计算器模式不常见,在CTR模式中, 有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。CTR的示意图如下所示:
4.密码反馈模式(Cipher FeedBack (CFB))
这种模式较复杂。
5.输出反馈模式(Output FeedBack (OFB))
这种模式较复杂。
- /**
- *@autho stardust
- *@time 2013-10-10
- *@param 实现AES五种加密模式的测试
- */
- #include <iostream>
- using namespace std;
-
- //加密编码过程函数,16位1和0
- int dataLen = 16; //需要加密数据的长度
- int encLen = 4; //加密分段的长度
- int encTable[4] = {1,0,1,0}; //置换表
- int data[16] = {1,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0}; //明文
- int ciphertext[16]; //密文
-
- //切片加密函数
- void encode(int arr[])
- {
- for(int i=0;i<encLen;i++)
- {
- arr[i] = arr[i] ^ encTable[i];
- }
- }
-
- //电码本模式加密,4位分段
- void ECB(int arr[])
- {
- //数据明文切片
- int a[4][4];
- int dataCount = 0; //位置变量
- for(int k=0;k<4;k++)
- {
- for(int t=0;t<4;t++)
- {
- a[k][t] = data[dataCount];
- dataCount++;
- }
- }
- dataCount = 0;//重置位置变量
- for(int i=0;i<dataLen;i=i+encLen)
- {
- int r = i/encLen;//行
- int l = 0;//列
- int encQue[4]; //编码片段
- for(int j=0;j<encLen;j++)
- {
- encQue[j] = a[r][l];
- l++;
- }
- encode(encQue); //切片加密
- //添加到密文表中
- for(int p=0;p<encLen;p++)
- {
- ciphertext[dataCount] = encQue[p];
- dataCount++;
- }
- }
- cout<<"ECB加密的密文为:"<<endl;
- for(int t1=0;t1<dataLen;t1++) //输出密文
- {
- if(t1!=0 && t1%4==0)
- cout<<endl;
- cout<<ciphertext[t1]<<" ";
- }
- cout<<endl;
- cout<<"---------------------------------------------"<<endl;
- }
-
- //CBC
- //密码分组链接模式,4位分段
- void CCB(int arr[])
- {
- //数据明文切片
- int a[4][4];
- int dataCount = 0; //位置变量
- for(int k=0;k<4;k++)
- {
- for(int t=0;t<4;t++)
- {
- a[k][t] = data[dataCount];
- dataCount++;
- }
- }
- dataCount = 0;//重置位置变量
-
- int init[4] = {1,1,0,0}; //初始异或运算输入
- //初始异或运算
- for(int i=0;i<dataLen;i=i+encLen)
- {
- int r = i/encLen;//行
- int l = 0;//列
- int encQue[4]; //编码片段
- //初始化异或运算
- for(int k=0;k<encLen;k++)
- {
- a[r][k] = a[r][k] ^ init[k];
- }
- //与Key加密的单切片
- for(int j=0;j<encLen;j++)
- {
- encQue[j] = a[r][j];
- }
- encode(encQue); //切片加密
- //添加到密文表中
- for(int p=0;p<encLen;p++)
- {
- ciphertext[dataCount] = encQue[p];
- dataCount++;
- }
- //变换初始输入
- for(int t=0;t<encLen;t++)
- {
- init[t] = encQue[t];
- }
- }
-
-
- cout<<"CCB加密的密文为:"<<endl;
- for(int t1=0;t1<dataLen;t1++) //输出密文
- {
- if(t1!=0 && t1%4==0)
- cout<<endl;
- cout<<ciphertext[t1]<<" ";
- }
- cout<<endl;
- cout<<"---------------------------------------------"<<endl;
- }
-
- //CTR
- //计算器模式,4位分段
- void CTR(int arr[])
- {
- //数据明文切片
- int a[4][4];
- int dataCount = 0; //位置变量
- for(int k=0;k<4;k++)
- {
- for(int t=0;t<4;t++)
- {
- a[k][t] = data[dataCount];
- dataCount++;
- }
- }
- dataCount = 0;//重置位置变量
-
- int init[4][4] = {{1,0,0,0},{0,0,0,1},{0,0,1,0},{0,1,0,0}}; //算子表
- int l = 0; //明文切片表列
- //初始异或运算
- for(int i=0;i<dataLen;i=i+encLen)
- {
- int r = i/encLen;//行
- int encQue[4]; //编码片段
- //将算子切片
- for(int t=0;t<encLen;t++)
- {
- encQue[t] = init[r][t];
- }
- encode(encQue); //算子与key加密
- //最后的异或运算
- for(int k=0;k<encLen;k++)
- {
- encQue[k] = encQue[k] ^ a[l][k];
- }
- l++;
-
- //添加到密文表中
- for(int p=0;p<encLen;p++)
- {
- ciphertext[dataCount] = encQue[p];
- dataCount++;
- }
- }
-
-
- cout<<"CTR加密的密文为:"<<endl;
- for(int t1=0;t1<dataLen;t1++) //输出密文
- {
- if(t1!=0 && t1%4==0)
- cout<<endl;
- cout<<ciphertext[t1]<<" ";
- }
- cout<<endl;
- cout<<"---------------------------------------------"<<endl;
- }
-
- //CFB
- //密码反馈模式,4位分段
- void CFB(int arr[])
- {
- //数据明文切片,切成2 * 8 片
- int a[8][2];
- int dataCount = 0; //位置变量
- for(int k=0;k<8;k++)
- {
- for(int t=0;t<2;t++)
- {
- a[k][t] = data[dataCount];
- dataCount++;
- }
- }
- dataCount = 0; //恢复初始化设置
- int lv[4] = {1,0,1,1}; //初始设置的位移变量
- int encQue[2]; //K的高两位
- int k[4]; //K
-
- for(int i=0;i<2 * encLen;i++) //外层加密循环
- {
- //产生K
- for(int vk=0;vk<encLen;vk++)
- {
- k[vk] = lv[vk];
- }
- encode(k);
- for(int k2=0;k2<2;k2++)
- {
- encQue[k2] = k[k2];
- }
- //K与数据明文异或产生密文
- for(int j=0;j<2;j++)
- {
- ciphertext[dataCount] = a[dataCount/2][j] ^ encQue[j];
- dataCount++;
- }
- //lv左移变换
- lv[0] = lv[2];
- lv[1] = lv[3];
- lv[2] = ciphertext[dataCount-2];
- lv[3] = ciphertext[dataCount-1];
- }
-
- cout<<"CFB加密的密文为:"<<endl;
- for(int t1=0;t1<dataLen;t1++) //输出密文
- {
- if(t1!=0 && t1%4==0)
- cout<<endl;
- cout<<ciphertext[t1]<<" ";
- }
- cout<<endl;
- cout<<"---------------------------------------------"<<endl;
- }
-
- //OFB
- //输出反馈模式,4位分段
- void OFB(int arr[])
- {
- //数据明文切片,切成2 * 8 片
- int a[8][2];
- int dataCount = 0; //位置变量
- for(int k=0;k<8;k++)
- {
- for(int t=0;t<2;t++)
- {
- a[k][t] = data[dataCount];
- dataCount++;
- }
- }
- dataCount = 0; //恢复初始化设置
- int lv[4] = {1,0,1,1}; //初始设置的位移变量
- int encQue[2]; //K的高两位
- int k[4]; //K
-
- for(int i=0;i<2 * encLen;i++) //外层加密循环
- {
- //产生K
- for(int vk=0;vk<encLen;vk++)
- {
- k[vk] = lv[vk];
- }
- encode(k);
- for(int k2=0;k2<2;k2++)
- {
- encQue[k2] = k[k2];
- }
- //K与数据明文异或产生密文
- for(int j=0;j<2;j++)
- {
- ciphertext[dataCount] = a[dataCount/2][j] ^ encQue[j];
- dataCount++;
- }
- //lv左移变换
- lv[0] = lv[2];
- lv[1] = lv[3];
- lv[2] = encQue[0];
- lv[3] = encQue[1];
- }
-
- cout<<"CFB加密的密文为:"<<endl;
- for(int t1=0;t1<dataLen;t1++) //输出密文
- {
- if(t1!=0 && t1%4==0)
- cout<<endl;
- cout<<ciphertext[t1]<<" ";
- }
- cout<<endl;
- cout<<"---------------------------------------------"<<endl;
- }
-
-
- void printData()
- {
- cout<<"以下示范AES五种加密模式的测试结果:"<<endl;
- cout<<"---------------------------------------------"<<endl;
- cout<<"明文为:"<<endl;
- for(int t1=0;t1<dataLen;t1++) //输出密文
- {
- if(t1!=0 && t1%4==0)
- cout<<endl;
- cout<<data[t1]<<" ";
- }
- cout<<endl;
- cout<<"---------------------------------------------"<<endl;
- }
- int main()
- {
- printData();
- ECB(data);
- CCB(data);
- CTR(data);
- CFB(data);
- OFB(data);
- return 0;
- }
原文:AES五种加密模式(CBC、ECB、CTR、OCF、CFB) - 月之星狼 - 博客园
四 对CBC模式的攻击
假设主动攻击者的目的是通过修改密文来操纵解密后的明文。如果攻击者能够对初始化向量中的任意比特进行反转(将1变成0,将0变成1),则明文分组中相应的比特也会被反转。这是因为在CBC模式的解密过程中,第一个明文分组会和初始化向量进行XOR运算。见下图。
但是想对密文分组也进行同样的攻击就非常困难了。例如,如果攻击者将密文分组1中的某个比特进行反转,则明文分组2中相应比特也会被反转,然而这一比特的变化却对解密后的明文分组1中的多个比特造成了影响,也就是说,只让明文分1中所期望的特定比特发生变化是很困难的。
五 填充提示攻击
填充提示攻击是一种利用分组密码中填充部分来进行攻击的方法。在分组密码中,当明文长度不为分组长度的整数倍时,需要在最后一个分组中填充一些数据使其凑满一个分组长度。在填充提示攻击中,攻击者会反复发送一段密文,每次发送时都对填充数据进行少许改变。由于接收者(服务器)在无法正确解密时会返回一个错误消息,攻击者通过这一错误消息就可以获得一部分与明文相关的信息。这一攻击并不仅限于CBC模式,而是适用所有需要进行分组填充的模式。
2014年对SSL3.0 造成了重大影响POODLE攻击实际上就是一种填充示攻击。
六 对初始化向量(IV)进行攻击
初始化向量(IV)必须使用不可预测的随机数。然而在SSL/TLS的TLS1.0版本协议中,IV并没有使用不可预测的随机数,而是使用上一次CBC模式加密时的最后一个分组。为了防御攻击者对此进行攻击,TLS1.1以上的版本中改为了必须显示传送IV。
七 CBC模式应用
确保互联网安全的通信协议之一SSL/TLS,就是使用CBC模式来确保通信机密性的,如使用CBC模式三重DES的3DES_EDE_CBC以及CBC模式256比特AES的AES_256_CBC等。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。