Newsgroup: it.comp.lang.visual-basic
Titolo: [?] come si fa un checksum?

ciao a tutti.
domani ho l'orale del penultimo esame: sperem che tutto vada bene,
cosi' potro' tornare ad essere un po' presente sul gruppo...
ho un problemino: devo fare un po' di hacking su un file creato con un
programma. dopo n prove, ho trovato cosa devo modificare e l'ho
modificato come mi serve, ma ho rimasto un problema non trascurabile:
nel file, all'inizio, ci sono alcuni bytes usati come "sicurezza" che
il file non sia danneggiato e, precisamente, 2 di questi indicano la
dimensione del file ed alcuni altri il checksum.
- quelli per la dimensione del file li ho trovati e li ho corretti.
- quelli per il checksum credo di averli identificati, pero' non so
come si calcola un checksum e, soprattutto, se c'e' solo un metodo o
se ce ne sono alcuni molto comuni da tentare o che altro.
avete qualche consiglio da darmi in proposito? qualche algoritmo di
calcolo di un checksum? una spiegazione di cos'e' un checksum, cosi'
da "immaginare" come potrebbe essere stato calcolato da quei malati
della blizzard?
come sempre, grazie in anticipo.
purtroppo quello che ho trovato con google non mi e' stato di grande
aiuto :|
saluti.
-- 
    Gianni "bugbarbeq" Rondinini, 26+15, RA, 193, 152
  VBR - Vero Birro Romagnolo®, diffidate dalle imitazioni!
  BatMobile EVO Fast Driver - Kawasaki "Gas Gas" ZZ-R 1100
 ICQ# 36893168 - IRCNet: bugbarbeq, @ on #linux-it & #NetBSD
   On contrary of popular belief, Unix *IS* user friendly:
    it just appears to be selective who it is friend with

 della blizzard?
[...]
Non indago su quale sia il file e quali i tuoi scopi:)
Il checksum è il risultato di una serie di operazioni su un gruppo di dati,
e serve a controllare che i dati non siano stati modificati.
Di fatto è un hash, e la funzione per il calcolo è la funzione di hashing.
Ed ovviamente il suo problema sono i cluster, ossia i gruppi di dati,
diversi, che producono lo stesso checksum. Perchè su quelli il controllo
fallisce.
Ti faccio un esempio: il checksum + banale per un byte è la somma dei
singoli bit:  il checksum di 00011001 è 3. Se durante la trasmissione del
byte si genera un errore ed il byte diventa 10011001, ricalcolando il
checksum te ne accorgi. Se però nella trasmissione si generano _due_ errori,
ed il byte diventa 10010001, allora il checksum è sempre 3 e tu non ti
accorgi che ci sono stati 2 errori. Quindi un checksum è perfetto quando ad
ogni gruppo di dati corrisponde un solo risultato (ossia quando la funzione
utilizzata è strettamente monotonica).
Se l'intento di chi lo ha creato era di impedire che qualcuno manipolasse i
dati, è probabile che abbia utilizzato un algoritmo proprietario, ed allora
sarà dura, per non dire impossibile.
Se invece l'intento era di assicurarsi l'integrità dei dati, allora è molto
probabile che abbia utilizzato il CRC (16 o 32 a seconda che siano 2 o 4
byte), che è pubblico e che è dimostrato che, per l'appunto, garanrtisce
l'unicità del checksum al 99,996% (mi sembra).
Descrizioni dell'algoritmo se ne trovano ovunque, e sicuramente anche
controlli già fatti. L'ideale sarebbe farlo in C perchè usa molto lo shift
dei bit. quindi in Vb sarà un po' lento.
Hth
Alfonso


prova a cercare info sul CRC oppure se sono proprio "malati" prova con la
tecnica
di hamming (molto improbaile)
                                ciao.

dei bit. quindi in Vb sarà un po' lento.
per il momento, ti ringrazio *molto* perche' mi hai gia' aiutato
moltissimo con questa spiegazione. vedo se trovo qualcosa sul crc32 in
rete: se ti capita di avere un link, me lo posteresti qua sotto con
calma? nel week end vorrei mettermi dietro a macchinare un po'...
eventualmente, per le prestazioni non mi preoccupo un gran che', visto
che, comunque, e' una cosa da usare una tantum.
ciao e grazei ancora.


per il crc32 ho trovato una classe per vb. la provo e vi faccio sapere
come va. in caso interessasse a qualcun altro...
