本文转自:https://www.jianshu.com/p/582d3a47729a

  AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学中又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。严格地说,AES和Rijndael加密法并不完全一样(虽然在实际应用中二者可以互换),因为Rijndael加密法可以支持更大范围的区块和密钥长度:AES的区块长度固定为128 比特,密钥长度则可以是128,192或256比特;而Rijndael使用的密钥和区块长度可以是32位的整数倍,以128位为下限,256比特为上限。包括AES-ECB,AES-CBC,AES-CTR,AES-OFB,AES-CFB

简介

  一般的加密通常都是块加密,如果要加密超过块大小的数据,就需要涉及填充和链加密模式,本文对对称加密和分组加密中的几种种模式进行一一分析(ECB、CBC、CFB、OFB,CTR)

电码本模式 Electronic Codebook Book (ECB)

概述

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

特点分析

优点:

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

缺点:

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

代码演示

/**
*@autho stardust
*@time 2013-10-10
*@param 实现AES五种加密模式的测试
*/
#include <iostream>
using namespace std; //加密编码过程函数,16位1和0
int dataLen = ; //需要加密数据的长度
int encLen = ; //加密分段的长度
int encTable[] = {,,,}; //置换表
int data[] = {,,,,,,,,,,,,,,,}; //明文
int ciphertext[]; //密文 //切片加密函数
void encode(int arr[])
{
for(int i=;i<encLen;i++)
{
arr[i] = arr[i] ^ encTable[i];
}
} //电码本模式加密,4位分段
void ECB(int arr[])
{
//数据明文切片
int a[][];
int dataCount = ; //位置变量
for(int k=;k<;k++)
{
for(int t=;t<;t++)
{
a[k][t] = data[dataCount];
dataCount++;
}
}
dataCount = ;//重置位置变量
for(int i=;i<dataLen;i=i+encLen)
{
int r = i/encLen;//行
int l = ;//列
int encQue[]; //编码片段
for(int j=;j<encLen;j++)
{
encQue[j] = a[r][l];
l++;
}
encode(encQue); //切片加密
//添加到密文表中
for(int p=;p<encLen;p++)
{
ciphertext[dataCount] = encQue[p];
dataCount++;
}
}
cout<<"ECB加密的密文为:"<<endl;
for(int t1=;t1<dataLen;t1++) //输出密文
{
if(t1!= && t1%==)
cout<<endl;
cout<<ciphertext[t1]<<" ";
}
cout<<endl;
cout<<"---------------------------------------------"<<endl;
}

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

概述

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

特点分析

优点:

    • 不容易主动攻击,安全性好于ECB,适合传输长度长的报文,是SSL、IPSec的标准。

缺点:

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

代码演示

