博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
实现五种分组加密模式ECB,CBC,CFB,OFB,CTR
阅读量:5965 次
发布时间:2019-06-19

本文共 4041 字,大约阅读时间需要 13 分钟。

没什么好说的,简单无脑!

#include<iostream>

using namespace std;

int ECB()

{
int duan[4];
int messageLen = 16; //需要加密数据的长度
int encLen = 4; //加密分段的长度
int key[4] = {1,0,1,0}; // ECB OFB CFB CTR 初始密码 CBC IV
// CTR 计数器从0开始,每组二进制加1,大小 4*sizeof(int)
int initVec[8] = {0,1,1,0,1,0,0,1};
int message[16] = {1,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0}; //明文
int ciphertext[16]; //密文
int a;
a = messageLen/encLen;
int b=0;
int c=0;
for(int i=1;i<=a;i++)
{
for(int j=0;j<4;j++)
{
c=b+j;
duan[j]=message[c];
if(duan[j]==key[j])
{
duan[j]=0;
}
else
{
duan[j]=1;
}
ciphertext[c]=duan[j];
}
b=b+encLen;
}
for(int w=0;w<messageLen;w++)
{
cout<<ciphertext[w];
cout<<" ";
if(w%4==3)
cout<<endl;
}
return 0;
}

int CBC()

{
int duanchu[4];
int duan[4];
int messageLen = 16; //需要加密数据的长度
int encLen = 4; //加密分段的长度
int key[4] = {1,0,1,0}; // ECB OFB CFB CTR 初始密码 CBC IV
// CTR 计数器从0开始,每组二进制加1,大小 4*sizeof(int)
int initVec[8] = {0,1,1,0,1,0,0,1};
int message[16] = {1,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0}; //明文
int ciphertext[16]; //密文
int a;
a = messageLen/encLen;
int b=0;
int c=0;
for(int o=0;o<4;o++)
{
duanchu[o]=message[o];
}
for(int i=1;i<=a;i++)
{
for(int j=0;j<4;j++)
{
c=b+j;
duan[j]=message[c];
if(duan[j]==duanchu[j])
{
duan[j]=0;
}
else
{
duan[j]=1;
}
if(duan[j]==key[j])
{
duan[j]=0;
}
else
{
duan[j]=1;
}
ciphertext[c]=duan[j];
}
b=b+encLen;
}
for(int w=0;w<messageLen;w++)
{
cout<<ciphertext[w];
cout<<" ";
if(w%4==3)
cout<<endl;
}
return 0;
}

int OFB()

{
int xiangliang[4]={1,0,1,0};
int duan[4];
int messageLen = 16; //需要加密数据的长度
int encLen = 4; //加密分段的长度
int key[4] = {1,0,1,0}; // ECB OFB CFB CTR 初始密码 CBC IV
// CTR 计数器从0开始,每组二进制加1,大小 4*sizeof(int)
int initVec[8] = {0,1,1,0,1,0,0,1};
int message[16] = {1,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0}; //明文
int ciphertext[16]; //密文
int a;
a = messageLen/encLen;
int b=0;
int c=0;
for(int i=1;i<=a;i++)
{
for(int j=0;j<4;j++)
{
c=b+j;
duan[j]=message[c];
if(xiangliang[j]==key[j])
{
xiangliang[j]=0;
}
else
{
xiangliang[j]=1;
}
if(duan[j]==xiangliang[j])
{
duan[j]=0;
}
else
{
duan[j]=1;
}
ciphertext[c]=duan[j];
}
b=b+encLen;
}
for(int w=0;w<messageLen;w++)
{
cout<<ciphertext[w];
cout<<" ";
if(w%4==3)
cout<<endl;
}
return 0;
}

int CFB()

