aescfb加密_密码之AES五种加密模式(CBC、ECB、CTR、OCF、CFB)

本文介绍了AES加密的五种模式:ECB(电码本模式)、CBC(密码分组链接模式)、CTR(计算器模式)、CFB(密码反馈模式)和OFB(输出反馈模式)。详细讲解了每种模式的工作原理,并提供了简单的C++代码示例。通过这些模式的对比,帮助读者理解不同加密模式的特点和应用场景。
摘要由CSDN通过智能技术生成

转:https://www.cnblogs.com/starwolf/p/3365834.html

分组密码有五种工作体制:

1.电码本模式(Electronic Codebook Book (ECB));

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

3.计算器模式(Counter (CTR));

4.密码反馈模式(Cipher FeedBack (CFB));

5.输出反馈模式(Output FeedBack (OFB))。

以下逐一介绍一下:

1.电码本模式(Electronic Codebook Book (ECB)

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

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

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

3.计算器模式(Counter (CTR))

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

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

5.输出反馈模式(Output FeedBack (OFB))

这种模式较复杂。

以下附上C++源代码:

/**

*@autho stardust

*@time 2013-10-10

*@param 实现AES五种加密模式的测试

*/

#include using namespace std;

//加密编码过程函数,16位1和0

int dataLen = 16; //需要加密数据的长度

int encLen = 4; //加密分段的长度

int encTable[4] = {1,0,1,0}; //置换表

int data[16] = {1,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0}; //明文

int ciphertext[16]; //密文

//切片加密函数

void encode(int arr[])

{

for(int i=0;i

{

arr[i] = arr[i] ^ encTable[i];

}

}

//电码本模式加密,4位分段

void ECB(int arr[])

{

//数据明文切片

int a[4][4];

int dataCount = 0; //位置变量

for(int k=0;k<4;k++)

{

for(int t=0;t<4;t++)

{

a[k][t] = data[dataCount];

dataCount++;

}

}

dataCount = 0;//重置位置变量

for(int i=0;i

{

int r = i/encLen;//行

int l = 0;//列

int encQue[4]; //编码片段

for(int j=0;j

{ encQue[j] = a[r][l]; l++; }

encode(encQue); //切片加密

//添加到密文表中

for(int p=0;p

{ ciphertext[dataCount] = encQue[p]; dataCount++; }

}

cout<

for(int t1=0;t1

{ if(t1!=0 && t1%4==0) cout<

cout<

cout<

}

//CBC

//密码分组链接模式,4位分段

void CCB(int arr[])

{

//数据明文切片

int a[4][4];

int dataCount = 0; //位置变量

for(int k=0;k<4;k++)

{

for(int t=0;t<4;t++)

{ a[k][t] = data[dataCount]; dataCount++; }

}

dataCount = 0;//重置位置变量

int init[4] = {1,1,0,0}; //初始异或运算输入

//初始异或运算

for(int i=0;i

{

int r = i/encLen;//行

int l = 0;//列

int encQue[4]; //编码片段

//初始化异或运算

for(int k=0;k

{ a[r][k] = a[r][k] ^ init[k]; }

//与Key加密的单切片

for(int j=0;j

{ encQue[j] = a[r][j]; }

encode(encQue);

//切片加密

//添加到密文表中

for(int p=0;p

{ ciphertext[dataCount] = encQue[p]; dataCount++; }

//变换初始输入

for(int t=0;t

{ init[t] = encQue[t]; }

}

cout<

for(int t1=0;t1

{

if(t1!=0 && t1%4==0)

cout<

cout<

}

cout<

cout<

}

//CTR

//计算器模式,4位分段

void CTR(int arr[])

{

//数据明文切片

int a[4][4];

int dataCount = 0; //位置变量

for(int k=0;k<4;k++)

{

for(int t=0;t<4;t++)

{ a[k][t] = data[dataCount]; dataCount++; }

}

dataCount = 0;//重置位置变量

int init[4][4] = {{1,0,0,0},{0,0,0,1},{0,0,1,0},{0,1,0,0}}; //算子表

int l = 0; //明文切片表列

//初始异或运算

for(int i=0;i

{

int r = i/encLen;//行

int encQue[4]; //编码片段

//将算子切片

for(int t=0;t

{ encQue[t] = init[r][t]; }

encode(encQue); //算子与key加密

//最后的异或运算

for(int k=0;k

{ encQue[k] = encQue[k] ^ a[l][k]; }

l++;

//添加到密文表中

for(int p=0;p

{ ciphertext[dataCount] = encQue[p]; dataCount++; }

}

cout<

for(int t1=0;t1

{

if(t1!=0 && t1%4==0) cout<

}

cout<

}

//CFB

//密码反馈模式,4位分段

void CFB(int arr[])

{

//数据明文切片,切成2 * 8 片

int a[8][2];

int dataCount = 0; //位置变量

for(int k=0;k<8;k++)

{

for(int t=0;t<2;t++)

{ a[k][t] = data[dataCount]; dataCount++; }

}

dataCount = 0; //恢复初始化设置

int lv[4] = {1,0,1,1}; //初始设置的位移变量

int encQue[2]; //K的高两位

int k[4]; //K

for(int i=0;i<2 * encLen;i++) //外层加密循环

{

//产生K

for(int vk=0;vk

{ k[vk] = lv[vk]; }

encode(k);

for(int k2=0;k2<2;k2++)

{ encQue[k2] = k[k2]; }

//K与数据明文异或产生密文

for(int j=0;j<2;j++)

{

ciphertext[dataCount] = a[dataCount/2][j] ^ encQue[j];

dataCount++;

} //lv左移变换

lv[0] = lv[2];

lv[1] = lv[3];

lv[2] = ciphertext[dataCount-2];

lv[3] = ciphertext[dataCount-1];

}

cout<

for(int t1=0;t1

{ if(t1!=0 && t1%4==0) cout<

cout<

}

//OFB

//输出反馈模式,4位分段

void OFB(int arr[])

{

//数据明文切片,切成2 * 8 片

int a[8][2];

int dataCount = 0; //位置变量

for(int k=0;k<8;k++)

{

for(int t=0;t<2;t++)

{ a[k][t] = data[dataCount]; dataCount++; }

}

dataCount = 0; //恢复初始化设置

int lv[4] = {1,0,1,1}; //初始设置的位移变量

int encQue[2]; //K的高两位

int k[4]; //K

for(int i=0;i<2 * encLen;i++) //外层加密循环

{

//产生K

for(int vk=0;vk

{

k[vk] = lv[vk];

}

encode(k);

for(int k2=0;k2<2;k2++)

{

encQue[k2] = k[k2];

}

//K与数据明文异或产生密文

for(int j=0;j<2;j++)

{ ciphertext[dataCount] = a[dataCount/2][j] ^ encQue[j]; dataCount++; }

//lv左移变换

lv[0] = lv[2];

lv[1] = lv[3];

lv[2] = encQue[0];

lv[3] = encQue[1];

}

cout<

for(int t1=0;t1

{ if(t1!=0 && t1%4==0) cout<

cout<

cout<

}

void printData()

{

cout<

cout<

cout<

for(int t1=0;t1

{ if(t1!=0 && t1%4==0) cout<

cout<

cout<

}

int main()

{

printData();

ECB(data);

CCB(data);

CTR(data);

CFB(data);

OFB(data);

return 0;

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值