AES加密解密的实现 联系客服

发布时间 : 星期一 文章AES加密解密的实现更新完毕开始阅读2967f033ee06eff9aef807a0

void Cipher() {

int i,j,round=0;

for(i=0;i<4;i++) {

for(j=0;j<4;j++) {

state[j][i] = in[i*4 + j]; } }

AddRoundKey(0); printf(\

for(round=1;round

SubBytes(); ShiftRows(); MixColumns();

AddRoundKey(round); printf(\ }

SubBytes(); ShiftRows();

AddRoundKey(Nr);

for(i=0;i<4;i++) {

for(j=0;j<4;j++) {

out[i*4+j]=state[j][i]; } } }

结果存入out数组中,再输出即可。

第 15 页 共 33 页

3.1.11解密

通过上面所写函数得到解密函数 关键代码如下:

void InvCipher() {

int i,j,round=0;

for(i=0;i<4;i++) {

for(j=0;j<4;j++) {

state[j][i] = in[i*4 + j]; } }

AddRoundKey(Nr);

for(round=Nr-1;round>0;round--) {

InvShiftRows(); InvSubBytes();

AddRoundKey(round); InvMixColumns(); printf(\ }

InvShiftRows(); InvSubBytes(); AddRoundKey(0);

for(i=0;i<4;i++) {

for(j=0;j<4;j++) {

out[i*4+j]=state[j][i]; } } }

第 16 页 共 33 页

结果存入out数组中.

3.2较高要求部分

3.2.1 密钥长度192,256的实现

通过输入不同的密钥长度计算出不同的Nk密钥列数和Nr加密轮数,将两者设为全局变量,在需要使用的函数中带入这两个变量替代原来的4和10即可拥有不同长度的密钥。这里专门提出了一个计算Nk和Nr的函数便于调用。 代码如下:

void NkNr() {

int len;

while(len!=1 && len!=2 && len!=3) {

printf(\输入想选择的密钥长度:\\n1 - 128\\n2 - 192\\n3 - 256\\n\ scanf(\ if(len==1) Nr=128; if(len==2) Nr=192; if(len==3) Nr=256; }

Nk = Nr / 32; Nr = Nk + 6; }

3.2.2 密钥采用ASCII码

这个功能实现很简单,直接用fscanf函数按照格式读取即可,在txt中存入以空格分隔的ascii码便可

fscanf(fp, \读取为d,ascii码

第 17 页 共 33 页

3.2.3 明文分组和自动填充

为了方便输入和修改,采用了从TXT文件中读取字符的方法来得到明文。

首先,确认文件存在后用fopen函数打开,然后用fscanf函数按照自定格式从文本文件中读取字符,对于明文用%c读取,这样一个字符一个字符读入,然后存入相应的数组[i],用feof(fp)来判断是否到了文件末尾,到末尾后可以得到一个i值,这个值比实际长度还多一位,i-1即为实际的明文长度。

得到明文长度m后,m除以16向上取整得到轮数,因为数组下标大于m后面的都未赋值所以默认为0,然后16个一组进行加密,一轮完成后,把数组中后16个值付给0—15的元素,直到轮数达成,这样便实现了明文分组填充。

这里写了一个readtext函数来读取文本文件中的字符串。

代码如下:

//type:判断是读密钥,明文还是密文,mingzi:文件名 //length:数组长度,shuzu:读完后要存入的数组

int readtext(int type,const char * mingzi,int length,unsigned char shuzu[]) {

int i,j,x;

unsigned char temp1[12345]; if(type==1){

MessageBox(NULL,\在弹出的记事本中确认密钥\\n 完成后按任意键继续\消息\

system(\ else if(type==2){

MessageBox(NULL,\在弹出的记事本中确认明文\\n 完成后按任意键继续\消息\

system(\ else{

MessageBox(NULL,\在弹出的记事本中确认密文\\n 完成后按任意键继续\消息\

system(\ getch();

if(type==1) printf(\密钥:\

else if(type==2) printf(\明文:\ else printf(\密文:\ FILE *fp;

fp=fopen(mingzi,\ for(i=0;!feof(fp);i++) {if(type==1)

fscanf(fp, \密钥是ASCII fscanf读整型即可 else if(type==2) fscanf(fp, \明文是字符

第 18 页 共 33 页