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 ...
随机推荐
- 【React Native开发】React Native进行签名打包成Apk
转载请标明出处: http://blog.csdn.net/developer_jiangqq/article/details/50525976 本文出自:[江清清的博客] (一)前言 [好消息]个人 ...
- 利用canvas和RGraph作图
利用canvas可以直接在页面中绘制各种复杂的图形,其中引用到一个Rgraph的插件. Rgraph插件使用非常方便,只需几步就可以完成一个折线图.饼图.柱状图,或是其中两者图形的结合! (1) 引用 ...
- 并发-AQS源码分析
AQS源码分析 参考: http://www.cnblogs.com/waterystone/p/4920797.html https://blog.csdn.net/fjse51/article/d ...
- LeetCode——Construct the Rectangle
LeetCode--Construct the Rectangle Question For a web developer, it is very important to know how to ...
- c语言字符处理函数常见使用集合
1.最近看一些开源项目代码时,总会看到 c 语言中一些 "str" 开头的处理字符串的用法,有的之前没用到过,特此记录,随时看到随时添加. 这里不提出源码,只是一些使用说明加例子 ...
- LeetCode第[5]题(Java):Longest Palindromic Substring 标签:String、动态规划
题目中文:求最长回文子串 题目难度:Medium 题目内容: Given a string s, find the longest palindromic substring in s. You ma ...
- postgresql centos6.5安装以及常用命令
今天在centos6.5下安装postgresql数据库,现在整理自己操作步骤. 一. Centos6.5 下安装postgresql9.4 1.1. 显示所有的有关postgresql安装包 yum ...
- 接口测试工具---postman下载地址
接口测试工具---postman下载地址: https://app.getpostman.com/app/download/win64?_ga=2.3555895.622696496.15081214 ...
- uva 11825 巧妙地子集枚举方法
https://vjudge.net/problem/UVA-11825 题目大意,有n台服务器,有n种服务,每台服务器都运行着所有的服务,一台服务器可以被攻击一次其中的一种服务,当你选择攻击某台服务 ...
- ipmitool 查看硬件信息
[root@75-6-25-yf-core ~]# cat /var/log/mcelog MCE 0HARDWARE ERROR. This is *NOT* a software problem! ...