-
Notifications
You must be signed in to change notification settings - Fork 0
/
break1round.py
72 lines (60 loc) · 1.81 KB
/
break1round.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!usr/bin/python
import pyDES
import random
import constants
from bitarray import bitarray
def generateRandomData():
data = ""
for i in range(0,64):
data += str(random.randrange(0,2))
return bitarray(data)
def inversePerm(perm):
output = []
size = len(perm)
for i in range(0, size):
output.append(perm.index(i + 1) + 1)
return output
def mapSBoxInverse(output, sBoxNumber):
result = []
output = output[sBoxNumber * 4 : (sBoxNumber + 1) * 4]
out = int(output.to01(), 2)
sBox = constants.sBoxes[sBoxNumber]
i = 0
for item in sBox:
j = 0
for a in item:
if out == a:
row = format(i, 'b').zfill(2)
column = format(j, 'b').zfill(4)
result.append(bitarray(row[0] + column + row[1]))
j += 1
i += 1
return result
PInverse = inversePerm(constants.perm)
def getKeySet(input, output, sBoxNumber):
POutput = output[32:64] ^ input[0:32]
SOutput = pyDES.shuffle(POutput, PInverse, "Binary")
XOROutput = mapSBoxInverse(SOutput, sBoxNumber)
ExpandOutput = pyDES.expand(input[32:64])
outsBox = ExpandOutput[sBoxNumber * 6 : (sBoxNumber + 1) * 6]
keyset = set()
for i in range(0,4):
keyset.add((outsBox ^ XOROutput[i]).to01())
return keyset
keys = []
for i in range(0,8):
print "sBox %d keysets:" % (i + 1)
s = set()
while len(s) != 1:
inp = generateRandomData()
out = pyDES.encrypt(inp, 1)
keyset = getKeySet(inp, out, i)
print keyset
if len(s) == 0:
s = keyset
else:
s.intersection_update(keyset)
print "intersection: %s \n" % str(s)
keys.append(s.pop())
print "original key: %s " % pyDES.keys[0].to01()
print "found key : %s " % ''.join(i for i in keys)