⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 code.c

📁 DSP系統設計和BIOS編程及應用實例-書籍光碟範例-第10章
💻 C
📖 第 1 页 / 共 2 页
字号:
//AES加密程序,将原始数组1~12进行aes加密,得到一个新的矩阵

#include<stdio.h>
#include<math.h>
//#include<conio.h>
#define A 10
#define B 11
#define C 12
#define D 13
#define E 14
#define F 15
#define N 10
#define Nb 4
#define Nk 4

void ByteSub(int (*pinfo)[Nb]);
void ShiftRow(int (*pinfo)[Nb]);
void MixColumn(int (*pinfo)[Nb]);
void AddRoundKey(int (*pinfo)[Nb],int (*pRoundKey)[N*Nb+Nb],int round);
void KeyExpansion(int (*pKey_Original)[Nk],int (*pRoundKey)[N*Nb+Nb]);
int SearchSbox(int info);

int upper_sbox[16][16]={{6,7,7,7,F,6,6,C,3,0,6,2,F,D,A,7},
                        {C,8,C,7,F,5,4,F,A,D,A,A,9,A,7,C},
                        {B,F,9,2,3,3,F,C,3,A,E,F,7,D,3,1},
                        {0,C,2,C,1,9,0,9,0,1,8,E,E,2,B,7},
                        {0,8,2,1,1,6,5,A,5,3,D,B,2,E,2,8},
                        {5,D,0,E,2,F,B,5,6,C,B,3,4,4,5,C},
                        {D,E,A,F,4,4,3,8,4,F,0,7,5,3,9,A},
                        {5,A,4,8,9,9,3,F,B,B,D,2,1,F,F,D},
                        {C,0,1,E,5,9,4,1,C,A,7,3,6,5,1,7},
                        {6,8,4,D,2,2,9,8,4,E,B,1,D,5,0,D},
                        {E,3,3,0,4,0,2,5,C,D,A,6,9,9,E,7},
                        {E,C,3,6,8,D,4,A,6,5,F,E,6,7,A,0},
                        {B,7,2,2,1,A,B,C,E,D,7,1,4,B,8,8},
                        {7,3,B,6,4,0,F,0,6,3,5,B,8,C,1,9},
                        {E,F,9,1,6,D,8,9,9,1,8,E,C,5,2,D},
                        {8,A,8,0,B,E,4,6,4,9,2,0,B,5,B,1}};

int lower_sbox[16][16]={{3,C,7,B,2,B,F,5,0,1,7,B,E,7,B,6},
                        {A,2,9,D,A,9,7,0,D,4,2,F,C,4,2,0},
                        {7,D,3,6,6,F,7,C,4,5,5,1,1,8,1,5},
                        {4,7,3,3,8,6,5,A,7,2,0,2,B,7,2,5},
                        {9,3,C,A,B,E,A,0,2,B,6,3,9,3,F,4},
                        {3,1,0,D,0,C,1,B,A,B,E,9,A,C,8,F},
                        {0,F,A,B,3,D,3,5,5,9,2,F,0,C,F,8},
                        {1,3,0,F,2,D,8,5,C,6,A,1,0,F,3,2},
                        {D,C,3,C,F,7,4,7,4,7,E,D,4,D,9,3},
                        {0,1,F,C,2,A,0,8,6,E,8,4,E,E,B,B},
                        {0,2,A,A,9,6,4,C,2,3,C,2,1,5,4,9},
                        {7,8,7,D,D,5,E,9,C,6,4,A,5,A,E,8},
                        {A,8,5,E,C,6,4,6,8,D,4,F,B,D,B,A},
                        {0,E,5,6,8,3,6,E,1,5,7,9,6,1,D,E},
                        {1,8,8,1,9,9,E,4,B,E,7,9,E,5,8,F},
                        {C,1,9,D,B,6,2,8,1,9,D,F,0,4,B,6}};

void main()
{int info[4][Nb]={{0,4,8,12},
                  {1,5,9,13},
                  {2,6,10,14},
                  {3,7,11,15}};
 int round=0;
 int i,j;
 int Key_Original[4][Nk]={{0,4,8,12},   
                          {1,5,9,13},   
                          {2,6,10,14},  
                          {3,7,11,15}}; 
 int RoundKey[4][N*Nb+Nb]={0};

 KeyExpansion(Key_Original,RoundKey);
 AddRoundKey(info,RoundKey,round);

 for(round=1;round<N;round++)
    {ByteSub(info);
     ShiftRow(info);
     MixColumn(info);
     AddRoundKey(info,RoundKey,round);
     if(round==N)
        goto end;
    }

 ByteSub(info);
 ShiftRow(info);
 AddRoundKey(info,RoundKey,round);

 end:
 for(i=0;i<4;i++)
    {for(j=0;j<Nb;j++)
         printf(" %d ",info[i][j]);
     printf("\n");
    }

// getch();
}

void ByteSub(int (*pinfo)[Nb])
{int i,j;
 for(i=0;i<4;i++)
     for(j=0;j<Nb;j++)
         *(*(pinfo+i)+j)=SearchSbox(*(*(pinfo+i)+j));
}

int SearchSbox(int info)
{int tens,ones,temp_tens,temp_ones;
 tens=info/16;
 ones=info%16;
 temp_tens=upper_sbox[tens][ones];
 temp_ones=lower_sbox[tens][ones];
 info=temp_tens*16+temp_ones;
 return (info);
}/*查表求出S盒变换,其中两个表中分别对应高位和低位*/

