blaza n/a
Član broj: 961 Poruke: 743 *.gf.su.ac.yu
|
Re: F-B-I | 22.09.2001. u 15:22 - pre 285 meseci |
Svojevremeno sam napisao ODLICAN program za sifrovanje u C-u.
Program koristi jednostavno XOR kodovanje sa brojevima koji se izracunavaju VRLO SLOZENOM RND rutinom. Dodatna zastita je to sto se jedan fajl moze razbiti u do 8 fajlova. Pri tome program sekvencijalno cita fajl koji se kodira i svaki bajt kodira operacijom XOR sa brojem dobijenim SLOZENOM RND rutinom, XOR sa proslim bajtom koji je kodiran, a zatim takodje koristeci RND rutinu bira jedan od izlaznih fajlova u koji ce napisati taj bajt(moze biti jedan izlazni fajl, ili vise .max. 8 ). Dodatna zastita je to sto isto koristeci RND rutinu u fajl(ove) se ubacuju slucajni brojevi koji se lako izbacuju prilikom dekodiranja, ako se zna postupak ubacivanja :) Ovi brojevi ce minimalno produziti konacnu duzinu fajlova, ali predstavljaju pravu nocnu moru za dekriptere, posto totalno remete situaciju. Bajtovi se dobro kodiraju i totalno razbacaju u vise fajlova. Dekodiranje ovoga bio bi momacki posao.
Evo programa :
/* CNVRT by Blaza */
#include <stdio.h>
#include <stdlib.h>
#define MAXNOF 8
int s[4],i,j,k,nif,nof,end,po,mo;
char frst,bfr[50],bfr1[10];
unsigned char c;
FILE *f[MAXNOF+1];
float tt(int ta, int tb, int tc, int td, int te);
int rnd(int rm);
unsigned char cnv(unsigned char cc);
int getfilename(char *name, int ge);
void opn(int oi, char *oc, int oe);
void err(int ie);
int ky(int ai,int bi,char kc);
void getkey(char *key);
void pt(unsigned char pp, int pi);
unsigned char gt(int ii);
void test(void);
void hiddenkey(void);
int main(int argv, char *argc[])
{
setbuf(stdin,NULL);
mo=0;
nof=1;
k=0;
printf("\n");
if ((argv>4)||(argv<3))err(1);
nif=getfilename(argc[1],2);
for(i=0;i<nif;i++)opn(i,"rb",3);
if(strcmp(argc[2],"hidden"))
getkey(argc[2]);
else
{
printf("\nEnter key : ");
hiddenkey();
i=0;
strcpy(bfr1,bfr);
printf("\nRetype key : ");
hiddenkey();
if(strcmp(bfr,bfr1))err(7);
else
getkey(bfr1);
};
if(argv==4)
{
mo=1;
nof=getfilename(argc[3],4);
if((nif>1)&&(nof>1))err(5);
for(i=0;i<nof;i++)opn(i,"wb",6);
};
i=0;
while(bfr[i ]=argc[1][i])++i;
i=0;
do
{
test();
j=rnd(0);
if(mo==0)bfr[i]=cnv(gt(j));
else
pt(cnv((unsigned char)bfr[i]),j);
}
while(bfr[i++]!=0);
if(mo==0)
{
po=-1;
opn(0,"wb",6);
}
i=0;
end=nif;
while (end!=0)
{
if(i++==0)test();
else
{
k=rnd(0);
if(mo==0)pt(cnv(gt(k)),0);
else
pt(cnv(gt(0)),k);
};
};
if(i==1024)i=0;
for(i=0;i<nif+nof;i++)fclose(f[i]);
if(mo==0)err(8);
else
err(9);
}
float tt(int ta, int tb, int tc , int td ,int te)
{
s[ta]=tb*(s[ta]%tc)-td*(s[ta]/tc);
if(s[ta]<0) s[ta]+=te;
return(float)s[ta]/te;
}
int rnd(int rm)
{
float t;
t=tt(1,171,177,-2,30269)+tt(2,172,1176,-35,30307)+tt(3,107,178,-63,30323);
return (int)(1024*t)%(256*rm+(1-rm)*(mo*nof+(1-mo)*nif));
}
unsigned char cnv(unsigned char cc)
{
if(++s[0]==256)s[0]=0;
return((cc^rnd(1))^s[0]);
}
int getfilename(char *name,int ge)
{
int gi,nf;
po=-1;
i=0;
do
{
if((bfr[i]=name[i])=='*')po=i;
}
while (bfr[i++]!=0);
if(po==-1)return 1;
if ((i-po)<3) err(ge);
nf=bfr[po+2]-bfr[po+1]+1;
if ((nf<0)||(nf>MAXNOF))err(ge);
frst=bfr[po+1];
for(gi=po+1;gi<i-2;gi++) bfr[gi]=bfr[gi+2];
return nf;
}
void opn(int oi, char *oc, int oe)
{
int io;
io= (oc[0]=='w') ? 1 : 0;
if(po!=-1)bfr[po]=frst+oi;
if(oc[0]=='r')
printf("\nOpening : %s ",bfr);
else
printf("\nMaking : %s ",bfr);
f[oi+io*nif]=fopen(bfr,oc);
if(f[oi+io*nif]==NULL)err(oe);
}
void err(int ie)
{
switch(ie) {
case 1:printf("CNVRT input file(s) key [output files(s)]\n");
exit(0);
case 2:printf("\nWrong filename\n");
exit(0);
case 3:printf("\nCan`t find file\n");
exit(0);
case 4:printf("\nWrong filename \n");
exit(0);
case 5:printf("\nWrong filenames \n");
exit(0);
case 6:printf("\nCan`t make file \n");
exit(0);
case 7:printf("\nWrong key \n");
exit(0);
case 8:printf("\nFile decrypted \n");
exit(1);
case 9:printf("\nFile crypted \n");
exit(1);
};
}
int ky(int ai,int bi,char kc)
{
if(ai>=bi)return 0;
else
if((kc>=48)&&(kc<=57))return kc-47;
else
if(kc==95)return 11;
else
if((kc>=65)&&(kc<=90))return kc-53;
else
if((kc>=97)&&(kc<=122))return kc-59;
else
return 0;
}
void getkey(char *key)
{
for(i=0;i<9;i++)bfr[i]=0;
i=0;
while(bfr[i]=key[i])++i;
i++;
if(i>9)err(7);
s[1]=ky(0,i,bfr[0])+64*ky(5,i,bfr[5])+512*(ky(6,i,bfr[6])&56);
s[2]=ky(1,i,bfr[1])+64*ky(3,i,bfr[3])+4096*(ky(6,i,bfr[6])&7);
s[3]=ky(2,i,bfr[2])+64*ky(4,i,bfr[4])+512*(ky(7,i,bfr[7])&56);
s[0]=32*(ky(7,i,bfr[7])&7)+ky(8,i,bfr[8])/2;
}
void pt(unsigned char pp, int ii)
{
if(feof(f[k*(1-mo)])!=32)putc(pp,f[ii+nif]);
}
unsigned char gt(int ii)
{
c=fgetc(f[ii]);
if (feof(f[ii])==32)end--;
return c;
}
void test(void)
{
j=rnd(0);
if(mo==1)pt(cnv(rnd(1)),j);
else
if (cnv(gt(j))!=rnd(1))err(7);
}
void hiddenkey(void)
{
for(i=0;i<9;i++)bfr[i]=0;
i=0;
setbuf(stdin,NULL);
do
{
c=getch(stdin);
if((c>31)&&(i<9))
{
bfr[i++]=c;
printf("*");
}
else
if((c=='\b')&&(i>0))
{
bfr[i--]=0;
printf("\b \b");
}
}
while(c!=13);
}
Nacin upotrebe:
Sve fajlove koje hocete da kriptujete stavite u jedan ZIP (RAR) fajl. Npr. KLOPA.ZIP
Startujete DOS prompt, i pisete :
cnvrt KLOPA.ZIP sifra VBR47*05.DLL
tada ce program izvrsiti kodiranje i razbijanje na fajlove VBR470.DLL, VBR471.DLL, VBR472,DLL, VBR473.DLL, VBR474.DLL i VBR475.DLL na primer.
Ako za sifru napisete : hidden , tada ce program prvo da vas pita da otkucate i da ponovite sifru, pri cemu ce ispisivati **** (ako su necije radoznale oci u blizini koristite ovu opciju).
Dekripcija je jednostavna : Sve potrebne fajlove (sve DLL fajlove u ovom slucaju) stavite u isti direktorij sa CNVRT i napisete
cnvrt VBR47*05.DLL sifra (ili cnvrt VBR47*05.DLL hidden , ako zelite unos sifre sa *****). Program ce tada namestiti fajl KLOPA.ZIP.
Sifra moze biti maksimalno 9 karaktera duzine. Mogu se koristiti karakteri : 0..9, a..z i A..Z, (mozda i jos poneki, ne secam se, ovo sam pisao 1998.)
Zvezdica u imenu fajla *05 oznacava da se radi o vise fajlova, pri cemu se prvi karakter nakon zvezdice ubacuje u ime prvog fajla, a zatim se sledeci karakter u ASCII nizu ubacuje u ime drugog fajla , itd.... a drugi karakter posle * ce se ubaciti u ime zadnje fajla umesto *fajla
primer FRU*EGA.EXE ce napraviti fajlove: FRUEA.EXE, FRUFA.EXE i FRUGA.EXE
Koristio sam ovaj program par puta i desavalo mi se da zaboravim sifru...
Ako se to desi nema leba..
Pisao sam vise verzija ovog programa..ovu sam isprobao pre 5 min da bih bio siguran da radi ispravno
NAPOMENA: sifra je CASE SENSITIVE.razlikuje mala i velika slova
HMMM....imao sam prilicno problema prilikom pastovanja ovog programa..posto su se neki karakteri gubili..medjutim izvrsio sam potrebne korekcije, kopirao sam program sa ove stranice i isprobao da bih bio siguran da radi...
Evo primera:
C:proba>dir
Volume in drive C is C
Volume Serial Number is 2713-12EB
Directory of C:proba
. <DIR> 09-22-01 3:26p .
.. <DIR> 09-22-01 3:26p ..
KLOPA ZIP 920,690 09-13-01 1:38p klopa.zip
CNVRT EXE 35,989 09-22-01 3:20p cnvrt.exe
2 file(s) 956,679 bytes
2 dir(s) 42,467,426,304 bytes free
C:proba>cnvrt klopa.zip hidden vbr47*05.dll
Opening : klopa.zip
Enter key : *******
Retype key : *******
Making : vbr470.dll
Making : vbr471.dll
Making : vbr472.dll
Making : vbr473.dll
Making : vbr474.dll
Making : vbr475.dll
File crypted
C:proba>del klopa.zip
C:proba>dir
Volume in drive C is C
Volume Serial Number is 2713-12EB
Directory of C:proba
. <DIR> 09-22-01 3:26p .
.. <DIR> 09-22-01 3:26p ..
VBR470 DLL 153,176 09-22-01 3:30p VBR470.DLL
VBR471 DLL 153,012 09-22-01 3:30p VBR471.DLL
VBR472 DLL 153,720 09-22-01 3:30p VBR472.DLL
CNVRT EXE 35,989 09-22-01 3:20p cnvrt.exe
VBR473 DLL 153,381 09-22-01 3:30p VBR473.DLL
VBR474 DLL 153,725 09-22-01 3:30p VBR474.DLL
VBR475 DLL 153,711 09-22-01 3:30p VBR475.DLL
7 file(s) 956,714 bytes
2 dir(s) 42,467,414,016 bytes free
C:proba>cnvrt vbr47*05.dll paprika
Opening : vbr470.dll
Opening : vbr471.dll
Opening : vbr472.dll
Opening : vbr473.dll
Opening : vbr474.dll
Opening : vbr475.dll
Making : klopa.zip
File decrypted
C:proba>dir
Volume in drive C is C
Volume Serial Number is 2713-12EB
Directory of C:proba
. <DIR> 09-22-01 3:26p .
.. <DIR> 09-22-01 3:26p ..
VBR470 DLL 153,176 09-22-01 3:30p VBR470.DLL
VBR471 DLL 153,012 09-22-01 3:30p VBR471.DLL
VBR472 DLL 153,720 09-22-01 3:30p VBR472.DLL
KLOPA ZIP 920,690 09-22-01 3:34p klopa.zip
CNVRT EXE 35,989 09-22-01 3:20p cnvrt.exe
VBR473 DLL 153,381 09-22-01 3:30p VBR473.DLL
VBR474 DLL 153,725 09-22-01 3:30p VBR474.DLL
VBR475 DLL 153,711 09-22-01 3:30p VBR475.DLL
8 file(s) 1,877,404 bytes
2 dir(s) 42,466,492,416 bytes free
C:proba>
O_o
|