Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
jvdsn
GitHub Repository: jvdsn/crypto-attacks
Path: blob/master/attacks/ctr/separator_oracle.py
2589 views
1
def _find_separator_positions(separator_oracle, c):
2
separator_positions = []
3
c = bytearray(c)
4
for i in range(len(c)):
5
c[i] ^= 1
6
valid = separator_oracle(c)
7
c[i] ^= 1
8
if not valid:
9
c[i] ^= 2
10
valid = separator_oracle(c)
11
c[i] ^= 2
12
if not valid:
13
separator_positions.append(i)
14
15
return separator_positions
16
17
18
def attack(separator_oracle, separator_byte, c):
19
"""
20
Recovers the plaintext using the separator oracle attack.
21
:param separator_oracle: the separator oracle, returns True if the separators are correct, False otherwise
22
:param separator_byte: the separator which is used in the separator oracle
23
:param c: the ciphertext
24
:return: the plaintext
25
"""
26
separator_positions = _find_separator_positions(separator_oracle, c)
27
c = bytearray(c)
28
# Ensure that at least 1 separator is missing.
29
c[separator_positions[0]] ^= 1
30
p = bytearray(len(c))
31
for i in range(len(c)):
32
if i in separator_positions:
33
p[i] = separator_byte
34
else:
35
c_i = c[i]
36
# Try every byte until an additional separator is created.
37
for b in range(256):
38
c[i] = b
39
if separator_oracle(c):
40
p[i] = c_i ^ c[i] ^ separator_byte
41
break
42
43
c[i] = c_i
44
45
return p
46
47