Cryptopals zestaw 3 ćwiczenie 20

przez | 19 września 2020

To ćwiczenie częściowo zostało już opisane w poprzednim wpisie. Wspomniałem już, że poprzednie zadanie początkowo rozwiązałem wykorzystując skrypt napisany na potrzeby zadania numer 6. Można to zrobić bo jak wiemy AES w trybie CTR generuje kolejne bloki, które są XORowane z wiadomością do zaszyfrowania.

Oczywiście poprawnie zastosowany AES w trybie CTR nie pozawala w tak banalny sposób odszyfrować sekretnej wiadomości, ponieważ każdy kolejny blok i każda kolejna wiadomość XORowana jest z blokiem o innych wartościach. Jeżeli każda nowa wiadomość jest szyfrowana z tą samą wartością NONCE, to mamy po prostu dłuższy ciąg z którym XORujemy kolejne wiadomości, ale to nadaj proste szyfrowanie poprzez XORowanie z nieznanym ciągiem bajtów.

To co moim zdaniem każdy powinien zapamiętać po rozwiązaniu tego i poprzedniego zadania to, że nie można używać wielokrotnie tej samej wartości NONCE.

Nie będę po raz kolejny opisywał tego kodu bo tak jak już kilkukrotnie wspomniałem jest to ponowne użycie skryptu z ćwiczenia numer 6.

def s3challenge20():
    print("Challenge 20")
    with open('testfiles/20.txt') as f:
        secret_data = f.readlines()
        secret_data = [secret[:-1] for secret in secret_data]
        print(secret_data)
        oracle = OracleCtrRepeatingNonce(secret_data)
        secrets = oracle.getSecrets()
        for secret in secrets:
            print([x for x in secret])
        secret_key = b''
        print(len(max(secrets, key=len)))
        for idx in range(0, len(max(secrets, key=len))):
            tmp = b''
            for secret in secrets:
                if (idx < len(secret)):
                    tmp = tmp + bytes([secret[idx]])
            print(idx, len(tmp), tmp)
            key_byte, key_score = find_best_key_bytes(tmp)
            print(key_byte, key_score)
            secret_key += bytearray([key_byte])
        for secret in secrets:
            print(bytearray(bytes_xor_key(secret, secret_key)[:len(secret)]))

Po uruchomieniu skryptu widać, że pewne znaki nie zostały prawidłowo rozszyfrowane, ale mając pozostałe wartości można w prosty sposób na podstawie kontekstu domyślić się prawidłowych wartości.

Cały kod jest dostępny tutaj: https://gitlab.com/akoltys/cryptopals .

Dodaj komentarz

Twój adres email nie zostanie opublikowany.