3101 - XORCrypt

De la Universitas MediaWiki

Cerinţa

Se citește un text de maxim 256 caractere și o cheie de număr egal de caractere cu textul citit. După aplicarea Encripției XOR, caracterele rezultate se vor afișa în format binar deoarece în majoritatea cazurilor se obțin caractere neprintabile.

Encripția XOR presupune aplicarea operatorului pe biți XOR între text și cheie, între fiecare caracter din text și caracterul din cheie de pe aceeași poziție cu cel din text: text[i] XOR cheie[i]. Pentru decriptare, operatorul se aplică între cheie și textul criptat.

Date de intrare

Fișierul de intrare xorcryptin.txt conține:
  1. Pe prima linie un text format din maxim 256 caractere.
  2.Pe a doua linie cheia, de lungime egală cu textul.

Date de ieșire

Fișierul de ieșire xorcryptout.txt va conține o singură linie, având caracterele în format binar separate prin spațiu.

Restricţii şi precizări

  • Se va folosi alfabetul englez.

Exemplu 1

xorcryptin.txt
xor
key
xorcryptout.txt
Datele de intrare corespund restrictiilor impuse
00010011 00001010 00001011


Exemplu 2

xorcryptin.txt
xor10
key
xorcryptout.txt
Datele de intrare nu corespund restrictiilor impuse


Explicatie

x^k -> 00010011

o^e -> 00001010

r^y -> 00001011

Rezolvare

def xor_encrypt(text, key):
    # Aplică encripția XOR pe text cu cheia dată
    return ' '.join([format(ord(a) ^ ord(b), '08b') for a, b in zip(text, key)])


def main():
    with open('xorcryptin.txt', 'r') as fin, open('xorcryptout.txt', 'w') as fout:
        text = fin.readline().strip()
        key = fin.readline().strip()

        # Verifică dacă textul și cheia respectă restricțiile
        if len(text) > 256 or len(key) != len(text) or not all(c.isalpha() or c.isspace() for c in text):
            fout.write("Datele de intrare nu corespund restrictiilor impuse\n")
            return

        fout.write("Datele de intrare corespund restrictiilor impuse\n")

        # Aplică encripția XOR pe text cu cheia dată și scrie rezultatul în fișierul de ieșire
        fout.write(xor_encrypt(text, key) + '\n')


if __name__ == "__main__":
    main()