Podczas pracy nad jednym z wyzwań NATAS z overthewire.com natrafiłem na algorytm szyfrowania XOR. Jest to algorytm klucza symetrycznego, co oznacza, że ten sam klucz jest używany zarówno do szyfrowania, jak i deszyfrowania.
Implementacja algorytmu szyfrowania XOR w Pythonie
Szyfrowanie XOR można zaimplementować jako kod poniżej
def xor_encryption(text, key):
encrypted = ""
for i in range(len(text)):
encrypted += chr(ord(text[i]) ^ ord(key[i % len(key)]))
return encrypted
Aby sprawdzić jak to działa, zdefiniujmy tekst, który będzie szyfrowany i klucz. Dodatkowo, aby sprawdzić długość tekstu i zaszyfrowanego tekstu, dodajmy funkcję print z długością ciągów.
text = "Text which will be encrypted"
key = "SECRET_KEY"
encrypted = xor_encryption(text, key)
print(f'Encrypted Text: {encrypted}')
print(f'Encrypted Text length: {len(encrypted)}')
print(f'Plain Text length: {len(text)}')
Zwróci:
Encrypted Text: ;&e#7"&1s2*>)t=.e<=&1+5 :/
Encrypted Text length: 28
Plain Text length: 28
Teraz jesteśmy pewni, że zaszyfrowany i zwykły tekst mają tę samą długość.
Dowód, że szyfrowanie XOR jest algorytmem klucza symetrycznego
Aby sprawdzić, że ten kod jest algorytmem klucza symetrycznego, zdekodujmy zaszyfrowany tekst tą samą funkcją
decrypted = xor_encryption(encrypted, key)
print(f'Decrypted Text: {decrypted}')
Zwróci:
Encrypted Text: Text which will be encrypted
Więc jesteśmy pewni, że algorytm XOR jest algorytmem klucza symetrycznego.
Znajdowanie klucza algorytmu XOR
Wyobraźmy sobie przypadek, że mamy zakodowane i zdekodowane teksty, ale nie mamy klucza. Jak go znaleźć? Użyjmy tej części kodu:
found_key = xor_encryption(encrypted, decrypted)
print(f'Key: {found_key}')
Jak widzimy, przekazujemy do naszej funkcji xor_encryption dwa argumenty: zaszyfrowany i odszyfrowany ciąg. W wyniku otrzymamy:
Key: SECRET_KEYSECRET_KEYSECRET_K
Jak widzimy, jest tam długi ciąg, ale z powtarzającą się częścią: SECRET_KEY, która jest kluczem.
Dodatkowo możemy zdefiniować funkcję, która pobierze ten klucz z tego długiego ciągu:
def find_repetitive_part(test_str):
n = len(test_str)
for i in range(1, n // 2 + 1):
part = test_str[:i]
repetitions = n // i
if part * repetitions == test_str[:i * repetitions]:
return part
return "No repetitive part found"
print(f'Key: {find_repetitive_part(found_key)}')
I zwróci:
Key: SECRET_KEY
Voila!
Szyfrowanie XOR ujawnione!
Teraz wiesz jak
-
Zdefiniować funkcję szyfrowania XOR w Pythonie
-
Szyfrować i deszyfrować
-
Znaleźć brakujący klucz






