From: Serdar KÖYLÜ (serdarkoylu@fisek.com.tr)
Date: Tue 13 Jul 2004 - 12:40:24 EEST
Selamlar..
BU CRC ne ile alinmis o onemli. CRC32, CRC16 ?
CRC32 ve CRC32B ikiside mhash ile yapilabilir.
Alttaki sonuclar 16 Bit, demekki size 16 Bit CRC uretici lazim:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define M16 0xA001 /* crc-16 mask */
#define MTT 0x1021 /* crc-ccitt mask */
unsigned int updcrc(unsigned int,int,unsigned int);
unsigned int updcrcr(unsigned int,int,unsigned int);
void perr(char *msg);
char filename[100];
unsigned int crc16,crctt;
int ch;
unsigned long num;
FILE *fp;
main(argc,argv)
int argc; char **argv;
{
if(argc>2) perr("Usage: crc2 [filename]");
if(argc==2) strcpy(filename,argv[1]);
/* Yukaridaki buffer overflow exploit vakasina dikkat */
else
{
printf("\nEnter filename: "); gets(filename);
}
if((fp=fopen(filename,"rb"))==NULL) perr("File cannot be
opened\n");
num=0L; crc16=crctt=0;
while((ch=fgetc(fp))!=EOF)
{
num++;
crc16=updcrcr(crc16,ch,M16);
crctt=updcrc(crctt,ch,MTT);
}
fclose(fp);
printf("\n%d Bytes CRC hesaplandi.\nCRC16 = %04X\nCRCTT = %04X",
num,crc16,crctt);
}
unsigned int updcrc(crc,c,mask)
unsigned int crc,mask; int c;
{
int i;
c<<=8;
for(i=0;i<8;i++)
{
if((crc ^ c) & 0x8000) crc=(crc<<1)^mask;
else crc<<=1;
c<<=1;
}
return crc;
}
unsigned int updcrcr(crc,c,mask)
unsigned int crc,mask; int c;
{
int i;
for(i=0;i<8;i++)
{
if((crc ^ c) & 1) crc=(crc>>1)^mask;
else crc>>=1;
c>>=1;
}
return crc;
}
void perr(s)
char *s;
{
printf("\n%s",s); exit(1);
}
Sanirim bu kod isinizi gorebilir, derlemek, denemek filan lazim,
ayakustu yazinca biraz guvenilmez olabiliyor.. Bu file uzerinden aliyor
datayi, defalarca binary stringi komut satirina koymak zor olabilir..
Saygi ve sevgiler..
> merhabalar,
> yazdigim bir programda tasidigim verilerin guvenligini saglamak amaci ile
> "CRC (Cyclic Redundancy Code) Check" metodu kullanmak istemekteyim. Bunun icin
> elimde asagidakine benzer bir kac tane ornek var:
>
> Related Command | CRC Code
> ------------------+---------
> 01 05 00 00 FF FF | CC 7A
> 01 04 00 00 00 03 | B0 0B
> 01 02 00 00 00 08 | 79 CC
>
> internette yaklasik 1 haftadir CRC'nin nasil hesaplandigi uzerine arastirmalar
> yapiyorum ve sorun su ki buldugum metodlar ile elde ettigim CRC Check
> sonuclarinin hicbiri yukaridaki gibi olmuyor (yani ornegin: CC 7A'yi hic elde
> edemedim :) belirtmem gerekirse kalan metodundan teker teker bulma ya da
> "High Order Byte" ve "Low Order Byte" tablolarindan yaralanarak sonuc elde etme
> (hos ikisinin de ayni kapiya cikmasi lazim teorikte ama...) gibi yontemler de
> denedim.
>
> bu konuda deneyimli arkadaslar varsa, yardimlari gercekten cok makbule gececek.
> ilgili fonksiyonun hangi programlama dilinde oldugunun da onemi yok,
> anlasilabilir olsun yeter. ne de olsa algoritma, algritmadir.
>
> iyi calismalar
>
>
> -- Attached file included as plaintext by Ecartis --
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.2.4 (GNU/Linux)
>
> iD8DBQFA86dhGcWq5WdHoacRAnQKAJ9KOu32STbsfazQ/Edd7WmcgDSjmACgiGUJ
> b+lWLX+vJMJxqkV/WAFtpxc=
> =pFT0
> -----END PGP SIGNATURE-----
>
>
>
>