53 lines
1.4 KiB
Python
53 lines
1.4 KiB
Python
#! /usr/bin/python3
|
|
import binascii
|
|
import os
|
|
import sha256
|
|
|
|
# Setup msg_secret and flag
|
|
FLAG_PATH = 'data/flag.txt'
|
|
NUM_KEYS = 8
|
|
MSG = b'Encoded with random keys'
|
|
|
|
with open(FLAG_PATH, 'rb') as f:
|
|
FLAG = f.read().strip().decode('utf-8')
|
|
|
|
|
|
def sha256_with_secret_round_keys(m: bytes, secret_round_keys: dict) -> bytes:
|
|
"""Computes SHA256 with some secret round keys.
|
|
|
|
Args:
|
|
m: the message to hash
|
|
secret_round_keys: a dictionary where secret_round_keys[i] is the value of
|
|
the round key k[i] used in SHA-256
|
|
|
|
Returns:
|
|
the digest
|
|
"""
|
|
sha = sha256.SHA256()
|
|
round_keys = sha.k[:]
|
|
for i, v in secret_round_keys.items():
|
|
round_keys[i] = v
|
|
return sha.sha256(m, round_keys)
|
|
|
|
|
|
def generate_random_round_keys(cnt: int):
|
|
res = {}
|
|
for i in range(cnt):
|
|
rk = 0
|
|
for b in os.urandom(4):
|
|
rk = rk * 256 + b
|
|
res[i] = rk
|
|
return res
|
|
|
|
if __name__ == '__main__':
|
|
secret_round_keys = generate_random_round_keys(NUM_KEYS)
|
|
digest = sha256_with_secret_round_keys(MSG, secret_round_keys)
|
|
print('MSG Digest: {}'.format(binascii.hexlify(digest).decode()))
|
|
GIVEN_KEYS = list(map(lambda s: int(s, 16), input('Enter keys: ').split(',')))
|
|
assert len(GIVEN_KEYS) == NUM_KEYS, 'Wrong number of keys provided.'
|
|
|
|
if all([GIVEN_KEYS[i] == secret_round_keys[i] for i in range(NUM_KEYS)]):
|
|
print('\nGood job, here\'s a flag: {0}'.format(FLAG))
|
|
else:
|
|
print('\nSorry, that\'s not right.')
|