#include #include #include #include uint32_t a,b[128]; uint16_t index2,r,cle; /* CARACACHS Cipher (c) Alexander PUKALL 2000 */ /* 256 bits CIPHER */ /* Code free for all, even for commercial application */ /* Public domain */ /* Compilation : gcc caracachs.c -o caracachs */ int stream(uint16_t *r,uint16_t *index2,uint32_t *a,uint32_t *b) { b[*index2] = ( b[*index2] * (*a) ) + 1; *r = (*r + (( b[*index2] >> 16 ) & 0x7fff)); *r = (*r << (*r%16)) | (*r >> (16-(*r%16))); return(0); } uint8_t pc3encode(uint8_t byte) { uint8_t d; for (index2=0;index2<=(cle-1);index2++) { stream(&r,&index2,&a,b); } d=byte; byte=byte^(r&255); r=r+d; b[cle-1]=b[cle-1]+d; return(byte); } uint8_t pc3decode(uint8_t byte) { uint8_t d; for (index2=0;index2<=(cle-1);index2++) { stream(&r,&index2,&a,b); } byte=byte^(r&255); d=byte; r=r+d; b[cle-1]=b[cle-1]+d; return(byte); } int pc3init(uint16_t lngkey,uint8_t key[258]) { uint16_t z,y,x,i,reste; uint8_t tab[258],plain; if (lngkey>256) lngkey=256; if (lngkey<1) { lngkey=1; strcpy(key,"a"); } x=lngkey; for (i=0;i=x) i=0; } reste=lngkey%2; cle=lngkey/2; if (reste!=0) cle=cle+1; for (z=0;z<128;z++) { b[z]=0; } y=0; for (z=0;z<=(cle-1);z++) { if ( (z==(cle-1))&&(reste!=0) ) { b[z]=(tab[y]*256)%65536; } else { b[z]=((tab[y]*256)%65536)+tab[y+1]; y=y+1; } y=y+1; } for (z=0;z