www.pudn.com > pc1-256.zip > pc1dec.c
/* File PC1DEC.c */ /* written in Borland Turbo C 2.0 on PC */ /* PC1 Cipher Algorithm ( Pukall Cipher 1 ) */ /* By Alexander PUKALL 1991 */ /* free code no restriction to use */ /* please include the name of the Author in the final software */ /* the Key is 256 bits */ /* Tested with Turbo C 2.0 for DOS and Microsoft Visual C++ 5.0 for Win 32 */ /* Note that PC1COD256.c is the encryption routine */ /* PC1DEC256.c is the decryption routine */ /* Only the K zone change in the two routines */ /* You can create a single routine with the two parts in it */ #include#include unsigned short ax,bx,cx,dx,si,tmp,x1a2,x1a0[16],res,i,inter,cfc,cfd,compte; unsigned char cle[32]; unsigned char buff[32]; short c; int c1,count; FILE *in,*out; fin() { /* erase all variables */ for (compte=0;compte<=31;compte++) { cle[compte]=0; } ax=0; bx=0; cx=0; dx=0; si=0; tmp=0; x1a2=0; x1a0[0]=0; x1a0[1]=0; x1a0[2]=0; x1a0[3]=0; x1a0[4]=0; res=0; i=0; inter=0; cfc=0; cfd=0; compte=0; c=0; exit(0); return(0); } assemble() { x1a0[0]= ( cle[0]*256 )+ cle[1]; code(); inter=res; x1a0[1]= x1a0[0] ^ ( (cle[2]*256) + cle[3] ); code(); inter=inter^res; x1a0[2]= x1a0[1] ^ ( (cle[4]*256) + cle[5] ); code(); inter=inter^res; x1a0[3]= x1a0[2] ^ ( (cle[6]*256) + cle[7] ); code(); inter=inter^res; x1a0[4]= x1a0[3] ^ ( (cle[8]*256) + cle[9] ); code(); inter=inter^res; x1a0[5]= x1a0[4] ^ ( (cle[10]*256) + cle[11] ); code(); inter=inter^res; x1a0[6]= x1a0[5] ^ ( (cle[12]*256) + cle[13] ); code(); inter=inter^res; x1a0[7]= x1a0[6] ^ ( (cle[14]*256) + cle[15] ); code(); inter=inter^res; x1a0[8]= x1a0[7] ^ ( (cle[16]*256) + cle[17] ); code(); inter=inter^res; x1a0[9]= x1a0[8] ^ ( (cle[18]*256) + cle[19] ); code(); inter=inter^res; x1a0[10]= x1a0[9] ^ ( (cle[20]*256) + cle[21] ); code(); inter=inter^res; x1a0[11]= x1a0[10] ^ ( (cle[22]*256) + cle[23] ); code(); inter=inter^res; x1a0[12]= x1a0[11] ^ ( (cle[24]*256) + cle[25] ); code(); inter=inter^res; x1a0[13]= x1a0[12] ^ ( (cle[26]*256) + cle[27] ); code(); inter=inter^res; x1a0[14]= x1a0[13] ^ ( (cle[28]*256) + cle[29] ); code(); inter=inter^res; x1a0[15]= x1a0[14] ^ ( (cle[30]*256) + cle[31] ); code(); inter=inter^res; i=0; return(0); } code() { dx=x1a2+i; ax=x1a0[i]; cx=0x015a; bx=0x4e35; tmp=ax; ax=si; si=tmp; tmp=ax; ax=dx; dx=tmp; if (ax!=0) { ax=ax*bx; } tmp=ax; ax=cx; cx=tmp; if (ax!=0) { ax=ax*si; cx=ax+cx; } tmp=ax; ax=si; si=tmp; ax=ax*bx; dx=cx+dx; ax=ax+1; x1a2=dx; x1a0[i]=ax; res=ax^dx; i=i+1; return(0); } main() { si=0; x1a2=0; i=0; /* ('abcdefghijklmnopqrstuvwxyz012345') is the default password used*/ /* if the user enter a key < 32 characters, characters of the default */ /* password will be used */ strcpy(cle,"abcdefghijklmnopqrstuvwxyz012345"); printf ("PC1 Cipher 256 bits \nDECRYPT file OUT.BIN to IN.BIN\n"); printf("Enter a 32 chars password:"); gets(buff); if (strlen(buff)>32) { count=32; } else {count=strlen(buff);} for (c1=0;c1 >8; cfd=inter&255; /* cfc^cfd = random byte */ /* K ZONE !!!!!!!!!!!!! */ /* here the mix of c and cle[compte] is after the decryption of c */ c = c ^ (cfc^cfd); for (compte=0;compte<=31;compte++) { /* we mix the plaintext byte with the key */ cle[compte]=cle[compte]^c; } fputc(c,out); /* we write the decrypted byte in the file IN.BIN */ } fclose (in); fclose (out); fin(); return(0); }