Level 4: Detect single-character XOR

Task

One of the 60-character strings in this file has been encrypted by single-character XOR.

Find it.

(Your code from #3 should help.)


Explanation

What is a Single-Byte XOR cipher?

In this challenge, we are given a file containing multiple 60-character hexadecimal strings. One of these strings has been encrypted using a single-character XOR cipher.

Our goal is to identify which string is encrypted and then decrypt it.

To solve this, we can reuse and slightly modify the code from the previous challenge (#3), where we built a function to decrypt a single-byte XOR cipher. However, instead of applying the function to just one string, we need to loop through all the strings in the file.


Resolution

First, we are going to create a file named task4.py

Understanding the code

  • This script has slight modifications compared to the previous one.

    • with open("4.txt") as file, this line opens the file named 4.txt in read mode. Using with ensures the file is properly closed after reading, even if an error occurs.

      • lines is the result of file.read().strip().split("\n")

        • file.read() reads the entire content of the file into a string.

        • .strip() removes any leading or trailing whitespace, including newline characters.

        • .split("\n") breaks the string into a list of lines, where each line corresponds to one encrypted hexadecimal string from the file.

    • for line in lines is a loop that iterates through each encrypted string in the lines variable.

      • decoded_text and key are initialized with the result of single_byte_xor(line), which returns the best decrypted text and the key used for it.

      • score holds the English score of the decoded_text , calculated by english_score() function

      • if score > best_overall_score, is the conditional that updates the following variables when the current score is better than the highest found so far

        • best_overall_score holds the highest score found.

        • best_overall_text contains the best decrypted plaintext.

        • best_overall_key stores the key that generated the best plaintext.

        • best_line keeps track of the line where the best decryption ocurred.


Result

Last updated