AES加密解密功能实现遇到问题

pigKing10 2012-06-16 05:01:22
老师让编一个程序,实现加密解密的功能,
基本要求是从键盘读入16字符的数据,
然后对这16字符进行操作。
我编译如下,但是一直解密加密不对,而且出现乱码显示,求帮助啊,大侠们,马上要课程结课答辩了,我还没完基本要求,后面还有高级要求呢,谢谢你们了先,代码很长,其中有几个函数是我为了实现高级功能编译的,暂时不用,可以省略。头文件包含两个S盒子
#include<stdio.h>
#include"Box.h"
#include <stdlib.h>
#include<stdio.h>

unsigned char ExpandKey[11][4][4]; //定义扩展密钥存储数组
unsigned char invKey[16]; //定义密钥数组
unsigned char Mingwen[16]; //明文分组
int Nb=4,Nk=4,Nr=10; //Nb表示行数单位为,Nk表示密钥列数,Nr表示轮数

//函数声明

void SetNbNkNr(int keySize); //设置密钥列数并确定加密轮数的函数SetRound
void InputMessages(); //从键盘读入字符串并进行存储在数组中
void SubBytes(unsigned char State[][4]); //从键盘读入密钥并进行存储在数组中
void InputKey(); //字节代替SubBytes函数
void ShiftRows(unsigned char State[][4]); //行位移函数
unsigned char xtime (unsigned char input); // x乘法('02'乘法)
void MixColumns(unsigned char State[][4]); //列混合函数
void AddRoundKey(unsigned char State[][4],unsigned char Key[][4]);//轮密钥加函数
void InvShiftRows(unsigned char State[][4]);//逆行移位函数
void InvSubBytes(unsigned char State[][4]); //逆字节代替函数
void InvMixColumns(unsigned char State[][4]);//逆列混合函数
void KeyExpansion(unsigned char *Key,unsigned char ExpandKey[][4][4]);//密钥扩展函数
void Encryption(unsigned char input[16],unsigned char Key[16]); //加密过程函数
void InvEncryption(unsigned char input[16]);//解密过程函数
void Read(unsigned char String[16]); //文件读函数


int main() //主函数
{
int choice; //设置功能键选择变量
do{
/*一下完成主界面的设置功能 */
printf("\n\n***********************亲,欢迎您使用AES加密解密软件!**********************\n"
"\n\n 请选择你所需要的功能前面的数字\n"
"\n 1.我想进行加密(密钥+明文从键盘输入)\n"
"\n 2.我想进行加密(密钥+明文从文件读入)\n"
"\n 3.我想进行解密(密钥+明文从键盘输入)\n"
"\n 4.我想进行解密(密钥+明文从文件输入)\n"
"\n 5.软件说明\n"
"\n 6.我不想用这个软件了,退出!\n"
"*****************************************************************************\n"
);
scanf_s("%d",&choice);
getchar();
if(choice==1) //键盘读入加密功能
{
printf("你选择的是:加密——(密钥+明文从键盘输入)\n\n");
InputMessages();
getchar();

/*printf("输入的消息为:");
for(int i=0;i<16;i++)
{
printf("%c",Mingwen[i]);
putchar('\n');
}*/
InputKey();
Encryption(Mingwen,invKey);
getchar();
}
else if(choice==2) //文件读入加密功能
{
printf("你选择的是:我想进行加密(密钥+明文从文件输入)\n\n");
printf("请输入你要打开的明文的文件名:");
Read(Mingwen);
printf("请输入你要打开的密钥的文件名:");
Read(invKey);
Encryption(Mingwen,invKey);

}
else if(choice==3) //键盘读入解密功能
{
/*printf("你选择的是:解密——(密钥+明文从键盘输入)\n\n");*/

//InputMessages();
//InputKey();
printf("解密的密文为:");
for(int i=0;i<16;i++)
{
printf("%c,",Mingwen[i]);
}
putchar('\n');

InvEncryption(Mingwen);
//getchar();

}
else if(choice==4) //文件读入解密功能
{
printf("你选择的是:我想进行解密((密钥+明文从文件输入)\n\n");
Read(Mingwen);
Read(invKey);
InvEncryption(Mingwen);
}
else if(choice==5) //软件说明
{
printf("\n\n——————————————#软件说明#——————————————————\n"
"\n 成都信息工程学院网络工程学院\n"
"\n 信息对抗技术10级1班\n"
"\n 樊培 \n"
"\n 实践就可以改变世界!努力吧!\n"
"\n 2012年6月10日 \n"
"———————————————————————————————————————\n"
);

}

}while(choice!=6);

return 0;
}

...全文
216 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
pigKing10 2012-06-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

晕,AES在后面
[/Quote]额,似的,在后面啊,函数代码有点多,字符只是通过键盘输入,不管其他的
jackyjkchen 2012-06-16
  • 打赏
  • 举报
回复
晕,AES在后面
jackyjkchen 2012-06-16
  • 打赏
  • 举报
回复
你的AES实现在哪里啊,没看到,如果老师没让你实现AES的话,直接取用openssl、tomcrypt之类的库最好

