目录

ECB和CBC模式的区别

ECB模式

CBC模式:

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

ECB (Electronic Codebook Book电码本模式)

CBC(Cipher Block Chaining 密码分组链接模式)

C++源代码


ECB和CBC模式的区别

ECB模式

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

优点:

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

缺点:

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

CBC模式:

优点:

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

缺点:

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

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

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

原文链接:https://blog.csdn.net/honeygirl_/article/details/90716328

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

分组密码有五种工作体制:1.电码本模式(Electronic Codebook Book (ECB));2.密码分组链接模式(Cipher Block Chaining (CBC));3.计算器模式(Counter (CTR));4.密码反馈模式(Cipher FeedBack (CFB));5.输出反馈模式(Output FeedBack (OFB))。

以下逐一介绍一下:

ECB (Electronic Codebook Book电码本模式)

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

CBC(Cipher Block Chaining 密码分组链接模式)

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

 

初始化向量

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

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

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

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

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

 

 

4.密码反馈模式(Cipher FeedBack (CFB))

这种模式较复杂。

 

5.输出反馈模式(Output FeedBack (OFB))

这种模式较复杂。

C++源代码

/**
*@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]; //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模式,而是适用所有需要进行分组填充的模式。

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

【加密】DES加密算法中,ECB和CBC模式有什么区别?相关推荐

  1. 常用对称加密算法之AES算法-CBC模式

    这个需求很简单就是存储数据库密码,因为链接数据库的需要用到,加密就必须要用对称加密算法,于是简单调研了一下对称加密算法,经过对比最后选择了AES算法-CBC模式 怎么理解对称加密 加密:接收秘钥key ...

  2. python调用库函数用ecb模式加密图片_AES中ECB模式的加密与解密(Python3.7)

    本文主要解决的问题 本文主要是讲解AES加密算法中的ECB模式的加密解密的Python3.7实现.具体AES加密算法的原理这里不做过多介绍,想了解的可以参考文末的参考链接. 主要解决了两个问题: 在P ...

  3. raid功能中spanning和striping模式有什么区别?

    RAID 0 又称为Stripe(条带化,串列)或Striping 它代表了所有RAID级别中最高的存储性能.RAID 0提高存储性能的原理是把连续的数据分散到多个磁盘上存取,这样,系统有数据请求就可 ...

  4. 对称加密算法之分组加密的六种工作模式(ECB、CBC、PCBC、CFB、OFB、CTR)

    加密一般分为对称加密(Symmetric Key Encryption)和非对称加密(Asymmetric Key Encryption).对称加密又分为分组加密和序列密码. (1)分组加密,也叫块加 ...

  5. 块加密 工作模式 ECB、CBC、PCBC、CFB、OFB、CTR

    块加密 块加密,英文Block Cyper,又称分组加密,是一种常见的对称加密,具有代表性的块加密有DES,AES,3DES等.块加密的工作模式允许使用同一个分组密码密钥对多于一块的数据进行加密,并保 ...

  6. python 3des加密_DES/3DES之ECB模式和CBC模式加解密 及 Python 实现

    概念说明 DES:Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法. 3DES:Triple DES,是三重数据加密算法(TDEA,Triple Data ...

  7. 分组加密五大常见模式(ECB、CBC、CFB、OFB、CTR)

    一.ECB ECB模式全称是Electronic CodeBook模式,在ECB模式中,将明文分组加密之后的结果将直接成为密文分组. ECB模式全称是Electronic CodeBook模式,在EC ...

  8. AES加密的工作模式ECB、CBC、CFB、OFB及案例

    高级加密标准(Advanced Encryption Standard: AES)是美国国家标准与技术研究院(NIST)在2001年建立了电子数据的加密规范.其是对称加解密算法的最经典算法之一,它是一 ...

  9. 算法科普:神秘的 DES 加密算法

    1 前言 DES 算法是一种常见的分组加密算法,由IBM公司在1971年提出.DES 算法是分组加密算法的典型代表,同时也是应用最为广泛的对称加密算法.本文将详细讲述DES 的原理以及实现过程. 1. ...

最新文章

  1. Asp.net控件开发学习笔记(三)-控件开发基础
  2. SCVMM2008R2学习(八),硬件配置文件
  3. java获取字符串最长_基于java查找最长字符串代码实例
  4. (转载)浅析Hadoop文件格式
  5. ITK:将vtkImageData转换为itk :: Image
  6. (四)Canvas API方法和属性汇总
  7. IT应聘者的简历应该是怎么样的?
  8. JWT:我应该使用哪种签名算法?
  9. 决策者根据什么曲线做出决策_如何做出产品设计决策
  10. 2020游戏直播行业数据报告
  11. Java 根据枚举的名字得到枚举的实例
  12. KubeSphere配置应用路由
  13. 【CCCC】L2-002 链表去重 (25分),,把一个链表拆成两个
  14. 分析和比较ABAQUS、MARC、Adina、ANSYS三种CAE软件
  15. Go编译原理系列1(编译原理概览)
  16. windows设置自动获取IP地址
  17. 单词播放器5.10发布
  18. 计算机辅助翻译入门第十章课后答案,计算机辅助翻译简明教程
  19. 简信CRM:手机CRM软件的应用好处有哪些?
  20. php入门,windows安装与环境配置,基础语法学习

热门文章

  1. 2022-2028全球与中国经颅磁刺激线圈市场现状及未来发展趋势
  2. LoRa入门(2)—— PingPong测试(软件篇)
  3. Spring Boot 部署打包成 jar 和 war 有什么不同?
  4. 在大厂月薪35K-60K的程序员,和15-25K的程序员差别在哪里?
  5. ST一级代理芯片与半导体供应商有哪些品牌
  6. C++游戏开发,超简单的入门项目,50行代码搞定开心消消乐
  7. 【计算机二级Python】考试攻略及资料汇总
  8. 企业ERP应用的配套管理制度建设
  9. 贴片轻触开关路线难题
  10. 搭建FastDFS+Nginx(Censor7)