/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
CRC / hash på fil
Fra : Jesper Gødvad


Dato : 08-08-01 17:17

Hej Alle

Jeg har tænkt mig at lave noget fil administration/håndtering og har derfor
brug for at beregnet en CRC på de enkelte filer, så jeg kan se om de er
identiske til trods for forskellige navne.

Egentlig havde jeg tænkt mig at traversere filen og lægge de næste 4 bytes
til en integer hvor jeg ignorerer overflows, så jeg ender ud med en "32 bits
tværsum" eller hvad det hedder.

Er der en anden bedre måde at beregne CRC på?

Kan jeg slå overflow checking fra for en enkelt variabel i en enkelt
rutine - og hvordan?

Håber en af jer kan hjælpe.

med venlig hilsen jesper





 
 
Anders Johannsen (08-08-2001)
Kommentar
Fra : Anders Johannsen


Dato : 08-08-01 18:07

In article <9krp1o$c1s$1@sunsite.dk>, "Jesper Gødvad" <Xesper@goedvad.dk>
wrote:

> Hej Alle
>
> Jeg har tænkt mig at lave noget fil administration/håndtering og har
> derfor brug for at beregnet en CRC på de enkelte filer, så jeg kan se om
> de er identiske til trods for forskellige navne.
>
> Er der en anden bedre måde at beregne CRC på?

MD5 er din ven, jvf. RFC1321

/A

