summaryrefslogtreecommitdiff
path: root/analyze.py
diff options
context:
space:
mode:
Diffstat (limited to 'analyze.py')
-rw-r--r--analyze.py44
1 files changed, 44 insertions, 0 deletions
diff --git a/analyze.py b/analyze.py
new file mode 100644
index 0000000..75d8686
--- /dev/null
+++ b/analyze.py
@@ -0,0 +1,44 @@
+import gmpy, numpy, scipy.misc, sys
+import matplotlib.pyplot as plot
+
+input_file = file(sys.argv[1])
+
+ideal_hash_diffusion = [int(scipy.misc.comb(160, n)) for n in range(0, 161)]
+hash_diffusion = [0] * 161
+ideal_deal_diffusion = [int(scipy.misc.comb(96, n)) for n in range(0, 97)]
+deal_diffusion = [0] * 97
+
+prev_seed = None
+prev_output = 0
+prev_deal = 0
+
+for line in input_file:
+ bits = line.split()
+ output = int(bits[1], 16)
+ seed = bits[0][8:48]
+ deal = output & 0xFFFFFFFFFFFFFFFFFFFFFFFF0000000000000000
+ if seed == prev_seed:
+ results = [output ^ prev_output, deal ^ prev_deal]
+ results += [gmpy.popcount(l) for l in results]
+ hash_diffusion[results[2]] += 1
+ deal_diffusion[results[3]] += 1
+ print '%040x %040x %3d %3d' % tuple(results)
+ prev_output = output
+ prev_deal = deal
+ prev_seed = seed
+
+ideal_hash_diffusion_normalized = [float(n)/sum(ideal_hash_diffusion) for n in ideal_hash_diffusion]
+hash_diffusion_normalized = [float(n)/sum(hash_diffusion) for n in hash_diffusion]
+ideal_deal_diffusion_normalized = [float(n)/sum(ideal_deal_diffusion) for n in ideal_deal_diffusion]
+deal_diffusion_normalized = [float(n)/sum(deal_diffusion) for n in deal_diffusion]
+
+figure = plot.figure(figsize=(20,20))
+hash_plot = figure.add_subplot(211, title='Full hash diffusion')
+hash_plot.plot(ideal_hash_diffusion_normalized)
+hash_plot.plot(hash_diffusion_normalized)
+hash_plot.legend(['Ideal', 'Actual'])
+deal_plot = figure.add_subplot(212, title='96-bit deal diffusion')
+deal_plot.plot(ideal_deal_diffusion_normalized)
+deal_plot.plot(deal_diffusion_normalized)
+deal_plot.legend(['Ideal', 'Actual'])
+figure.savefig(sys.argv[1] + '.png')