本文转自: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. react-native navigation的学习与使用

    在很久之前,RN中文网说推荐用react-navigation替代navigator作为新的导航库,从RN 0.43版本开始,官方就已经停止维护Navigator了,所以强烈建议大家迁移到新的reac ...

  2. Python 类的三大特性的综合运用 案例

    # --------------------- 类的三大特性的综合运用 案例 ------------------------- # 定义三个类:小狗,小猫,人 # 小狗:姓名,年龄(默认1岁) 吃饭 ...

  3. centos7下安装ngnix1.8.1

    参考 http://www.linuxidc.com/Linux/2016-09/134907.htm 安装依赖 openssl zlib pcre gcc 下载安装包 [root@localhost ...

  4. Jar 包 及运行Jar包 - 转载

    Eclipse的jar file和Runnable JAR file的区别 - 及bat运行Runnable JAR文件 1.两种jar的区别 jar file是最普通的jar包,即平时我们工程中li ...

  5. Git 更改远程地址

    查看远程地址 git remote -v 更换远程地址 git remote set-url origin 新的地址 更换之后可以查看一下 这个非常实用. 通常我们把gitlab服务器更换的时候,对应 ...

  6. 入门教程:.NET开源OpenID Connect 和OAuth解决方案IdentityServer v3 介绍 (一)

    现代的应用程序看起来像这样: 典型的交互操作包括: 浏览器与 web 应用程序进行通信 Web 应用程序与 web Api (有时是在他们自己的有时代表用户) 通信 基于浏览器的应用程序与 web A ...

  7. Java中异常的捕获顺序(多个catch)

    import java.io.IOException; public class ExceptionTryCatchTest { public void doSomething() throws IO ...

  8. Java class、Object、Class 的区别

    Java的对象模型中: 所有的类都是Class类的实例,Object是类,那么Object也是Class类的一个实例. 所有的类都最终继承自Object类,Class是类,那么Class也继承自Obj ...

  9. npm的镜像和淘宝互换

    1.得到原本的镜像地址 npm get registry > https://registry.npmjs.org/ 设成淘宝的 npm config set registry http://r ...

  10. day5-随机数相关:random模块&string模块

    一.概述 随机数在程序设计中的属于比较基础的内容,主要用于验证场景(如验证码,生成账号对应的密码等),今天结合random模块和string模块来谈谈python中随机数那些事儿. 二.随机数实现相关 ...