200字范文,内容丰富有趣,生活中的好帮手!
200字范文 > 【加密】DES加密算法中 ECB和CBC模式有什么区别?

【加密】DES加密算法中 ECB和CBC模式有什么区别?

时间:2024-06-15 21:28:00

相关推荐

【加密】DES加密算法中 ECB和CBC模式有什么区别?

目录

ECB和CBC模式的区别

ECB模式

CBC模式:

AES五种加密模式(CBC、ECB、CTR、OCF、CFB)

ECB (ElectronicCodebookBook电码本模式)

CBC(CipherBlockChaining密码分组链接模式)

C++源代码

ECB和CBC模式的区别

ECB模式

ECB(电子密本方式)其实非常简单,就是将数据按照8个字节一段进行DES加密或解密得到一段段的8个字节的密文或者明文,最后一段不足8个字节(一般补0或者F),按照需求补足8个字节进行计算(并行计算),之后按照顺序将计算所得的数据连在一起即可,各段数据之间互不影响。

优点:

简单;有利于并行计算;误差不会被传递;

缺点:

不能隐藏明文的模式;可能对明文进行主动攻击;

CBC模式:

优点:

不容易主动攻击,安全性好于ECB,是SSL、IPSec的标准;

缺点:

不利于并行计算;误差传递;需要初始化向量IV;

CBC(密文分组链接方式)有点麻烦,它的实现机制使加密的各段数据之间有了联系。其实现的机理如下:

加密步骤如下:

首先将数据按照8个字节一组进行分组得到D1D2…Dn(若数据不是8的整数倍,用指定的PADDING数据补位)第一组数据D1与初始化向量I异或后的结果进行DES加密得到第一组密文C1(初始化向量I为全零)第二组数据D2与第一组的加密结果C1异或以后的结果进行DES加密,得到第二组密文C2之后的数据以此类推,得到Cn按顺序连为C1C2C3…Cn即为加密结果。

原文链接:/honeygirl_/article/details/90716328

AES五种加密模式(CBC、ECB、CTR、OCF、CFB)

分组密码有五种工作体制:1.电码本模式(ElectronicCodebookBook(ECB));2.密码分组链接模式(CipherBlockChaining(CBC));3.计算器模式(Counter(CTR));4.密码反馈模式(CipherFeedBack(CFB));5.输出反馈模式(OutputFeedBack(OFB))。

以下逐一介绍一下:

ECB (ElectronicCodebookBook电码本模式)

这种模式是将整个明文分成若干段相同的小段,然后对每一小段进行加密。

CBC(CipherBlockChaining密码分组链接模式)

这种模式是先将明文切分成若干小段,然后每一小段与初始块(IV)或者上一段的密文段进行异或,再与密钥进行加密。

初始化向量

当加密第一个明文分组时,由于不存在“前一个密文分组”,因此需要事先准备一个长度为一个分组的比特序列来代替“前一个密文分组”,这个比特序列称为初始化向量(Initialization Vector),通常缩写为IV,一般来说,每次加密时都会随机产生一个不同的比特序列来作为初始化向量。

我们来比较一下ECB模式与CBC模式的区别

ECB模式只进行了加密,而CBC模式则在加密之前进行了一次XOR。

3.计算器模式(Counter(CTR))

计算器模式不常见,在CTR模式中,有一个自增的算子,这个算子用密钥加密之后的输出和明文异或的结果得到密文,相当于一次一密。这种加密方式简单快速,安全可靠,而且可以并行加密,但是在计算器不能维持很长的情况下,密钥只能使用一次。CTR的示意图如下所示:

4.密码反馈模式(CipherFeedBack(CFB))

这种模式较复杂。

5.输出反馈模式(OutputFeedBack(OFB))

这种模式较复杂。

C++源代码

/***@autho stardust*@time -10-10*@param 实现AES五种加密模式的测试*/#include <iostream>using namespace std;//加密编码过程函数,16位1和0int 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]; //Kfor(int i=0;i<2 * encLen;i++) //外层加密循环{//产生Kfor(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]; //Kfor(int i=0;i<2 * encLen;i++) //外层加密循环{//产生Kfor(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模式,而是适用所有需要进行分组填充的模式。

对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等。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。