1、#define ROTL8(x) (x)24)#define ROTL16(x) (x)16)#define ROTL24(x) (x)8)/* Fixed Data */static BYTE InCo4=0xB,0xD,0x9,0xE; /* Inverse Coefficients */static BYTE fbsub256;static BYTE rbsub256;static BYTE ptab256,ltab256;static WORD ftable256;static WORD rtable256;static WORD rco30;/* Parameter-dependen
2、t data */int Nk,Nb,Nr;BYTE fi24,ri24;WORD fkey120;WORD rkey120;static WORD pack(BYTE *b) /* pack bytes into a 32-bit Word */ return (WORD)b324)|(WORD)b216)|(WORD)b18); b2=(BYTE)(a16); b3=(BYTE)(a24);/关于模多项式0x011b的乘10b运算static BYTE xtime(BYTE a) BYTE b; if (a&0x80) b=0x1B; else b=0; a=1; a=b; return
3、a;static BYTE bmul(BYTE x,BYTE y) /* x.y= AntiLog(Log(x) + Log(y) */ if (x & y) return ptab(ltabx+ltaby)%255; else return 0;static WORD SubByte(WORD a) BYTE b4; unpack(a,b); b0=fbsubb0; b1=fbsubb1; b2=fbsubb2; b3=fbsubb3; return pack(b); static BYTE product(WORD x,WORD y) /* dot product of two 4-byt
4、e arrays */ BYTE xb4,yb4; unpack(x,xb); unpack(y,yb); return bmul(xb0,yb0)bmul(xb1,yb1)bmul(xb2,yb2)bmul(xb3,yb3);static WORD InvMixCol(WORD x) /* matrix Multiplication */ WORD y,m; m=pack(InCo); b3=product(m,x); m=ROTL24(m); b2=product(m,x); b1=product(m,x); b0=product(m,x); y=pack(b); return y;BYT
5、E ByteSub(BYTE x) BYTE y=ptab255-ltabx; /* multiplicative inverse */ x=y; x=ROTL(x); y=x; y=0x63;void gentables(void) /* generate tables */ int i; BYTE y,b4; /* use 3 as primitive root to generate power and log tables */ ltab0=0; ptab0=1; ltab1=0; ptab1=3; ltab3=1; for (i=2;i256;i+) ptabi=ptabi-1xti
6、me(ptabi-1); ltabptabi=i; /* affine transformation:- each bit is xored with itself shifted one bit 仿射变换 */ fbsub0=0x63; rbsub0x63=0; for (i=1; y=ByteSub(BYTE)i); fbsubi=y; rbsuby=i; for (i=0,y=1;30; rcoi=y; y=xtime(y); /* calculate forward and reverse tables */ for (i=0; y=fbsubi; b3=yxtime(y); b2=y
7、; b1=y; b0=xtime(y); ftablei=pack(b); y=rbsubi; b3=bmul(InCo0,y); b2=bmul(InCo1,y); b1=bmul(InCo2,y); b0=bmul(InCo3,y); rtablei=pack(b);void strtoHex(char *str,char *hex) char ch; int i=0, by = 0; while(i = 0 & ch 9) by = (by AF + 10; else / error if not hexadecimal printf(key must be in hexadecimal
8、 notationn); exit(0); / store a key byte for each pair of hexadecimal digits if(i+ & 1) hexi / 2 - 1 = by & 0xff;void hextoStr(char *hex,char *str) 32 & *hex) / the maximum key length is 32 bytes(256 bits) and by = *hex ; / process a hexadecimal digit(high) by=by4 &0x0f; if(by = 0 & by = 0x0A &= 0x0
9、F) *str+ = by - 10+ by = *hex+; / process a hexadecimal digit(low) by=by & 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;
10、 WORD CipherKey8; Nb=nb; Nk=nk; /* Nr is number of rounds */ if (Nb=Nk) Nr=6+Nb; else Nr=6+Nk; C1=1; if (Nb8) C2=2; C3=3; else C2=3; C3=4; /* pre-calculate forward and reverse increments */ for (m=j=0;jnb;j+,m+=3) fim=(j+C1)%nb; fim+1=(j+C2)%nb; fim+2=(j+C3)%nb; rim=(nb+j-C1)%nb; rim+1=(nb+j-C2)%nb;
11、 rim+2=(nb+j-C3)%nb; N=Nb*(Nr+1); for (i=j=0;Nk;i+,j+=4) CipherKeyi=pack(BYTE *)&keyj);i+) fkeyi=CipherKeyi; for (j=Nk,k=0;N;j+=Nk,k+) fkeyj=fkeyj-NkSubByte(ROTL24(fkeyj-1)rcok; if (Nk=6)Nk & (i+j) fkeyi+j=fkeyi+j-Nkfkeyi+j-1; else(i+j) if (j+4)8) ROTL16(ftable(BYTE)(xfim+116) ROTL24(ftablexfim+224)
12、; t=x; y=t; /* swap pointers */* Last Round - unroll if possible */ yj=fkeyk+(WORD)fbsub(BYTE)xj ROTL8(WORD)fbsub(BYTE)(xfim ROTL16(WORD)fbsub(BYTE)(xfim+1 ROTL24(WORD)fbsubxfim+2 unpack(yi,(BYTE *)& xi=yi=0; /* clean up stack */ return;void decrypt(char *buff) ai=rkeyi; loop and hard-code in the va
13、lues of ri */ /* This is the time-critical bit */ yj=rkeyk+rtable(BYTE)xj ROTL8(rtable(BYTE)(xrim ROTL16(rtable(BYTE)(xrim+1 ROTL24(rtablexrim+2 yj=rkeyk+(WORD)rbsub(BYTE)xj ROTL8(WORD)rbsub(BYTE)(xrim ROTL16(WORD)rbsub(BYTE)(xrim+1 ROTL24(WORD)rbsubxrim+2int main() /* test driver */ int i,nb,nk; ch
14、ar str=abcd1234567890123456789012345678901212345678901234567890123456789012 char key32; char block32; gentables(); strtoHex(str,key); hextoStr(key,str); /just to test these two functionsKey= 64;i+) printf(%c,stri);n32;i+) blocki=i; for (nb=4;nb=8;nb+=2) for (nk=4;nknk+=2) nBlock Size= %d bits, Key Size= %d bitsn,nb*32,nk*32); gkey(nb,nk,key);Plain= nb*4;%02x,blocki); encrypt(block);Encrypt= ,(unsigned char)blocki); decrypt(block);Decrypt= return 0;
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1