Wątek przeniesiony 2017-03-15 09:06 z C/C++ przez kq.

Łamanie hasła

0

Proszę o jakąkolwiek pomoc w zadaniu, ponieważ zupełnie nie wiem jak się za to zabrać.
Treść zadania:
https://www.hackerrank.com/contests/projecteuler/challenges/euler059

3

Przecież masz podane że masz tu xor z 3 bajtowym kluczem. Napisz bruta na 3 pętle for, xoruj cały input z kluczem tak wygenerowanym a potem testuj czy wszystkie wynikowe znaki są printable i w tym podanym przez nich charsecie, jeśli tak to pewnie znalazłeś poprawny klucz.

import string


def xor(t1, t2):
    return [x[0] ^ x[1] for x in zip(t1, t2)]


def xor_string(t1, t2):
    t1 = map(ord, t1)
    t2 = map(ord, t2)
    return "".join([chr(c) for c in xor(t1, t2)])


def is_proper_string(s):
    for c in s:
        if c not in (string.ascii_letters + string.digits + "()" + ";:,.'?-! "):
            return False
    return True


def main():
    input_data = "32 66 50 20 11 0 42 66 33 19 13 20 47 66 37 14 58 67 43 23 14 17 49 67 46 20 6 51 66 55 9 39 67 45 3 25 56 66 39 14 37 34 65 51 22 8 1 40 65 32 17 14 21 45 65 36 12 57 66 41 20 15 19 50 66 44 23 7 49 65 54 11 36 66 47 0 24 58 65 38 12 38"
    data = "".join([chr(int(c)) for c in input_data.split(" ")])
    for a in string.ascii_lowercase:
        for b in string.ascii_lowercase:
            for c in string.ascii_lowercase:
                key = a + b + c
                expanded_key = key * (len(input_data) // 3 + 2)
                result = xor_string(data, expanded_key)
                if is_proper_string(result):
                    print("Key = " + key)
                    print("Decrypted = " + result)


main()

Co dla przykładu z zadania daje

Key = abc
Decrypted = A QuicK BrowN FoX JumpS OveR ThE LazY DoGA QuicK BrowN FoX JumpS OveR ThE LazY DoG
1

plain text must contain common English characters (a-z, A-Z, 0 - 9), brackets (), common symbols (;:,.'?-!) and spaces
Note It is guaranteed that key is unique, is of size 3 and contains lower case english characters (a-z).

Tak jak napisał @Shalom, nie ma żadnej filozofii, takie rzeczy się bruteforce'uje. Plaintext jest mniejszy niż ASCII a kombinacji klucza masz maksymalnie 26x26x26. Co jest na tyle małą wartością, że mógłbyś wygenerować tablice ze wszystkimi kombinacjami klucza w czasie kompilacji.

1 użytkowników online, w tym zalogowanych: 0, gości: 1