13 декабря 2014

Инфобез. Введение в криптографию

Эта наука используется в подавляющем большинстве заданий явно или не явно. С помощью криптографии шифруются файлы, передаваемые по сети данные, работающие в системе процессы и так далее. Криптография представляет собой жуткий симбиоз высшей математики и информатики и является очень сложным направлением, для знания которого надо перелопатить не одну гору книг. Тем не менее мы постараемся познакомиться с ней поближе.

Не вижу смысла в том, чтобы пересказывать учебники по криптографии и криптоанализу тем, кто читает эту статью. Если вы решите изучать эту категорию, то сами справитесь с задачей поиска литературы и полезных источников - к счастью их достаточно. Вместо этого, я расскажу о наиболее часто встречающихся алгоритмах и простейших способах их криптоанализа. Все примеры из статьи требуют наличия библиотеки PyCrypto. Но сначала чуть чуть терминологии.

Криптоло́гия — наука, занимающаяся методами шифрования и дешифрования. Криптология состоит из двух частей криптографии и криптоанализа. Криптография занимается разработкой методов шифрования данных, в то время как криптоанализ занимается оценкой сильных и слабых сторон методов шифрования, а также разработкой методов, позволяющих взламывать криптосистемы.
Криптогра́фия — наука о методах обеспечения конфиденциальности (невозможности прочтения информации посторонним) и аутентичности (целостности и подлинности авторства, а также невозможности отказа от авторства) информации.
Криптоанализ — наука о методах расшифровки зашифрованной информации без предназначенного для такой расшифровки ключа. Термин был введён американским криптографом Уильямом Ф. Фридманом в 1920 году. Неформально криптоанализ называют также взломом шифра. В большинстве случаев под криптоанализом понимается выяснение ключа; криптоанализ включает также методы выявлени я уязвимости криптографических алгоритмов или протоколов.

XOR

XOR

Простой но эффективный алгоритм, построенный на операции логического исключающего ИЛИ, в англоязычной терминологии XOR. Справа представлена таблица истинности, которая указывает, что операция дает 0 для одинаковых битов и 1 для разных. XOR является симметричным алгоритмом шифрования, а это значит, что не требуется иметь отдельные функции для шифрования и расшифровки. Применив ключ на шифротекст мы на выходе получим открытый текст. 

Пример использования:
########################XOR###############################
#[30, 14, 11, 13, 08, 54, 0A, 0F, 02, 11, 45, 0C, 1C, 45, 
# 12, 00, 08, 19, 1D, 12, 43, 1D, 10, 1E, 03, 45, 11, 10, 
# 45, 41]
##########################################################
from Crypto.Cipher import XOR
text = "Hello Crypto!"
xor_key = "secret"
ciphertext = XOR.new(xor_key).encrypt(text)
decrypted = XOR.new(xor_key).decrypt(ciphertext)

print text, xor_key,
print repr(ciphertext)
print decrypted
##########################################################

MD5


MD5
Широко распространенный алгоритм. Преобразует любой длины входное сообщение в хеш - шифротекст, преобразование которого в исходное сообщение не возможно. Хеш содержит 128 бит (16 байт) и обычно представляется как последовательность из 32 шестнадцатеричных цифр. Этот алгоритм применяют для создания контрольных сумм файлов и других данных, с целью проверки их подлинности или идентичности другим файлам. В CTF md5 часто используется в качестве флага.

Пример использования:
########################MD5###############################
from Crypto.Hash import MD5
ciphertext = MD5.new(text).hexdigest()
print text
print ciphertext
##########################################################

AES

AES
Симметричный блочный алгоритм шифрования. Используется в государственных структурах Америки, что говорит о сравнительной надежности. Применяется в основном для шифрования файлов или данных. Так как алгоритм блочный, то возникает проблема: одинаковые блоки исходного текста дадут одинаковые блоки шифротекста. Чтобы избавиться от этого недостатка, при шифровании указывают параметры, при которых каждый следующий блок так или иначе зависит от предыдущих.

Пример использования:
########################AES###############################
from Crypto.Cipher import AES
#Ключ, вектор и текст для шифрования должны быть кратны 16 байтам
aes_key = '16 byte long key'
vector = "*"*16
cryptor_AES = AES.new(aes_key, AES.MODE_CBC, vector)
ciphertext = cryptor_AES.encrypt(text*16)
decryptor_AES = AES.new(aes_key, AES.MODE_CBC, vector)
decrypted = decryptor_AES.decrypt(ciphertext)
print text, aes_key, vector
print ciphertext
print decrypted
##########################################################

RSA

RSA
Алгоритм шифрования, который используется для создания цифровых подписей и
шифрования данных. В работе используются открытый ключ (e, n) и закрытый ключ (d, n).
Открытый ключ назван так потому, что его обычно передают на ту сторону, которая будет зашифровывать и отправлять сообщения. Закрытый ключ нельзя никому сообщать, потому что с его помощью можно расшифровать принятое сообщение.

Пример использования:
########################RSA###############################
from Crypto.PublicKey import RSA
from Crypto import Random
random_generator = Random.new().read
key = RSA.generate(1024, random_generator)

public_key = key.publickey()
ciphertext = public_key.encrypt(text, 32)
decrypted = key.decrypt(ciphertext)
print text
print ciphertext
print decrypted
##########################################################

BASE64

BASE64
Очень важный и часто используемый алгоритм. Любая входная последовательность байт
шифруется в строку, которая состоит только из символов латинского алфавита и цифр. Таким образом можно передавать любые непечатаемые символы (в частности файлы, строки с непечатаемыми байтами, картинки и URL адреса). Шифротекст можно опознать по конечным символам "=", но их может и не быть.

Пример использования:
########################BASE64############################
import base64
ciphertext = base64.b64encode(text)
decrypted = base64.b64encode(ciphertext)
print text
print ciphertext
print decrypted
##########################################################

SHA-1

SHA1
Ещё одна функция получения хеша. Весьма похожа на md5 и применяется параллельно с ним.
Используется для создания контрольных сумм и уникальных идентификаторов. Также применяется в интернете для хеширования данных запросов и cookies.

Пример использования:
#########################SHA1#############################
from Crypto.Hash import SHA
ciphertext = SHA.new(text).hexdigest()
print text
print ciphertext
##########################################################