{
int xiangli[6];
int xiangliang[6]={1,0,1,0,0,0};
int duan[4];
int messageLen = 16; //需要加密数据的长度
int encLen = 4; //加密分段的长度
int key[4] = {1,0,1,0}; // ECB OFB CFB CTR 初始密码 CBC IV
// CTR 计数器从0开始,每组二进制加1,大小 4*sizeof(int)
int initVec[8] = {0,1,1,0,1,0,0,1};
int message[16] = {1,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0}; //明文
int ciphertext[16]; //密文
int a;
a = messageLen/encLen;
int b=0;
int c=0;
for(int i=1;i<=a;i++)
{
for(int j=0;j<4;j++)
{
c=b+j;
duan[j]=message[c];
if(xiangliang[j]==key[j])
{
xiangli[j]=0;
}
else
{
xiangli[j]=1;
}
if(duan[j]==xiangli[j])
{
duan[j]=0;
}
else
{
duan[j]=1;
}

ciphertext[c]=duan[j];

}
for(int w=0;w<6;w++)
{
if(w<=1)
{
xiangliang[w]=xiangliang[w+4];
}
else
{
xiangliang[w]=duan[w-2];
}
}
b=b+encLen;
}
for(int w=0;w<messageLen;w++)
{
cout<<ciphertext[w];
cout<<" ";
if(w%4==3)
cout<<endl;
}
return 0;
}

int CTR()

{
int shuchuduan[4];
int couter[4]={0};
int duan[4];
int messageLen = 16; //需要加密数据的长度
int encLen = 4; //加密分段的长度
int key[4] = {1,0,1,0}; // ECB OFB CFB CTR 初始密码 CBC IV
// CTR 计数器从0开始,每组二进制加1,大小 4*sizeof(int)
int initVec[8] = {0,1,1,0,1,0,0,1};
int message[16] = {1,0,0,1,0,0,0,1,1,1,1,1,0,0,0,0}; //明文
int ciphertext[16]; //密文
int a;
a = messageLen/encLen;
int b=0;
int c=0;
for(int i=1;i<=a;i++)
{
for(int j=0;j<4;j++)
{
c=b+j;
duan[j]=message[c];
if(couter[j]==key[j])
{
shuchuduan[j]=0;
}
else
{
shuchuduan[j]=1;
}
if(duan[j]==shuchuduan[j])
{
duan[j]=0;
}
else
{
duan[j]=1;
}
ciphertext[c]=duan[j];
}
b=b+encLen;
for(int s=3;s>=0;s--)
{
if(couter[s]==0)
{
couter[s]=1;
if(s<3)
{
for(int r=3;r>s;r--)
{
couter[r]=0;
}
}
break;
}
}
}
for(int w=0;w<messageLen;w++)
{
cout<<ciphertext[w];
cout<<" ";
if(w%4==3)
cout<<endl;
}
return 0;
}

int main()

{
// show init message
cout<<"ECB"<<endl;
ECB();
cout<<"CBC"<<endl;
CBC();
cout<<"CTR"<<endl;
CTR();
cout<<"CFB"<<endl;
CFB();
cout<<"OFB"<<endl;
OFB();
return 0;
}

 

转载于:https://www.cnblogs.com/CIan-722/p/6701936.html

你可能感兴趣的文章
Spring整合JMS(四)——事务管理
查看>>
设计模式学习笔记(七)之模板方法模式(Template Method)
查看>>
我的友情链接
查看>>
主流原型工具可用性测试横向比较
查看>>
我的友情链接
查看>>
Guava——使用Preconditions做参数校验
查看>>
iSCSI存储用作Proxmox VE的LVM共享存储
查看>>
Sonnet Suite Pro v11.52-ISO 1CD(三维高频电子设计)
查看>>
linux网络
查看>>
我的友情链接
查看>>
linux 系统调优步骤 例
查看>>
显式方法与隐式方法
查看>>
Android防火墙+流量统计代码
查看>>
通知中心
查看>>
我的友情链接
查看>>
MVC中的三个模块
查看>>
Line: 220 - com/opensymphony/xwork2/spring/SpringObjectFactory.java:220:-1
查看>>
oracle 常用命令大汇总
查看>>
2012年春运火车票电话和网上订票技巧、攻略
查看>>
根据request获取请求路径
查看>>