Oppure

Loading
06/07/10 20:12
a_butta
ok grazie della risposta.
Non ponendomi il problema ho impostato una banalissima funzione
function bitLen($hex_str) { return strlen($hex_str) * 8; }
Così arrivo alla parte del padding, dove devo aggiungere bit al messaggio in modo da ottenere una lunghezza multipla di 512 meno 64.
Prima di impostare il ciclo che porti il messaggio a quella lunghezza, ho provato a vedere se aggiungendo un bit alla strigna, ottenessi tramite la bitLen veramente una lunghezza di un bit in più:
$str = 'ciao';
echo 'INIZIO = '.bitLen($str);
$str = ($str << 1)|1; //aggiungo un bit 1 alla fine
echo 'FINE = '.bitLen($str);


il tutto mi restituisce:
INIZIO = 32
FINE = 8

Non riesco a uscirne da questo problema (almeno tale per me)...
dove sto sbagliando?
aaa
06/07/10 21:36
HeDo
Postato originariamente da a_butta:

$str = ($str << 1)|1; //aggiungo un bit 1 alla fine


credo proprio che questa riga faccia tutt'altro :)
aaa
06/07/10 21:41
a_butta
Postato originariamente da HeDo:

Postato originariamente da a_butta:

$str = ($str << 1)|1; //aggiungo un bit 1 alla fine


credo proprio che questa riga faccia tutt'altro :)


mmm... questa diciamo che me la sono inventata io:
prendendo un qualsiasi valore binario (mettiamo 110), con lo shift di una posizione a sinistra otterrei 1100 e operando l' or avrei 1101.
Non equivale ad aggiungere un bit 1?
aaa
06/07/10 21:54
HeDo
Postato originariamente da a_butta:

mmm... questa diciamo che me la sono inventata io:
prendendo un qualsiasi valore binario (mettiamo 110), con lo shift di una posizione a sinistra otterrei 1100 e operando l' or avrei 1101.
Non equivale ad aggiungere un bit 1?


si... e mia nonna ha le ali :D
anche ammettendo l'esistenza di una riga del genere non ti passa per la testa che l'ultimo bit a sinistra, prima dello shift, lo perdi?

ad ogni modo non hai chiaro cos'è il padding.
immagina che una lavatrice (la funzione di hash) possa lavare (elaborare) solo 10kg (64bit) di vestiti (bit) alla volta, non uno di più non uno di meno.
Se hai un numero di vestiti (bit) che non è perfettamente multiplo della capacità massima semplicemente aggiungi dei vestiti (bit) nulli per completare il carico.

non devi ragionare con i bit, devi ragionare con i byte, visto che cmq TUTTO è allineato al byte non al bit...
aaa
06/07/10 22:03
a_butta
Postato originariamente da HeDo:

si... e mia nonna ha le ali :D
anche ammettendo l'esistenza di una riga del genere non ti passa per la testa che l'ultimo bit a sinistra, prima dello shift, lo perdi?


mmm... ho provato con numeri piccoli:
5 = 101
(101<<1)|1 = 1011
in php:
echo (5<<1)|1 mi restituisce proprio 11 che è appunto 1011 in binario...
quindi, empiricamente parlando, funziona, a meno che non stia sbagliando comunque qualcosa.

Postato originariamente da HeDo:
ad ogni modo non hai chiaro cos'è il padding.
immagina che una lavatrice (la funzione di hash) possa lavare (elaborare) solo 10kg (64bit) di vestiti (bit) alla volta, non uno di più non uno di meno.
Se hai un numero di vestiti (bit) che non è perfettamente multiplo della capacità massima semplicemente aggiungi dei vestiti (bit) nulli per completare il carico.

non devi ragionare con i bit, devi ragionare con i byte, visto che cmq TUTTO è allineato al byte non al bit...


credo di aver capito il tuo ragionamento, tuttavia se io ragiono in byte, come aggiungo quegli altri "vestiti" che mi servono a far diventare l'intero carico multiplo di 10kg?
Ultima modifica effettuata da a_butta 06/07/10 22:05
aaa
06/07/10 22:27
HeDo
Postato originariamente da a_butta:

mmm... ho provato con numeri piccoli:
5 = 101
(101<<1)|1 = 1011
in php:
echo (5<<1)|1 mi restituisce proprio 11 che è appunto 1011 in binario...
quindi, empiricamente parlando, funziona, a meno che non stia sbagliando comunque qualcosa.



vedi che quando si ragiona per pura induzione senza avere degli assiomi da cui dedurre la conoscenza si prendono solo tante sprangate in faccia:

5 NON è 101

5 è 00000000000000000000000000000101
perchè i numeri sono rappresentati in 32 bit, che ci stiano in 3 non importa, ne hanno sempre 32. Quindi con il tuo metodo FUNZIONA semplicemente perchè ci sono tanti bit vuoti dopo i 3 significativi del 5, ma NON è un metodo applicabile nel caso generale.
Inoltre insisto col dire che tu NON stai aggiungendo bit, NON esiste il concetto di aggiungere bit ad un numero come lo intendi te.

credo di aver capito il tuo ragionamento, tuttavia se io ragiono in byte, come aggiungo quegli altri "vestiti" che mi servono a far diventare l'intero carico multiplo di 10kg?


crei una stringa del numero di byte che ti mancano e la concateni al testo. fine.
aaa
07/07/10 10:54
a_butta
non riesco ancora a capire:
sull'articolo di wikipedia che mi hai postato, leggo questo:

[...]the message is padded so that its length is divisible by 512
[...]
//Pre-processing:
append "1" bit to message
append "0" bits until message length in bits &#8801; 448 (mod 512)
append bit /* bit, not byte */ length of unpadded message as 64-bit little-endian integer to message


non riesco ancora a capire come devo contare la sua lunghezza.
Riferisco tutto al numero di caratteri?
cioè se un carattere è 8bit cioè 1byte, e 512 sono esattamente 64byte, se io ho una stringa di 4 caratteri me ne basterebbe aggiungrne altri 60?
Se si, come li aggiungo: l'algoritmo prevede che il primo bit aggiunto sia 1, gli altri 0. Come faccio a sapere che caratteri aggiungere?
aaa