Jesper Gødvad (09-08-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 09-08-01 12:04


"Anders Johannsen" <anders@notvalid.dk> wrote in message

> > Er der en anden bedre måde at beregne CRC på?
>
> MD5 er din ven, jvf. RFC1321

Jeg har fundet den her:
http://www.ietf.org/rfc/rfc1321.txt?number=1321

Min ven snakker om 'message digest' og 'fingerprint', men lige pludselig
kommer der 'security' ind i billedet. Så vidt jeg kan se er der ingen
krypteringsnøgle -- eller hva?

Tak for hjælpen.

mvh jesper





Kent Friis (09-08-2001)
Kommentar
Fra : Kent Friis


Dato : 09-08-01 18:07

Den Thu, 9 Aug 2001 13:04:29 +0200 skrev Jesper Gødvad:
>
>"Anders Johannsen" <anders@notvalid.dk> wrote in message
>
>> > Er der en anden bedre måde at beregne CRC på?
>>
>> MD5 er din ven, jvf. RFC1321
>
>Jeg har fundet den her:
>http://www.ietf.org/rfc/rfc1321.txt?number=1321
>
>Min ven snakker om 'message digest' og 'fingerprint', men lige pludselig
>kommer der 'security' ind i billedet. Så vidt jeg kan se er der ingen
>krypteringsnøgle -- eller hva?

MD5 er en one-way-hash, dvs. når først man har puttet fx et password
igennem MD5, er der ingen vej tilbage. Der sker altså ikke noget ved at
gemme passwordet, når først det har været igennem MD5. Når brugeren så
indtaster sit password, puttes det også igennem MD5, og resultatet
sammenlignes med det gemte password. Derved er det muligt at vide om et
password er korrekt, uden at det er muligt at finde det korrekte
password.

Mvh
Kent
--
Indlæringskurven til Linux er stejl, til tider lodret... Men for katten
hvor er udsigten på toppen dog fantastisk
- Michael G. Vendelbo i dk.snak

Jesper Gødvad (09-08-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 09-08-01 23:59


"Kent Friis" <kfr@fleggaard.dk> wrote in message
news:9kufv0$1fr$1@sunsite.dk...


> >Min ven snakker om 'message digest' og 'fingerprint', men lige pludselig
> >kommer der 'security' ind i billedet. Så vidt jeg kan se er der ingen
> >krypteringsnøgle -- eller hva?
>
> MD5 er en one-way-hash, dvs. når først man har puttet fx et password
> igennem MD5, er der ingen vej tilbage. Der sker altså ikke noget ved at
> gemme passwordet, når først det har været igennem MD5. Når brugeren så
> indtaster sit password, puttes det også igennem MD5, og resultatet
> sammenlignes med det gemte password. Derved er det muligt at vide om et
> password er korrekt, uden at det er muligt at finde det korrekte
> password.

Det kan jeg godt se, men når du ikke kan bruge MD5 til at dekryptere med må
du jo have de data du vil beskytte liggende som 'klar-tekst' og hvis jeg kan
få adgang til din passwordfil kan jeg vel også få fat i dine øvrige data?

mvh. jesper




Jacob Bunk Nielsen (10-08-2001)
Kommentar
Fra : Jacob Bunk Nielsen


Dato : 10-08-01 00:15

"Jesper Gødvad" <Xesper@goedvad.dk> writes:

> Det kan jeg godt se, men når du ikke kan bruge MD5 til at dekryptere med må
> du jo have de data du vil beskytte liggende som 'klar-tekst' og hvis jeg kan
> få adgang til din passwordfil kan jeg vel også få fat i dine øvrige data?

MD5 er en hashfunktion, ikke en krypteringsalgoritme til at starte
med.

Hvis de data du beskytter ligger et sted, så de kun kan nås ved at
indtaste et korrekt password, så nytter det ikke meget at du får fat i
passwordfilen, da der jo kun står MD5 hashes i den. Alt hvad du hælder
igennem som password bliver så hashed igen, og md5(md5(noget)) er ikke
det samme som md5(noget).

Man har selvfølgelig et problem, hvis man kan springe hash-leddet
over, da man jo så vil stå med den korrekte hashværdi, det skal man så
bare ikke have lov til.

--
Jacob
Smile, it makes people wonder what you're thinking.

http://www.bunk.cc - nu med Emacs effekt

Mogens Hansen (08-08-2001)
Kommentar
Fra : Mogens Hansen


Dato : 08-08-01 18:25


"Jesper Gødvad" <Xesper@goedvad.dk> wrote in message
news:9krp1o$c1s$1@sunsite.dk...
> Hej Alle
>
> Jeg har tænkt mig at lave noget fil administration/håndtering og har
derfor
> brug for at beregnet en CRC på de enkelte filer, så jeg kan se om de er
> identiske til trods for forskellige navne.

Måske

http://www.boost.org/libs/crc/index.html

kan hjælpe dig.

Venlig hilsen

Mogens Hansen



Jesper Gødvad (10-08-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 10-08-01 00:16


"Mogens Hansen" <mogens_h@dk-online.dk> wrote in message
news:9krsdd$1li9$1@news.cybercity.dk...
>

> > brug for at beregnet en CRC på de enkelte filer, så jeg kan se om de er
> > identiske til trods for forskellige navne.
>
> Måske
>
> http://www.boost.org/libs/crc/index.html
>
> kan hjælpe dig.

Ja, det så sådan ud, men jeg kan ikke få det til at virke til trods for
ihærdige forsøg.

Samtlige boost-biblioteker er downloaded og jeg har forsøgt at kompilere det
medfølgende testprogram (dog med en rettelse af test_main() til blot main()
(jeg har også forsøgt at kalde test_main() fra min egen main for at se om
det hjalp) ).

I en almindelig Builder app får jeg 3 stk's Unresolved External der
refererer til __InitVCL, __ExitVCL og _main. Så gik jeg over til
kommandoprompt og forsøgte mig også med console app's uden VCL. Uanset hvad
jeg foretager mig bliver jeg overdynget med warnings om signed/unsigned
compare, unreachable code o. lign før jeg til sidst stopper med error 'no
match for std::for_each.

Borlands compiler er nævnt hos 'boost', så jeg går udfra at det virker, men
det er mig der gør noget forkert. Det er efterhånden en velkendt situation
at kode ikke virker lige netop hos mig. Jeg går udfra at warnings for
(un)signed kan slås fra og at det er noget man typisk gør når man ved/tror
at man ikke får overflows, men hvordan gør man det?

Jeg har også overvejet om problemet blot skyldes at Borland ikke har
inkluderet for_each selvom den er en del af Standard Library, men det
forklarer jo ikke de øvrige fejl, så den sag er jeg ikke gået videre med.

Nå, der er ingen der skal bruge tid på det her, men hvis det blot er en
switch jeg skal slå til eller en forkert fremgangsmåde vil jeg gerne høre om
den. Hvis det er biblioteket der skal tilpasses må jeg vente til jeg selv
kan finde ud af det.

mvh jesper

--


Borland C++ 5.5 for Win32 Copyright (c) 1993, 2000 Borland
crc_test.cpp:
Warning W8004 g:\source\libs\boost_all\boost_1_23_0\boost/test/test_main.cpp
61: 'result' is assigned a value that is never used in function
cpp_main(int,char * *)
Warning W8027
g:\source\libs\boost_all\boost_1_23_0\boost/random/detail/const_mod.hpp 117:
Functions containing while are not expanded inline
Warning W8027
g:\source\libs\boost_all\boost_1_23_0\boost/random/detail/const_mod.hpp 135:
Functions containing for are not expanded inline
Warning W8027 crc_test.cpp 276: Functions containing static variables are
not expanded inline in function optimal_crc32(const void *,unsigned int)
Warning W8004 crc_test.cpp 389: 'elapsed_time' is assigned a value that is
never used in function time_trial(const char *,unsigned long (*)(const void
*,unsigned int),unsigned long,const void *,unsigned int)
Warning W8008 crc_test.cpp 183: Condition is always false in function
crc_tester<16,4129,65535,0,0,0>::error_test()
Warning W8066 crc_test.cpp 185: Unreachable code in function
crc_tester<16,4129,65535,0,0,0>::error_test()
Warning W8012 crc_test.cpp 214: Comparing signed and unsigned values in
function crc_tester<16,4129,65535,0,0,0>::error_test()
Warning W8012 crc_test.cpp 215: Comparing signed and unsigned values in
function crc_tester<16,4129,65535,0,0,0>::error_test()
Warning W8012 crc_test.cpp 227: Comparing signed and unsigned values in
function crc_tester<16,4129,65535,0,0,0>::error_test()
Warning W8012 crc_test.cpp 228: Comparing signed and unsigned values in
function crc_tester<16,4129,65535,0,0,0>::error_test()
Warning W8008 crc_test.cpp 183: Condition is always false in function
crc_tester<16,32773,0,0,1,1>::error_test()
Warning W8066 crc_test.cpp 185: Unreachable code in function
crc_tester<16,32773,0,0,1,1>::error_test()
Warning W8012 crc_test.cpp 214: Comparing signed and unsigned values in
function crc_tester<16,32773,0,0,1,1>::error_test()
Warning W8012 crc_test.cpp 215: Comparing signed and unsigned values in
function crc_tester<16,32773,0,0,1,1>::error_test()
Warning W8012 crc_test.cpp 227: Comparing signed and unsigned values in
function crc_tester<16,32773,0,0,1,1>::error_test()
Warning W8012 crc_test.cpp 228: Comparing signed and unsigned values in
function crc_tester<16,32773,0,0,1,1>::error_test()
Warning W8008 crc_test.cpp 183: Condition is always false in function
crc_tester<32,79764919,-1,-1,1,1>::error_test()
Warning W8066 crc_test.cpp 185: Unreachable code in function
crc_tester<32,79764919,-1,-1,1,1>::error_test()
Error E2285 crc_test.cpp 646: Could not find a match for
'std::for_each<InputIterator,Function>(const unsigned char *,const unsigned
char *,boost::crc_16_type)' in function test_main(int,char * *)
*** 1 errors in Compile ***





Carsten Svaneborg (08-08-2001)
Kommentar
Fra : Carsten Svaneborg


Dato : 08-08-01 20:56

Jesper Gødvad wrote:
> Jeg har tænkt mig at lave noget fil administration/håndtering og har
> derfor brug for at beregnet en CRC på de enkelte filer, så jeg kan se om
> de er identiske til trods for forskellige navne.

Hvad med at bruge md5sum programmet?

Den følger med i textutils til Linux, du kan finde sourcen på ethvert GNU
mirror. Kører du windows, så har DJ Delorie portet en dos/windows
version af md5sum, der skulle være ganske let at finde med google.

--
Carsten Svaneborg
http://www-theory.mpip-mainz.mpg.de

Jesper Gødvad (10-08-2001)
Kommentar
Fra : Jesper Gødvad


Dato : 10-08-01 01:04


Jeg fandt denne her, som er meget simplere og vel stort set burde virke på
alle compilere.

Da koden er kort poster jeg den her, så andre evt. kan få gavn af den.

Jeg kan godt leve med 2^32 i stedet for 2^128, da jeg alligevel også skal
sammenligne størrelsen - det er faktisk vigtigere det går hurtigt, så
nedenstående klarer jobbet. Men mange tak for hjælpen.

med venlig hilsen jesper

---

// Calculate a CRC 32 checksum.

#include <malloc.h>
#include <stdio.h>

// LAST MODIFIED:[7-28-93]

// Usage:
// unsigned long crc = -1L
// crc = crc32(buffer, length, crc)

unsigned long crc32(void *buffer, unsigned int count, unsigned long crc);
static int BuildCRCTable(void);

static unsigned long *CRCTable; // Table constructed for fast lookup.

#define CRC32_POLYNOMIAL 0xEDB88320L

// Initialize the CRC calculation table
//
static int BuildCRCTable(void)
{
int i, j;
unsigned long crc;

CRCTable = malloc(256 * sizeof(unsigned long));
if (CRCTable == NULL)
{
fprintf(stderr, "Can't malloc space for CRC table in file %s\n",
__FILE__);
return -1L;
}

for (i = 0; i <= 255; i++)
{
crc = i;
for (j = 8; j > 0; j--)
if (crc & 1)
crc = (crc >> 1) ^ CRC32_POLYNOMIAL;
else
crc >>= 1;
CRCTable[i] = crc;
}
return 0;
}

unsigned long crc32(void *buffer, unsigned int count, unsigned long crc)
{
unsigned long temp1, temp2;
static int firsttime = 1;
unsigned char *p = (unsigned char *)buffer;

if (firsttime)
{
if (BuildCRCTable())
return -1;
firsttime = 0;
}

while (count-- != 0)
{
temp1 = (crc >> 8) & 0x00FFFFFFL;
temp2 = CRCTable[((int)crc ^ *p++) & 0xFF];
crc = temp1 ^ temp2;
}
return crc;
}




Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste