// AES.cpp : 定义控制台应用程序的入口点。
//
#include<iostream>
using namespace std;
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define N_ROUND 11
#define NK 4
#define NB 4
#define NR 10
typedef struct {
int *base;
int *top;
int stacksize;
}SqStack;
SqStack S;
void InitStack(SqStack &S1)
{
S1.base=(int *)malloc( STACK_INIT_SIZE * sizeof(int));
S1.top=S1.base;
S1.stacksize=STACK_INIT_SIZE;
}
void Push(SqStack &S2,int e)
{
*S2.top++=e;
}
void Pop(SqStack &S3,int &e)
{
e=*--S3.top;
}
void tentosixteen(int a[4][4],string b[4][4])
{ InitStack(S);
cout<<"转成的十六进制数是:"<<endl;
int i,j;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
if(a[i][j]==0)
Push(S,0);
while(a[i][j])
{
Push(S,a[i][j]%16);
a[i][j]=a[i][j]/16;
}
while(S.top!=S.base)
{
int e;
Pop(S,e);
switch(e)
{
case 0:
b[i][j].append("0");
break;
case 1:
b[i][j].append("1");
break;
case 2:
b[i][j].append("2");
break;
case 3:
b[i][j].append("3");
break;
case 4:
b[i][j].append("4");
break;
case 5:
b[i][j].append("5");
break;
case 6:
b[i][j].append("6");
break;
case 7:
b[i][j].append("7");
break;
case 8:
b[i][j].append("8");
break;
case 9:
b[i][j].append("9");
break;
case 10:
b[i][j].append("a");
break;
case 11:
b[i][j].append("b");
break;
case 12:
b[i][j].append("c");
break;
case 13:
b[i][j].append("d");
break;
case 14:
b[i][j].append("e");
break;
case 15:
b[i][j].append("f");
break;
}
}
}
}
}
void add(int plain[4][4],int round[4][4],int addkey[4][4]){
int i=0,j=0;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
addkey[i][j]=(plain[i][j])^(round[i][j]);
}
}
}
void s_shift(int sbox[256],int addkey[4][4],int s[4][4]){
int temp,i,j;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
temp=addkey[i][j];
s[i][j]=sbox[temp];
}
}
}
void row_shift(int s[4][4]){
int j,temp;
//**************第二行
temp=s[1][0];
for(j=1;j<4;j++){
s[1][(j-1+4)%4]=s[1][(j+4)%4];
}
s[1][3]=temp;
//**************第三行
for(j=0;j<2;j++){
temp=s[2][j];
s[2][j]=s[2][j+2];
s[2][j+2]=temp;
}
//**************第四行
temp=s[3][3];
for(j=3;j>0;j--){
s[3][j]=s[3][j-1];
}
s[3][0]=temp;
}
int multiply(int n,int e){
while(n> 0x01){
if((e & 0x80)==0)
{
e=(e*2) % 256;
}
else if((e & 0x80)!=0)
{
e=((e*2) % 256)^0x1b;
}
n=n>>1;
}
return e;
}
void mix(int s[4][4],int a[4][4],int cipher[4][4]){
int i,j,k=0;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
for(k=0;k<4;k++){
if(a[i][k]==0x03)
{ if((s[k][j]&0x80)==0)
{
cipher[i][j]=cipher[i][j]^(s[k][j]^((s[k][j]*2)%256));
}
else if((s[k][j]&0x80)!=0)
{
cipher[i][j]=cipher[i][j]^(s[k][j]^(((s[k][j]*2)%256)^0x1b));
}
}
else if(a[i][k]==0x02)
{
if((s[k][j]&0x80)==0)
{
cipher[i][j]=cipher[i][j]^((s[k][j]*2)%256);
}
else if((s[k][j]&0x80)!=0)
{
cipher[i][j]=cipher[i][j]^(((s[k][j]*2)%256)^0x1b);
}
}
else if(a[i][k]==0x01)
{
cipher[i][j]=cipher[i][j]^s[k][j];
}
}
}
}
}
void inv_mix(int s[4][4],int inv_a[4][4],int state[4][4]){
int i,j,k=0;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
for(k=0;k<4;k++){
if(inv_a[i][k]==0x0e)
{
state[i][j]=state[i][j]^((multiply(0x02,s[k][j]))^(multiply(0x04,s[k][j]))^(multiply(0x08,s[k][j])));
}
else if(inv_a[i][k]==0x0d)
{
state[i][j]=state[i][j]^(s[k][j]^(multiply(0x04,s[k][j]))^(multiply(0x08,s[k][j])));
}
else if(inv_a[i][k]==0x0b)
{
state[i][j]=state[i][j]^(s[k][j]^(multiply(0x02,s[k][j]))^(multiply(0x08,s[k][j])));
}
else if(inv_a[i][k]==0x09){
state[i][j]=state[i][j]^(s[k][j]^(multiply(0x08,s[k][j])));
}
}
}
}
}
void RotWord(int a[4][1]){
int temp=0;
temp=a[0][0];
for(int i=1;i<4;i++){
a[i-1][0]=a[i][0];
}
a[3][0]=temp;
}
void subword(int b[4][1],int sbox[256]){
for(int i=0;i<4;i++){
b[i][0]=sbox[b[i][0]];
}
}
void keyExpantion(int key[4][NK],int w[4][NB*(NR+1)],int sbox[256])
{
int temp[4][1];
int i=0,j=0;
const int Rcon[4][NR+1]={
{0x00,0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80,0x1b,0x36},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
{0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}};
while(i<NK){
for(j=0;j<4;j++){
w[j][i]=key[j][i];
}
i++;
}
i=NK;
while(i<NB*(NR+1)){
for(j=0;j<4;j++){
temp[j][0]=w[j][i-1];
}
if(i%NK==0){
RotWord(temp);
subword(temp,sbox);
for(j=0;j<4;j++){
temp[j][0]=temp[j][0]^Rcon[j][i/NK];
}
}
else if((NK>6)&&(i%NK==4)){
subword(temp,sbox);
for(j=0;j<4;j++){
temp[j][0]=temp[j][0];
}
}
for(j=0;j<4;j++){
w[j][i]=w[j][i-NK]^temp[j][0];
}
i++;
}
}
void encryption(int plain[4][4],int w[4][NB*(NR+1)],int sbox[256],int a[4][4],int cipher[4][4],int state[4][4],int s[4][4],int state1[4][4]){
int roundkey[4][4];
int i=0,j=0,m=0;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
roundkey[i][j]=0;
}
}
//首先明文和第一轮密钥异或运算
for(i=0;i<4;i++){
for(j=0;j<4;j++){
roundkey[i][j]=w[i][j];
}
}
add(plain,roundkey,state);
//中间9轮循环
for(m=1;m<NR;m++){
for(i=0;i<4;i++){
for(j=0;j<4;j++){
roundkey[i][j]=w[i][4*m+j];
}
}
s_shift(sbox,state,s);
row_shift(s);
for(i=0;i<4;i++){
for(j=0;j<4;j++){
state1[i][j]=0;
}
}
mix(s,a,state1);
add(state1,roundkey,state);
}
m=NR;
//最后一轮
for(i=0;i<4;i++){
for(j=0;j<4;j++){
roundkey[i][j]=w[i][4*m+j];
}
}
s_shift(sbox,state,s);
row_shift(s);
add(s,roundkey,cipher);
}
void row_right_shift(int s[4][4]){
int j,temp=0;
//**************第二行
temp=s[1][3];
for(j=3;j>0;j--){
s[1][j]=s[1][j-1];
}
s[1][0]=temp;
//**************第三行
for(j=0;j<2;j++){
temp=s[2][j];
s[2][j]=s[2][j+2];
s[2][j+2]=temp;
}
//**************第四行
temp=s[3][0];
for(j=1;j<4;j++){
s[3][(j-1+4)%4]=s[3][(j+4)%4];
}
s[3][3]=temp;
}
void decryption(int cipher[4][4],int w[4][NB*(NR+1)],int inv_sbox[256],int inv_a[4][4],int inv_plain[4][4],int state[4][4],int s[4][4],int state1[4][4]){
int roundkey[4][4];
int i=0,j=0,m=0;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
roundkey[i][j]=0;
}
}
//最后一轮的逆变换
m=NR;
for(i=0;i<4;i++){
for(j=0;j<4;j++){
roundkey[i][j]=w[i][4*m+j];
}
}
add(cipher,roundkey,s);
row_right_shift(s);
s_shift(inv_sbox,s,state);
//中间9轮循环的逆变换
for(m=9;m>0;m--){
for(i=0;i<4;i++){
for(j=0;j<4;j++){
roundkey[i][j]=w[i][4*m+j];
}
}
add(state,roundkey,state1);
for(i=0;i<4;i++){
for(j=0;j<4;j++){
s[i][j]=0;
}
}
inv_mix(state1,inv_a,s);
row_right_shift(s);
s_shift(inv_sbox,s,state);
}
//第一步异或的逆变换
for(i=0;i<4;i++){
for(j=0;j<4;j++){
roundkey[i][j]=w[i][j];
}
}
add(state,r
我虽横行却不霸道
- 粉丝: 90
- 资源: 1万+
最新资源
- 离线OCR(此软件解压后双击即可运行, 免费)
- 公开整理-上市公司员工学历及工资数据(1999-2023年).xlsx
- 公开整理-上市公司员工学历及工资数据集(1999-2023年).dta
- GDAL-3.4.3-cp38-cp38-win-amd64.whl(GDAL轮子-免编译pip直接装,下载即用)
- 基于Java实现WIFI探针的商业大数据分析技术
- 抖音5.6版本、抖音短视频5.6版、抖音iOS5.6版、抖音ipa包5.6
- 图像处理领域、QT技术、架构,可直接借鉴
- 【源码+数据库】基于Spring Boot+Mybatis+Thymeleaf实现的宠物医院管理系统
- H5漂流瓶交友源码 社交漂流瓶H5源码+对接Z支付+视频教程
- 华为ICT大赛云赛道真题资源库.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