#include <iostream>
using namespace std; //加密编码过程函数,16位1和0
int dataLen = ; //需要加密数据的长度
int encLen = ; //加密分段的长度
int encTable[] = {,,,}; //置换表
int data[] = {,,,,,,,,,,,,,,,}; //明文
int ciphertext[]; //密文 //切片加密函数
void encode(int arr[])
{
for(int i=;i<encLen;i++)
{
arr[i] = arr[i] ^ encTable[i];
}
}
//CBC
//密码分组链接模式,4位分段
void CBC(int arr[])
{
//数据明文切片
int a[][];
int dataCount = ; //位置变量
for(int k=;k<;k++)
{
for(int t=;t<;t++)
{
a[k][t] = data[dataCount];
dataCount++;
}
}
dataCount = ;//重置位置变量 int init[] = {,,,}; //初始异或运算输入
//初始异或运算
for(int i=;i<dataLen;i=i+encLen)
{
int r = i/encLen;//行
int l = ;//列
int encQue[]; //编码片段
//初始化异或运算
for(int k=;k<encLen;k++)
{
a[r][k] = a[r][k] ^ init[k];
}
//与Key加密的单切片
for(int j=;j<encLen;j++)
{
encQue[j] = a[r][j];
}
encode(encQue); //切片加密
//添加到密文表中
for(int p=;p<encLen;p++)
{
ciphertext[dataCount] = encQue[p];
dataCount++;
}
//变换初始输入
for(int t=;t<encLen;t++)
{
init[t] = encQue[t];
}
} cout<<"CCB加密的密文为:"<<endl;
for(int t1=;t1<dataLen;t1++) //输出密文
{
if(t1!= && t1%==)
cout<<endl;
cout<<ciphertext[t1]<<" ";
}
cout<<endl;
cout<<"---------------------------------------------"<<endl;
}
//CBC
//密码分组链接模式,4位分段
void CCB(int arr[])
{
//数据明文切片
int a[][];
int dataCount = ; //位置变量
for(int k=;k<;k++)
{
for(int t=;t<;t++)
{
a[k][t] = data[dataCount];
dataCount++;
}
}
dataCount = ;//重置位置变量 int init[] = {,,,}; //初始异或运算输入
//初始异或运算
for(int i=;i<dataLen;i=i+encLen)
{
int r = i/encLen;//行
int l = ;//列
int encQue[]; //编码片段
//初始化异或运算
for(int k=;k<encLen;k++)
{
a[r][k] = a[r][k] ^ init[k];
}
//与Key加密的单切片
for(int j=;j<encLen;j++)
{
encQue[j] = a[r][j];
}
encode(encQue); //切片加密
//添加到密文表中
for(int p=;p<encLen;p++)
{
ciphertext[dataCount] = encQue[p];
dataCount++;
}
//变换初始输入
for(int t=;t<encLen;t++)
{
init[t] = encQue[t];
}
} cout<<"CCB加密的密文为:"<<endl;
for(int t1=;t1<dataLen;t1++) //输出密文
{
if(t1!= && t1%==)
cout<<endl;
cout<<ciphertext[t1]<<" ";
}
cout<<endl;
cout<<"---------------------------------------------"<<endl;
}

计算器模式Counter (CTR)

概述

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

特点分析

优点:

  • 无填
  • 同明文不同密
  • 每个块单独运算,适合并行运算。

缺点:

  • 可能导致明文攻击。

代码演示

#include <iostream>
using namespace std; //加密编码过程函数,16位1和0
int dataLen = ; //需要加密数据的长度
int encLen = ; //加密分段的长度
int encTable[] = {,,,}; //置换表
int data[] = {,,,,,,,,,,,,,,,}; //明文
int ciphertext[]; //密文 //切片加密函数
void encode(int arr[])
{
for(int i=;i<encLen;i++)
{
arr[i] = arr[i] ^ encTable[i];
}
}
//CTR
//计算器模式,4位分段
void CTR(int arr[])
{
//数据明文切片
int a[][];
int dataCount = ; //位置变量
for(int k=;k<;k++)
{
for(int t=;t<;t++)
{
a[k][t] = data[dataCount];
dataCount++;
}
}
dataCount = ;//重置位置变量 int init[][] = {{,,,},{,,,},{,,,},{,,,}}; //算子表
int l = ; //明文切片表列
//初始异或运算
for(int i=;i<dataLen;i=i+encLen)
{
int r = i/encLen;//行
int encQue[]; //编码片段
//将算子切片
for(int t=;t<encLen;t++)
{
encQue[t] = init[r][t];
}
encode(encQue); //算子与key加密
//最后的异或运算
for(int k=;k<encLen;k++)
{
encQue[k] = encQue[k] ^ a[l][k];
}
l++; //添加到密文表中
for(int p=;p<encLen;p++)
{
ciphertext[dataCount] = encQue[p];
dataCount++;
}
} cout<<"CTR加密的密文为:"<<endl;
for(int t1=;t1<dataLen;t1++) //输出密文
{
if(t1!= && t1%==)
cout<<endl;
cout<<ciphertext[t1]<<" ";
}
cout<<endl;
cout<<"---------------------------------------------"<<endl;
}

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

概述

特点分析

优点:

  • 隐藏了明文模式;
  • 分组密码转化为流模式;
  • 可以及时加密传送小于分组的数据;

缺点:

  • 不利于并行计算;
  • 误差传送:一个明文单元损坏影响多个单元;
  • 唯一的IV;。

代码演示