而且,最为纯二进制操作,键盘输入16字节靠谱么,ascii之外的字符你怎么输入?
pigKing10 2012-06-16
  • 打赏
  • 举报
回复
/*--------------------------------------------------------------------------------------------------*/
void InvShiftRows(unsigned char State[][4]) //逆行移位函数
{
char k;
k=State[1][3];
State[1][3]=State[1][2];
State[1][2]=State[1][1];
State[1][1]=k;

k=State[2][3];
State[2][3]=State[2][1];
State[2][1]=k;
k=State[2][2];
State[2][1]=State[2][0];
State[2][1]=k;

k=State[3][0];
State[3][0]=State[3][1];
State[3][1]=State[3][2];
State[3][2]=State[3][3];
State[3][3]=k;

/*printf("行移位:\n");
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
printf("%c",&State[i][j]);
}
putchar('\n');
}*/

}
/*--------------------------------------------------------------------------------------------------*/
void InvSubBytes(unsigned char State[][4]) //逆字节代替函数
{
int i,j;
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
State[i][j] = InvSbox[State[i][j]];
}
}
}
/*--------------------------------------------------------------------------------------------------*/
void InvMixColumns(unsigned char State[][4]) //逆列混合函数
{
unsigned char output[4][4];
int i, j;
for(j=0; j< 4; j++)
{
for(i=0; i<4; i++)
{

output[i][j] = (xtime(xtime(xtime(State[i % 4][j]))) ^ xtime(xtime(State[i % 4][j]))^xtime(State[i % 4][j])) //0x0E乘法

^ (xtime(xtime(xtime(State[ ( i + 1 ) % 4][j]))) ^ xtime(State[ ( i + 1 ) % 4][j]) ^ State[ ( i + 1 ) % 4][j]) //0x0B乘法

^ (xtime(xtime(xtime(State[ ( i + 2 ) % 4][j]))) ^ xtime(xtime(State[ ( i + 2 ) % 4][j])) ^ State[ ( i + 2 ) % 4][j]) //0x0D乘法

^(xtime(xtime(xtime(State[ ( i + 3 ) % 4][j]))) ^ State[ ( i + 3 ) % 4][j]); //0x09乘法
}
}
for(i=0; i<4; i++) //将output的数据送给State
{
for(j=0; j< 4; j++)
{
State[i][j]=output[i][j];
}
}
}
/*--------------------------------------------------------------------------------------------------*/
void KeyExpansion(unsigned char *Key,unsigned char ExpandKey[][4][4]) //密钥扩展函数
{
unsigned char RC[] = {0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36};
int i,j,m,n;
for(m=0;m<4;m++)
{
for(n=0;n<4;n++)
{
ExpandKey[0][m][n]=Key[n*4+m];
}
}

for(i=1;i<11;i++)
{
for(j=0;j<4;j++)
{
unsigned char Temp[4];
for(m=0;m<4;m++)
{
if(j==0)
{
Temp[m]=ExpandKey[i-1][m][3]; //j为三维数组中的二维数组列下标,

/* 完成将Ki=Temp[]到T[Ki]的转变*/
unsigned char t = Temp[0];
for(m=0;m<3;m++)
{
Temp[m] = Sbox[Temp[(m+1)%4]];
}
Temp[3] = Sbox[t];

Temp[0] ^= RC[i-1];

}

else if(j!=0) //其他情况时,直接取出密钥列值K[i]
{
Temp[m]=ExpandKey[i][m][j-1];
}

}
for(m=0; m<4; m++)
{
ExpandKey[i][m][j] =ExpandKey[i-1][m][j] ^ Temp[m];
}

}
}
}
/*--------------------------------------------------------------------------------------------------*/
void Encryption(unsigned char input[16],unsigned char Key[16]) //加密过程函数
{
KeyExpansion(Key,ExpandKey);
unsigned char State[4][4];
int i,j,k;
for(i=0; i<4; i++)
{
for(j=0; j<4 ;j++)
{
State[i][j]= input[4*j+i];
}
}

AddRoundKey(State,ExpandKey[0]);

/*char File[20];
char ch;
printf("输入文件名;\n");
scanf("%s",File);
ch=getchar();
FILE *out;*/

for(i=1; i<=10; i++)
{
SubBytes(State);
ShiftRows(State);
if(i!=10)MixColumns(State);
AddRoundKey(State,ExpandKey[i]);

if(i>=9) /*输出最后加密两轮密钥和加密的值 */
{

printf("\n第%d轮加密密钥矩阵为:\n",i);
int m,n;
for(m=0;m<4;m++)
{
for(n=0;n<4;n++)
{
printf("%c,",ExpandKey[i][m][n]);
}
printf("\n");
}

printf("第%d轮加密出的密文为:",i);
for(m=0;m<4;m++)
{
for(n=0;n<4;n++)
{
printf("%c,",State[m][n]);
}
}
printf("\n");
}
}

for(j=0; j<4; j++)
{
for(k=0; k<4 ;k++)
{
input[4*j+k]=State[j][k];
}
}
}
/*--------------------------------------------------------------------------------------------------*/
void InvEncryption(unsigned char input[16]) //解密过程函数
{
int i,j,k;
unsigned char State[4][4];
for(j=0; j<4; j++)
{
for(k=0; k<4 ;k++)
{
State[j][k] = input[k*4+j];
}
}
AddRoundKey(State,ExpandKey[10]);
for(i=9; i>=0; i--)
{
InvShiftRows(State);
InvSubBytes(State);
AddRoundKey(State, ExpandKey[i]);
if(i)InvMixColumns(State);

if(i<=1) /* 输出最后解密两轮密钥和密文 */
{
static int t=9;
printf("\n第%d轮密钥矩阵为:\n",t);
int m,n;
for(m=0;m<4;m++)
{
for(n=0;n<4;n++)
{
printf("%c,",ExpandKey[i][m][n]);

}
printf("\n");
}

printf("第%d轮加密出的密文为:",t);
for(m=0;m<4;m++)
{
for(n=0;n<4;n++)
{
printf("%c,",State[m][n]);
}
}
printf("\n");
t++;
}
}

for(j=0;j<4;j++)
{
for(k=0; k<4 ;k++)
{
input[k*4+j] = State[j][k];
}
}

}
/*--------------------------------------------------------------------------------------------------*/
void Read(unsigned char String[16]) //密钥文件打开函数
{
int i=0;
char filename[20];
scanf_s("%s",filename);
FILE *fp;
if((fp=fopen(filename,"w"))==NULL)
{
printf("不能打开文件或文件不存在!\n");
exit(0);
}
char ch=getchar();
for(i=0;i<16;i++)
{
while(!feof(fp))
{
String[i]=fread(filename,sizeof(filename[20]),1,fp);
}
}
fclose(fp);
}
pigKing10 2012-06-16
  • 打赏
  • 举报
