Implementacja szyfru XOR: Szyfrowanie w Pythonie

By Piotr Sikora

  • cryptography

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

Categories

Recent Posts

About Me

Piotr Sikora - Process Automation | AI | n8n | Python | JavaScript

Piotr Sikora

Process Automation Specialist

I implement automation that saves time and money, streamlines operations, and increases the predictability of results. Specializing in process automation, AI implementation, and workflow optimization using n8n, Python, and JavaScript.

n8n Workflows

n8n workflow automation templates

Explore my workflow templates on n8n. Ready-to-use automations for blog management, data collection, and AI-powered content processing.

3Workflow Templates

• Auto-Categorize Blog Posts with AI

• Collect LinkedIn Profiles

• Export WordPress Posts for SEO

Podobne artykuły

Odkryj więcej powiązanych treści

Nadpisywanie funkcji print w Pythonie

Nadpisywanie funkcji print w Pythonie

Czy wiedziałeś, że możesz łatwo nadpisać funkcję print używając `FunctType`? Oto prosty przykład jak to zrobić.