老师让编一个程序,实现加密解密的功能,
基本要求是从键盘读入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;
}