回复
//分函数
/*--------------------------------------------------------------------------------------------------*/

void SetNbNkNr(int keySize) //设置密钥列数并确定加密轮数的函数SetRound
{
if(keySize==128)
{
Nk=4;
Nr=10;
}
else if(keySize==192)
{
Nk=6;
Nr=12;
}
else if(keySize==256)
{
Nk=8;
Nr=14;
}
}
/*--------------------------------------------------------------------------------------------------*/
void InputMessages() //从键盘读入字符串并进行存储在数组中
{
int m;
printf("请输入你所需要处理的16位的消息:");
for(m=0;m<16;m++)
{
scanf_s("%c",&(Mingwen[m]));
}
}
/*--------------------------------------------------------------------------------------------------*/
void InputKey() //从键盘读入密钥并进行存储在数组中
{
int n;
printf("请输入你所需要处理的16位的密钥:");
for(n=0;n<=15;n++)
{
scanf_s("%c",&invKey[n]);
}
printf("\n");
}
/*--------------------------------------------------------------------------------------------------*/
void SubBytes(unsigned char State[][4]) //字节代替SubBytes函数
{
int i,j;
for(i=0; i<4; i++)
{
for(j=0; j<4; j++)
{
State[i][j] = Sbox[State[i][j]];
}
}
}
/*--------------------------------------------------------------------------------------------------*/
void ShiftRows(unsigned char State[][4]) //行位移函数
{
unsigned char k;

k=State[1][0];
State[1][0]=State[1][1];
State[1][1]=State[1][2];
State[1][2]=State[1][3];
State[1][3]=k;

k=State[2][1];
State[2][1]=State[2][3];
State[2][3]=k;
k=State[2][0];
State[2][0]=State[2][2];
State[2][2]=k;

k=State[3][3];
State[3][3]=State[3][2];
State[3][2]=State[3][1];
State[3][1]=State[3][0];
State[3][0]=k;

/*static int i=1;
printf("行移位:%d \n",i++);*/


}
/*--------------------------------------------------------------------------------------------------*/
void MixColumns(unsigned char State[][4]) //列混合函数
{
unsigned char output[4][4];
int i, j;
for(j=0; j< 4; j++)
{
for(i=0; i<4; i++)
{

output[i][j] = xtime(State[i%4][j]) //0x02乘法

^ ( State[ ( i + 1 ) % 4][j] ^ xtime( State[ ( i + 1 ) % 4][j] ) ) //0x03乘法

^ State[ ( i + 2 ) % 4][j] //0x01乘法

^ State[ ( i + 3 ) % 4][j]; //0x01乘法
}
}
for(i=0; i<4; i++) //将output的数据送给input
{
for(j=0; j< 4; j++)
{
State[i][j]=output[i][j];
}
}
}
/*--------------------------------------------------------------------------------------------------*/
unsigned char xtime (unsigned char input) // x乘法('02'乘法)
{
int temp;
temp = input<<1;
if(input & 0x80)
{
temp ^= 0x1b;
}
return temp;
}
/*--------------------------------------------------------------------------------------------------*/
void AddRoundKey(unsigned char State[][4],unsigned char Key[][4]) //轮密钥加函数
{
int i,j;
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
State[i][j]^=Key[i][j];
}
}

}

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