void ShiftRow(int (*pinfo)[Nb])
{int temp;
 int i,j,k;
 for(i=0;i<4;i++)
     for(j=0;j<i;j++)
        {temp=*(*(pinfo+i)+0);
         for(k=0;k<Nb-1;k++)
             *(*(pinfo+i)+k)=*(*(pinfo+i)+k+1);
         *(*(pinfo+i)+Nb-1)=temp;
        }
}/*左移*/

void MixColumn(int (*pinfo)[Nb])
{int j,k;
 int sum=0;
 int a0[8],a1[8],a2[8],a3[8];
 int b0[8],b1[8],b2[8],b3[8];

 for(j=0;j<Nb;j++)
    {for(k=0;k<8;k++)
        {a0[k]=(*(*(pinfo+0)+j)/(int)pow(2,7-k))%2;
         a1[k]=(*(*(pinfo+1)+j)/(int)pow(2,7-k))%2;
         a2[k]=(*(*(pinfo+2)+j)/(int)pow(2,7-k))%2;
         a3[k]=(*(*(pinfo+3)+j)/(int)pow(2,7-k))%2;
        }

     b0[0]=a0[1]+a2[0]+a3[0]+a1[1]+a1[0];
     b0[1]=a0[2]+a2[1]+a3[1]+a1[2]+a1[1];
     b0[2]=a0[3]+a2[2]+a3[2]+a1[3]+a1[2];
     b0[3]=a0[0]+a0[4]+a2[3]+a3[3]+a1[0]+a1[4]+a1[3];
     b0[4]=a0[0]+a0[5]+a2[4]+a3[4]+a1[0]+a1[5]+a1[4];
     b0[5]=a0[6]+a2[5]+a3[5]+a1[6]+a1[5];
     b0[6]=a0[0]+a0[7]+a2[6]+a3[6]+a1[0]+a1[7]+a1[6];
     b0[7]=a0[0]+a2[7]+a3[7]+a1[0]+a1[7];

     b1[0]=a2[1]+a2[0]+a1[1]+a0[0]+a3[0];
     b1[1]=a2[2]+a2[1]+a1[2]+a0[1]+a3[1];
     b1[2]=a2[3]+a2[2]+a1[3]+a0[2]+a3[2];
     b1[3]=a2[0]+a2[4]+a2[3]+a1[0]+a1[4]+a0[3]+a3[3];
     b1[4]=a2[0]+a2[5]+a2[4]+a1[0]+a1[5]+a0[4]+a3[4];
     b1[5]=a2[6]+a2[5]+a1[6]+a0[5]+a3[5];
     b1[6]=a2[0]+a2[7]+a2[6]+a1[0]+a1[7]+a0[6]+a3[6];
     b1[7]=a2[0]+a2[7]+a1[0]+a0[7]+a3[7];

     b2[0]=a0[0]+a3[1]+a3[0]+a2[1]+a1[0];
     b2[1]=a0[1]+a3[2]+a3[1]+a2[2]+a1[1];
     b2[2]=a0[2]+a3[3]+a3[2]+a2[3]+a1[2];
     b2[3]=a0[3]+a3[0]+a3[4]+a3[3]+a2[0]+a2[4]+a1[3];
     b2[4]=a0[4]+a3[0]+a3[5]+a3[4]+a2[0]+a2[5]+a1[4];
     b2[5]=a0[5]+a3[6]+a3[5]+a2[6]+a1[5];
     b2[6]=a0[6]+a3[0]+a3[7]+a3[6]+a2[0]+a2[7]+a1[6];
     b2[7]=a0[7]+a3[0]+a3[7]+a2[0]+a1[7];

     b3[0]=a2[0]+a1[0]+a0[1]+a0[0]+a3[1];
     b3[1]=a2[1]+a1[1]+a0[2]+a0[1]+a3[2];
     b3[2]=a2[2]+a1[2]+a0[3]+a0[2]+a3[3];
     b3[3]=a2[3]+a1[3]+a0[0]+a0[4]+a0[3]+a3[0]+a3[4];
     b3[4]=a2[4]+a1[4]+a0[0]+a0[5]+a0[4]+a3[0]+a3[5];
     b3[5]=a2[5]+a1[5]+a0[6]+a0[5]+a3[6];
     b3[6]=a2[6]+a1[6]+a0[0]+a0[7]+a0[6]+a3[0]+a3[7];
     b3[7]=a2[7]+a1[7]+a0[0]+a0[7]+a3[0];

     for(k=0;k<8;k++)
        {a0[k]=b0[k]%2;
         a1[k]=b1[k]%2;
         a2[k]=b2[k]%2;
         a3[k]=b3[k]%2;
        }

     sum=0;
     for(k=0;k<8;k++)
         sum=sum+a0[k]*(int)pow(2,7-k);
     *(*(pinfo+0)+j)=sum;

     sum=0;
     for(k=0;k<8;k++)
         sum=sum+a1[k]*(int)pow(2,7-k);
     *(*(pinfo+1)+j)=sum;

     sum=0;
     for(k=0;k<8;k++)
         sum=sum+a2[k]*(int)pow(2,7-k);
     *(*(pinfo+2)+j)=sum;

     sum=0;
     for(k=0;k<8;k++)
         sum=sum+a3[k]*(int)pow(2,7-k);
     *(*(pinfo+3)+j)=sum;
    }
}

 /*实现矩阵相乘的变换*/

void AddRoundKey(int (*pinfo)[Nb],int (*pRoundKey)[Nb*N+Nb],int round)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -