[Python] Incongruenze durante il processing
michele a nectarine.it
michele a nectarine.it
Gio 16 Ott 2008 22:13:55 CEST
Ciao,
ho scritto un encoder in python e in Java; fanno le stesse identiche
computazioni, e, se alimentati con lo stesso input, non forniscono lo
stesso output.
In allegato trovate sia il codice Java che quello python.
Per iniziare, vi serve un file di input:
$ dd if=/dev/urandom of=test.img bs=1048576 count=1
Come potete vedere il codice è molto corto, ma i due programmi fanno
esattamente la stessa cosa (la bitlist è uguale, quindi entrambi
selezionano gli stessi blocchi in input e ne fanno lo xor - potete
vedere che i blocchi selezionati corrispondono sempre perché ogni
volta che un blocco viene selezionato ne stampa l'hash).
Qui viene la parte di incongruenza: avendo gli stessi input, perché i
due programmi producono due output diversi? Potete vedere questo
dall'hash del blocco risultante (random_block) che viene stampato alla
fine del programma.
In Java ha un valore che è totalmente diverso da quello in python. Perché?
Operando sullo stesso input e facendo le stesse operazioni, dovrebbero
restituire lo stesso output.
Dove sbaglio?
Vi ringrazio
-------------- parte successiva --------------
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Test {
int N;
public byte[] create_random_block(byte[] piece)
throws NoSuchAlgorithmException, UnsupportedEncodingException {
N = piece.length / 16384;
byte[] random_block = new byte[16384];
int[] bitlist = { 1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0,
0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0,
1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1,
0, 1, 0, 1 };
for (int i = 0; i < N; i++) {
if (bitlist[i] == 1) {
byte[] block = new byte[16384];
for (int j = 0; j < block.length; j++) {
block[j] = piece[i * 16384 + j];
}
System.out.println(i * 16384 + "-" + (i * 16384 + 16384)
+ " " + AeSimpleSHA1.SHA1(block));
for (int j = 0; j < random_block.length; j++) {
random_block[j] = (byte) (random_block[j] ^ block[j]);
}
}
}
System.out.println(AeSimpleSHA1.SHA1(random_block));
return random_block;
}
public static void main(String[] args) throws IOException,
NoSuchAlgorithmException {
byte data[] = new byte[1024 * 1024];
FileInputStream fi = new FileInputStream("test.img");
fi.read(data);
Test x = new Test();
x.create_random_block(data);
System.exit(0);
}
public static class AeSimpleSHA1 {
private static String convertToHex(byte[] data) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < data.length; i++) {
int halfbyte = (data[i] >>> 4) & 0x0F;
int two_halfs = 0;
do {
if ((0 <= halfbyte) && (halfbyte <= 9))
buf.append((char) ('0' + halfbyte));
else
buf.append((char) ('a' + (halfbyte - 10)));
halfbyte = data[i] & 0x0F;
} while (two_halfs++ < 1);
}
return buf.toString();
}
public static String SHA1(byte[] text) throws NoSuchAlgorithmException,
UnsupportedEncodingException {
MessageDigest md;
md = MessageDigest.getInstance("SHA-1");
byte[] sha1hash = new byte[40];
md.update(text);
sha1hash = md.digest();
return convertToHex(sha1hash);
}
}
}
-------------- parte successiva --------------
import os
import sha
import sys
class EncoderDecoder(object):
def create_random_block(self,piece,blocksize=16384):
if len(piece) % blocksize != 0:
raise Exception('size error')
self.N = len(piece)/blocksize
random_block = ['0']*blocksize
bitlist = [1, 1, 1, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 1]
for i in range(len(bitlist)):
if bitlist[i] == 1:
block = piece[i*blocksize:i*blocksize+blocksize]
print '%d-%d %s' %(i*blocksize,i*blocksize+blocksize,sha.new(block).hexdigest())
for j in range(blocksize):
random_block[j] = chr(ord(random_block[j]) ^ ord(block[j]))
print sha.new(''.join(random_block)).hexdigest()
return ''.join(random_block)
if __name__ == '__main__':
data = open('test.img','rb').read()
x = EncoderDecoder()
x.create_random_block(data)
sys.exit(0)
Maggiori informazioni sulla lista
Python