Aes加密算法加密模式介绍
本文转自: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加密算法加密模式介绍的更多相关文章
- openssl之aes加密(源码分析 AES_encrypt 与 AES_cbc_encrypt ,加密模式)
首先要了解AES加密是什么,以及几种加密模式的区别.之后才是编程.具体的编程案例,在下面的链接. openssl之aes加密(AES_cbc_encrypt 与 AES_encrypt 的编程案例) ...
- AES五种加密模式(CBC、ECB、CTR、OCF、CFB)
--转载https://www.cnblogs.com/starwolf/p/3365834.html https://www.freebuf.com/column/171939.html 分组密码有 ...
- AES中ECB模式的加密与解密(Python3.7)
本文主要解决的问题 本文主要是讲解AES加密算法中的ECB模式的加密解密的Python3.7实现.具体AES加密算法的原理这里不做过多介绍,想了解的可以参考文末的参考链接. 主要解决了两个问题: 在P ...
- When I see you again(加密原理介绍,代码实现DES、AES、RSA、Base64、MD5)
关于网络安全的数据加密部分,本来打算总结一篇博客搞定,没想到东西太多,这已是第三篇了,而且这篇写了多次,熬了多次夜,真是again and again.起个名字:数据加密三部曲,前两部链接如下: 整体 ...
- 加密原理介绍,代码实现DES、AES、RSA、Base64、MD5
阅读目录 github下载地址 一.DES对称加密 二.AES对称加密 三.RSA非对称加密 四.实际使用 五.关于Padding 关于电脑终端Openssl加密解密命令 关于网络安全的数据加密部分, ...
- 【java编程】加密算法-对称加密及AES加密算法
转载:https://www.jianshu.com/p/3840b344b27c?utm_campaign=maleskine&utm_content=note&utm_medium ...
- 无线路由器的加密模式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 ...
- AES采用CBC模式128bit加密工具类
写在前面 安全测试ECB模式过于简单需要改为CBC模式加密以下为工具类及测试 AESUtils.java package com.sgcc.mobile.utils; import sun.misc. ...
- Qt使用AES加密算法对字符串进行加密
因工作需要,需要对字符串进行加密处理,在网上找了很长时间,终于找到了一个可以使用的aes加密算法.其源代码采用c++编写而成,但其头文件引用windows.h,经过修改部分代码,将#inc ...
随机推荐
- vue.js 调用iOS原生方法,JavaScriptCore
1. 2. 3. 4.vue.js调用
- JavaEE之动态代理
jdk动态代理主要使用的是java反射机制(既java.lang.reflect包) 动态代理:程序运行时,使用JDK提供工具类(Proxy),动态创建一个类,此类一般用于代理. 代理类需要实现Inv ...
- 基于 CodeIgniter 的各类开源项目大全
名称:STBlog 介绍:STBlog 是一套由CI中国社区驱动,基于Codeigniter MVC 框架编写的多权限博客系统,轻巧/快速/安全/易拓展/界面友好是它的最大特点. 官方:http:// ...
- windchill系统——开发_菜单栏添加选项(模型添加action)
目录:C:\ptc\Windchill_11.0\Windchill\codebase\config\actions 文件:custom-actionModels.xml和custom-actions ...
- 关于Node.js的__dirname,__filename,process.cwd(),./文件路径的一些坑
探索 计算机不会欺骗人,一切按照规则执行,说找不到这个文件,那肯定就是真的找不到,至于为什么找不到,那就是因为我们理解有偏差,我最初理解的'./'是当前执行js文件所在的文件夹的绝对路径,然后Node ...
- Ajax -- 原理及简单示例
1. 什么是Ajax •Ajax被认为是(AsynchronousJavaScript and XML的缩写).现在,允许浏览器与服务器通信而无须刷新当前页面的技术都被叫做Ajax. 2. Ajax ...
- scala学习手记24 - 多参数函数值
上一节的函数值只有一个参数.函数值当然也是可以有多个参数的.看一下下面的inject方法: def inject(arr: Array[Int], initial: Int, operation: ( ...
- ubuntu 14.04中安装 ruby on rails 环境(填坑版) 呕血推荐
环境:在win7 上Vmware虚拟机环境中安装的ubuntu 14.04 开发相关: ruby 2.2.0 rails 4.2.0 sublime text 3 本文说明:所有的命令均在$ 之后,若 ...
- TextView两种显示link的方法
TextView两种显示link的方法 一.简介 也是TextView显示文本控件两种方法 也是显示丰富的文本 二.方法 TextView两种显示link的方法 1)通过TextView里面的类ht ...
- python脚本3_输入若干个整数打印出最大值
#输入若干个整数,打印出最大值 # m = int(input('Input first number >>>')) while True: c = input('Input a n ...