/**
*@autho stardust
*@time 2013-10-10
*@param 实现AES五种加密模式的测试
*/
#include <iostream>
using namespace std; //加密编码过程函数,16位1和0
int dataLen = ; //需要加密数据的长度
int encLen = ; //加密分段的长度
int encTable[] = {,,,}; //置换表
int data[] = {,,,,,,,,,,,,,,,}; //明文
int ciphertext[]; //密文 //切片加密函数
void encode(int arr[])
{
for(int i=;i<encLen;i++)
{
arr[i] = arr[i] ^ encTable[i];
}
}
//CFB
//密码反馈模式,4位分段
void CFB(int arr[])
{
//数据明文切片,切成2 * 8 片
int a[][];
int dataCount = ; //位置变量
for(int k=;k<;k++)
{
for(int t=;t<;t++)
{
a[k][t] = data[dataCount];
dataCount++;
}
}
dataCount = ; //恢复初始化设置
int lv[] = {,,,}; //初始设置的位移变量
int encQue[]; //K的高两位
int k[]; //K for(int i=;i< * encLen;i++) //外层加密循环
{
//产生K
for(int vk=;vk<encLen;vk++)
{
k[vk] = lv[vk];
}
encode(k);
for(int k2=;k2<;k2++)
{
encQue[k2] = k[k2];
}
//K与数据明文异或产生密文
for(int j=;j<;j++)
{
ciphertext[dataCount] = a[dataCount/][j] ^ encQue[j];
dataCount++;
}
//lv左移变换
lv[] = lv[];
lv[] = lv[];
lv[] = ciphertext[dataCount-];
lv[] = ciphertext[dataCount-];
} cout<<"CFB加密的密文为:"<<endl;
for(int t1=;t1<dataLen;t1++) //输出密文
{
if(t1!= && t1%==)
cout<<endl;
cout<<ciphertext[t1]<<" ";
}
cout<<endl;
cout<<"---------------------------------------------"<<endl;
}

输出反馈模式Output FeedBack (OFB)

概述

特点分析

优点:

  • 同明文不同密文,分组密钥转换为流密码。

缺点:

  • 串行运算不利并行
  • 传输错误可能导致后续传输块错误。

代码演示

/**
*@autho stardust
*@time 2013-10-10
*@param 实现AES五种加密模式的测试
*/
#include <iostream>
using namespace std; //加密编码过程函数,16位1和0
int dataLen = ; //需要加密数据的长度
int encLen = ; //加密分段的长度
int encTable[] = {,,,}; //置换表
int data[] = {,,,,,,,,,,,,,,,}; //明文
int ciphertext[]; //密文 //切片加密函数
void encode(int arr[])
{
for(int i=;i<encLen;i++)
{
arr[i] = arr[i] ^ encTable[i];
}
}
//OFB
//输出反馈模式,4位分段
void OFB(int arr[])
{
//数据明文切片,切成2 * 8 片
int a[][];
int dataCount = ; //位置变量
for(int k=;k<;k++)
{
for(int t=;t<;t++)
{
a[k][t] = data[dataCount];
dataCount++;
}
}
dataCount = ; //恢复初始化设置
int lv[] = {,,,}; //初始设置的位移变量
int encQue[]; //K的高两位
int k[]; //K for(int i=;i< * encLen;i++) //外层加密循环
{
//产生K
for(int vk=;vk<encLen;vk++)
{
k[vk] = lv[vk];
}
encode(k);
for(int k2=;k2<;k2++)
{
encQue[k2] = k[k2];
}
//K与数据明文异或产生密文
for(int j=;j<;j++)
{
ciphertext[dataCount] = a[dataCount/][j] ^ encQue[j];
dataCount++;
}
//lv左移变换
lv[] = lv[];
lv[] = lv[];
lv[] = encQue[];
lv[] = encQue[];
} cout<<"CFB加密的密文为:"<<endl;
for(int t1=;t1<dataLen;t1++) //输出密文
{
if(t1!= && t1%==)
cout<<endl;
cout<<ciphertext[t1]<<" ";
}
cout<<endl;
cout<<"---------------------------------------------"<<endl;
}

Aes加密算法加密模式介绍的更多相关文章

  1. openssl之aes加密(源码分析 AES_encrypt 与 AES_cbc_encrypt ,加密模式)

    首先要了解AES加密是什么,以及几种加密模式的区别.之后才是编程.具体的编程案例,在下面的链接. openssl之aes加密(AES_cbc_encrypt 与 AES_encrypt 的编程案例) ...

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

    --转载https://www.cnblogs.com/starwolf/p/3365834.html https://www.freebuf.com/column/171939.html 分组密码有 ...

  3. AES中ECB模式的加密与解密(Python3.7)

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

  4. When I see you again(加密原理介绍,代码实现DES、AES、RSA、Base64、MD5)

    关于网络安全的数据加密部分,本来打算总结一篇博客搞定,没想到东西太多,这已是第三篇了,而且这篇写了多次,熬了多次夜,真是again and again.起个名字:数据加密三部曲,前两部链接如下: 整体 ...

  5. 加密原理介绍,代码实现DES、AES、RSA、Base64、MD5

    阅读目录 github下载地址 一.DES对称加密 二.AES对称加密 三.RSA非对称加密 四.实际使用 五.关于Padding 关于电脑终端Openssl加密解密命令 关于网络安全的数据加密部分, ...

  6. 【java编程】加密算法-对称加密及AES加密算法

    转载:https://www.jianshu.com/p/3840b344b27c?utm_campaign=maleskine&utm_content=note&utm_medium ...

  7. 无线路由器的加密模式WEP,WPA-PSK(TKIP),WPA2-PSK(AES) WPA-PSK(TKIP)+WPA2-PSK(AES)。

    目前无线路由器里带有的加密模式主要有:WEP,WPA-PSK(TKIP),WPA2-PSK(AES)和WPA-PSK(TKIP)+WPA2-PSK(AES). WEP(有线等效加密)WEP是Wired ...

  8. AES采用CBC模式128bit加密工具类

    写在前面 安全测试ECB模式过于简单需要改为CBC模式加密以下为工具类及测试 AESUtils.java package com.sgcc.mobile.utils; import sun.misc. ...

  9. Qt使用AES加密算法对字符串进行加密

          因工作需要,需要对字符串进行加密处理,在网上找了很长时间,终于找到了一个可以使用的aes加密算法.其源代码采用c++编写而成,但其头文件引用windows.h,经过修改部分代码,将#inc ...

随机推荐

  1. vue.js 调用iOS原生方法,JavaScriptCore

    1. 2. 3. 4.vue.js调用

  2. JavaEE之动态代理

    jdk动态代理主要使用的是java反射机制(既java.lang.reflect包) 动态代理:程序运行时,使用JDK提供工具类(Proxy),动态创建一个类,此类一般用于代理. 代理类需要实现Inv ...

  3. 基于 CodeIgniter 的各类开源项目大全

    名称:STBlog 介绍:STBlog 是一套由CI中国社区驱动,基于Codeigniter MVC 框架编写的多权限博客系统,轻巧/快速/安全/易拓展/界面友好是它的最大特点. 官方:http:// ...

  4. windchill系统——开发_菜单栏添加选项(模型添加action)

    目录:C:\ptc\Windchill_11.0\Windchill\codebase\config\actions 文件:custom-actionModels.xml和custom-actions ...

  5. 关于Node.js的__dirname,__filename,process.cwd(),./文件路径的一些坑

    探索 计算机不会欺骗人,一切按照规则执行,说找不到这个文件,那肯定就是真的找不到,至于为什么找不到,那就是因为我们理解有偏差,我最初理解的'./'是当前执行js文件所在的文件夹的绝对路径,然后Node ...

  6. Ajax -- 原理及简单示例

    1. 什么是Ajax •Ajax被认为是(AsynchronousJavaScript and XML的缩写).现在,允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做Ajax. 2. Ajax ...

  7. scala学习手记24 - 多参数函数值

    上一节的函数值只有一个参数.函数值当然也是可以有多个参数的.看一下下面的inject方法: def inject(arr: Array[Int], initial: Int, operation: ( ...

  8. ubuntu 14.04中安装 ruby on rails 环境(填坑版) 呕血推荐

    环境:在win7 上Vmware虚拟机环境中安装的ubuntu 14.04 开发相关: ruby 2.2.0 rails 4.2.0 sublime text 3 本文说明:所有的命令均在$ 之后,若 ...

  9. TextView两种显示link的方法

    TextView两种显示link的方法 一.简介 也是TextView显示文本控件两种方法 也是显示丰富的文本 二.方法 TextView两种显示link的方法  1)通过TextView里面的类ht ...

  10. python脚本3_输入若干个整数打印出最大值

    #输入若干个整数,打印出最大值 # m = int(input('Input first number >>>')) while True: c = input('Input a n ...