BOOL aes_init(aes* a,int mode,int nk,char *key,char *iv) { /* Key=nk bytes */ /* currently NB,nk = 16, 24 or 32 */ /* Key Scheduler. Create expanded encryption key */ int i,j,k,N,nr; WORD CipherKey[8]; nk/=4; if (nk!=4 && nk!=6 && nk!=8) return FALSE; /* nr is number of rounds */ nr=6+nk; a->Nk=nk; a->Nr=nr; aes_reset(a,mode,iv); N=NB*(nr+1); for (i=j=0; i<nk; i++,j+=4) { CipherKey[i]=pack((BYTE *)&key[j]); } for (i=0; i<nk; i++) a->fkey[i]=CipherKey[i]; for (j=nk,k=0; j<N; j+=nk,k++) { a->fkey[j]=a->fkey[j-nk]^SubByte(ROTL24(a->fkey[j-1]))^rco[k]; if (nk<=6) { for (i=1; i<nk && (i+j)<N; i++) a->fkey[i+j]=a->fkey[i+j-nk]^a->fkey[i+j-1]; } else { for (i=1; i<4 && (i+j)<N; i++) a->fkey[i+j]=a->fkey[i+j-nk]^a->fkey[i+j-1]; if ((j+4)<N) a->fkey[j+4]=a->fkey[j+4-nk]^SubByte(a->fkey[j+3]); for (i=5; i<nk && (i+j)<N; i++) a->fkey[i+j]=a->fkey[i+j-nk]^a->fkey[i+j-1]; } } /* now for the expanded decrypt key in reverse order */ for (j=0; j<NB; j++) a->rkey[j+N-NB]=a->fkey[j]; for (i=NB; i<N-NB; i+=NB) { k=N-NB-i; for (j=0; j<NB; j++) a->rkey[k+j]=InvMixCol(a->fkey[i+j]); } for (j=N-NB; j<N; j++) a->rkey[j-N+NB]=a->fkey[j]; return TRUE; }
/* Initialise cipher */ int MCL_AES_init(mcl_aes* a,int mode,int nk,char *key,char *iv) { /* Key length Nk=16, 24 or 32 bytes */ /* Key Scheduler. Create expanded encryption key */ int i,j,k,N,nr; unsign32 CipherKey[8]; nk/=4; if (nk!=4 && nk!=6 && nk!=8) return 0; nr=6+nk; a->Nk=nk; a->Nr=nr; MCL_AES_reset(a,mode,iv); N=NB*(nr+1); for (i=j=0;i<nk;i++,j+=4) { CipherKey[i]=pack((uchar *)&key[j]); } for (i=0;i<nk;i++) a->fkey[i]=CipherKey[i]; for (j=nk,k=0;j<N;j+=nk,k++) { a->fkey[j]=a->fkey[j-nk]^SubByte(ROTL24(a->fkey[j-1]))^rco[k]; if (nk<=6) { for (i=1;i<nk && (i+j)<N;i++) a->fkey[i+j]=a->fkey[i+j-nk]^a->fkey[i+j-1]; } else { for (i=1;i<4 && (i+j)<N;i++) a->fkey[i+j]=a->fkey[i+j-nk]^a->fkey[i+j-1]; if ((j+4)<N) a->fkey[j+4]=a->fkey[j+4-nk]^SubByte(a->fkey[j+3]); for (i=5;i<nk && (i+j)<N;i++) a->fkey[i+j]=a->fkey[i+j-nk]^a->fkey[i+j-1]; } } /* now for the expanded decrypt key in reverse order */ for (j=0;j<NB;j++) a->rkey[j+N-NB]=a->fkey[j]; for (i=NB;i<N-NB;i+=NB) { k=N-NB-i; for (j=0;j<NB;j++) a->rkey[k+j]=InvMixCol(a->fkey[i+j]); } for (j=N-NB;j<N;j++) a->rkey[j-N+NB]=a->fkey[j]; return 1; }
/* Initialise cipher */ void AES_init(aes* a,int mode,char *key,char *iv) { /* Key=16 bytes */ /* Key Scheduler. Create expanded encryption key */ int i,j,k,N,nk; unsign32 CipherKey[4]; nk=4; AES_reset(a,mode,iv); N=NB*(ROUNDS+1); for (i=j=0;i<nk;i++,j+=4) { CipherKey[i]=pack((uchar *)&key[j]); } for (i=0;i<nk;i++) a->fkey[i]=CipherKey[i]; for (j=nk,k=0;j<N;j+=nk,k++) { a->fkey[j]=a->fkey[j-nk]^SubByte(ROTL24(a->fkey[j-1]))^rco[k]; for (i=1;i<nk && (i+j)<N;i++) a->fkey[i+j]=a->fkey[i+j-nk]^a->fkey[i+j-1]; } /* now for the expanded decrypt key in reverse order */ for (j=0;j<NB;j++) a->rkey[j+N-NB]=a->fkey[j]; for (i=NB;i<N-NB;i+=NB) { k=N-NB-i; for (j=0;j<NB;j++) a->rkey[k+j]=InvMixCol(a->fkey[i+j]); } for (j=N-NB;j<N;j++) a->rkey[j-N+NB]=a->fkey[j]; }
void InvMixColumn(WORD in[Nb]) { for(int i = 0; i < Nb; i++) in[i] = InvMixCol((BYTE*)&in[i]); }
void gkey(int nb,int nk,char *key) { /* blocksize=32*nb bits. Key=32*nk bits */ /* currently nb,bk = 4, 6 or 8 */ /* key comes as 4*Nk bytes */ /* Key Scheduler. Create expanded encryption key */ int i,j,k,m,N; int C1,C2,C3; u32 CipherKey[8]; Nb=nb; Nk=nk; /* Nr is number of rounds */ if (Nb>=Nk) Nr=6+Nb; else Nr=6+Nk; C1=1; if (Nb<8) { C2=2; C3=3; } else { C2=3; C3=4; } /* pre-calculate forward and reverse increments */ for (m=j=0;j<nb;j++,m+=3) { fi[m]=(j+C1)%nb; fi[m+1]=(j+C2)%nb; fi[m+2]=(j+C3)%nb; ri[m]=(nb+j-C1)%nb; ri[m+1]=(nb+j-C2)%nb; ri[m+2]=(nb+j-C3)%nb; } N=Nb*(Nr+1); for (i=j=0;i<Nk;i++,j+=4) { CipherKey[i]=pack((u8 *)&key[j]); } for (i=0;i<Nk;i++) fkey[i]=CipherKey[i]; for (j=Nk,k=0;j<N;j+=Nk,k++) { fkey[j]=fkey[j-Nk]^SubByte(ROTL24(fkey[j-1]))^rco[k]; if (Nk<=6) { for (i=1;i<Nk && (i+j)<N;i++) fkey[i+j]=fkey[i+j-Nk]^fkey[i+j-1]; } else { for (i=1;i<4 &&(i+j)<N;i++) fkey[i+j]=fkey[i+j-Nk]^fkey[i+j-1]; if ((j+4)<N) fkey[j+4]=fkey[j+4-Nk]^SubByte(fkey[j+3]); for (i=5;i<Nk && (i+j)<N;i++) fkey[i+j]=fkey[i+j-Nk]^fkey[i+j-1]; } } /* now for the expanded decrypt key in reverse order */ for (j=0;j<Nb;j++) rkey[j+N-Nb]=fkey[j]; for (i=Nb;i<N-Nb;i+=Nb) { k=N-Nb-i; for (j=0;j<Nb;j++) rkey[k+j]=InvMixCol(fkey[i+j]); } for (j=N-Nb;j<N;j++) rkey[j-N+Nb]=fkey[j]; }
/*获得密钥*/ void gkey(int nb,int nk,char *key) { int i,j,k,m,N; int C1,C2,C3; WORD CipherKey[8]; Nb=nb; Nk=nk; /* Nr is number of rounds Nr是加密的轮数*/ if (Nb>=Nk) Nr=6+Nb; else Nr=6+Nk; C1=1; if (Nb<8) { C2=2; C3=3; } else { C2=3; C3=4; } for (m=j=0;j<nb;j++,m+=3) { fi[m]=(j+C1)%nb; fi[m+1]=(j+C2)%nb; fi[m+2]=(j+C3)%nb; ri[m]=(nb+j-C1)%nb; ri[m+1]=(nb+j-C2)%nb; ri[m+2]=(nb+j-C3)%nb; } N=Nb*(Nr+1); for (i=j=0;i<Nk;i++,j+=4) { CipherKey[i]=pack((BYTE *)&key[j]); } for (i=0;i<Nk;i++) fkey[i]=CipherKey[i]; for (j=Nk,k=0;j<N;j+=Nk,k++) { fkey[j]=fkey[j-Nk]^SubByte(ROTL24(fkey[j-1]))^rco[k]; if (Nk<=6) { for (i=1;i<Nk && (i+j)<N;i++) fkey[i+j]=fkey[i+j-Nk]^fkey[i+j-1]; } else { for (i=1;i<4 &&(i+j)<N;i++) fkey[i+j]=fkey[i+j-Nk]^fkey[i+j-1]; if ((j+4)<N) fkey[j+4]=fkey[j+4-Nk]^SubByte(fkey[j+3]); for (i=5;i<Nk && (i+j)<N;i++) fkey[i+j]=fkey[i+j-Nk]^fkey[i+j-1]; } } for (j=0;j<Nb;j++) rkey[j+N-Nb]=fkey[j]; for (i=Nb;i<N-Nb;i+=Nb) { k=N-Nb-i; for (j=0;j<Nb;j++) rkey[k+j]=InvMixCol(fkey[i+j]); } for (j=N-Nb;j<N;j++) rkey[j-N+Nb]=fkey[j]; }