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 ...
随机推荐
- GridView右键菜单
一.添加右键菜单 1.在VS工具箱中的“菜单和工具栏”找到ContextMenuStrip控件,双击添加. 2.点击ContextMenuStrip右上方的小三角形,打开编辑项,可以添加菜单项.至于菜 ...
- Python基础笔记系列一:基本工具与表达式
本系列教程供个人学习笔记使用,如果您要浏览可能需要其它编程语言基础(如C语言),why?因为我写得烂啊,只有我自己看得懂!! 工具基础(Windows系统下)传送门:Python基础笔记系列四:工具的 ...
- excel 拖拽计算时,固定一个数
$ 表示静态引用(也叫绝对引用)的意思.即固定引用的单元格的行或列. $A1即固定列为A,$A$2即固定引用为A列2行的单元格. A$3则只固定引用为第三行. 我们在使用excel拖拽计算时,常遇到这 ...
- 关于VirtualBox在桥接模式下无法联网解决方案
关于VirtualBox在桥接模式下无法联网 解决方案VirtualBox与笔记本无线网卡桥接 如果重新开机连接不上,可能需要重新共享一下,(重新给桥接网卡分配与当前物理机IP在同一局域网段的IP) ...
- BZOJ 3329 Xorequ:数位dp + 矩阵快速幂
传送门 题意 现有如下方程:$ x \oplus 3x = 2x $ 其中 $ \oplus $ 表示按位异或. 共 $ T $ 组数据,每组数据给定正整数 $ n $,任务如下: 求出小于等于 $ ...
- mysql中的左连接右连接内连接
一. 初始化SQL语句 /*join 建表语句*/ drop database if exists test; create database test; use test; /* 左表t1*/ dr ...
- 【Hive】执行脚本
1.linux下执行hive sql脚本 (1)hive -e “sql语句” (2)hive -e “sql语句” >> xxx 将sql查出来的语句重定向到xxx文件中,会显示Ok和数 ...
- jQuery 图片自动播放
var imgArray = new Array("images/1.jpg", "images/2.jpg","images/3.jpg" ...
- 【poj2155】Matrix(二维树状数组区间更新+单点查询)
Description Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the ...
- 事件穿透父层 直达子层 pointer-events:none
之前我也做过一些canvas特效,往往在canvas全屏时,canvas下层的div就无法进行dom的事件操作,点击之类的就失灵了.之前我的做法要么就是在canvas上加入点击事件,穿透到下层,或者把 ...