Решение ksydfius - The XOR Algorithm :)

Сложность: 1 - Very easy, for newbies
Платформа: Windows
Язык: Assembler
Дано: The XOR Algorithm :)

Задача по криптоанализу

Небольшой обзор.

У Вас есть:
- открытый текст - один
- соответствующий шифротекст - один
- алгоритм, которому нужен ключ - один
Ваша цель:
- Текст был зашифрован с помощью ключа
- Надо извлечь ключ, который шифрует открытый текст в зашифрованный текст
- Если Вы сделали все правильно, то программа расшифрует goodboy-сообщение и скажет Вам ответ :)
Удачи!
-ksydfius

Решение (автор whizz, bearchik, Reaper91)
опубликовано 19.09.2012

Задачка простая. Поэтому дальнейший текст представлен в телеграфном стиле.
Название crackme говорящее – «XOR алгоритм». Действительно, вокруг операции XOR все и крутится. У нас в наличии есть открытый текст (plaintext) по адресу 00403000, шифротекст (ciphertext) по адресу 004030F1. Понятно, что используемый метод шифрования связан с операцией XOR. И все, что нам нужно – найти ключ, с помощью которого преобразуем открытый текст в зашифрованный.
Логика crackme:

  1. Ждем от пользователя ввода ключа
  2. Шифруем открытый текст.
  3. Сравниваем полученный шифротекст с заданным в программе. Если шифротексты совпадают, то, используя тот же ключ, расшифровываем и показываем goodboy-сообщение.

Алгоритм шифрования (функция 00401041):

image00.jpg

Код на Рython:

# -*- coding: cp1251 -*-
def findkey(ciphertext, plaintext):
    key = [0]*32
    dl = 0
    for i in range(len(plaintext)):
        key[dl] = ord(plaintext[i]) ^ (ciphertext[i] - dl)
        dl = ciphertext[i] % 32
    return key
 
# pt - plaintext - открытый текст
pt = "We go about our daily lives understanding almost nothing of the world. \
Few of us spend much time wondering why nature is the way it is; where the \
cosmos came from;... why we remember the past and not the future; and why \
there is a universe."
 
# ct - ciphertext - шифротекст
ct = [
0x03, 0x50, 0x51, 0x14, 0x1C, 0x31, 0x16, 0x19, 0x76, 0x2A, 0x40, 0x74, 0x1C, 0x5C, 0x63, 0x0B,
0x30, 0x10, 0x18, 0x75, 0x1E, 0x99, 0x77, 0x32, 0x21, 0x14, 0x28, 0x6E, 0x11, 0x1B, 0x1D, 0x2E,
0x12, 0x1C, 0x5D, 0x32, 0x29, 0x35, 0x2E, 0x26, 0xC, 0x70, 0x10, 0x1D, 0x36, 0x24, 0x37, 0x1D,
0x71, 0x1B, 0x24, 0x38, 0x71, 0x1E, 0x53, 0x14, 0x5B, 0x24, 0x2A, 0x6C, 0x3C, 0x79, 0x70, 0x51,
0x24, 0x33, 0x27, 0x5E, 0x5D, 0x77, 0x69, 0x17, 0x2E, 0xF, 0x57, 0x34, 0x15, 0x65, 0x64, 0x37,
0x69, 0x44, 0x34, 0x16, 0x25, 0x53, 0x59, 0x78, 0x5C, 0x72, 0x23, 0x0B, 0x40, 0x3D, 0x36, 0x1A,
0x7B, 0x2C, 0x37, 0x33, 0x15, 0x2A, 0x3A, 0x42, 0x58, 0x6E, 0x64, 0x3B, 0x29, 0x3A, 0x7B, 0x23,
0x4C, 0x3C, 0x5C, 0x63, 0x50, 0x51, 0x1E, 0x46, 0x47, 0x56, 0x1F, 0x23, 0xB, 0x41, 0x18, 0x60,
0x74, 0x22, 0x4E, 0x64, 0x2D, 0x47, 0x07, 0x22, 0x51, 0x1D, 0x2E, 0x12, 0x2E, 0x64, 0x38, 0x71,
0x12, 0x6B, 0x2D, 0x33, 0x28, 0x33, 0x1C, 0x62, 0x1A, 0x3C, 0x70, 0x1C, 0x6C, 0x70, 0x17, 0x17,
0x34, 0x1E, 0x7E, 0x93, 0x5B, 0x63, 0x0B, 0x41, 0x1F, 0x37, 0x69, 0x48, 0x2B, 0x6C, 0x42, 0x5F,
0x2B, 0x2F, 0x14, 0x19, 0x70, 0x23, 0x0B, 0x40, 0x3C, 0x6C, 0x70, 0x21, 0x18, 0x5A, 0x4F, 0x57,
0x2A, 0x36, 0x1B, 0x61, 0x19, 0x76, 0x2B, 0x6C, 0x3C, 0x79, 0x70, 0x51, 0x13, 0x26, 0x1B, 0x2E,
0x12, 0x2E, 0x5B, 0x61, 0x18, 0x77, 0x2D, 0x76, 0x2C, 0x38, 0x60, 0x74, 0x27, 0x5A, 0x3E, 0x47,
0x65, 0x0F, 0x10, 0x22, 0x1A, 0x3A, 0x7B, 0x2E, 0x26, 0x0E, 0x0E, 0x21, 0x5, 0x5E, 0x5C, 0x37
]
 
# Ищем ключ
key = []
key = findkey(ct, pt)
# Переводим байты в символы
szkey = "".join([chr(c) for c in key])
 
print("Key = "+szkey)


Key = Tv8(@*a;FHBADIvhadyfgpar12Af5t[a
Запускаем программу, вводим ключ, наблюдаем результат:

image01.jpg
Пока не указано иное, содержимое этой страницы распространяется по лицензии Creative Commons Attribution-ShareAlike 3.0 License