Эта наука используется в подавляющем большинстве заданий явно или не явно. С помощью криптографии шифруются файлы, передаваемые по сети данные, работающие в системе процессы и так далее. Криптография представляет собой жуткий симбиоз высшей математики и информатики и является очень сложным направлением, для знания которого надо перелопатить не одну гору книг. Тем не менее мы постараемся познакомиться с ней поближе.
Не вижу смысла в том, чтобы пересказывать учебники по криптографии и криптоанализу тем, кто читает эту статью. Если вы решите изучать эту категорию, то сами справитесь с задачей поиска литературы и полезных источников - к счастью их достаточно. Вместо этого, я расскажу о наиболее часто встречающихся алгоритмах и простейших способах их криптоанализа. Все примеры из статьи требуют наличия библиотеки PyCrypto. Но сначала чуть чуть терминологии.
Широко распространенный алгоритм. Преобразует любой длины входное сообщение в хеш - шифротекст, преобразование которого в исходное сообщение не возможно. Хеш содержит 128 бит (16 байт) и обычно представляется как последовательность из 32 шестнадцатеричных цифр. Этот алгоритм применяют для создания контрольных сумм файлов и других данных, с целью проверки их подлинности или идентичности другим файлам. В CTF md5 часто используется в качестве флага.
Пример использования:
Симметричный блочный алгоритм шифрования. Используется в государственных структурах Америки, что говорит о сравнительной надежности. Применяется в основном для шифрования файлов или данных. Так как алгоритм блочный, то возникает проблема: одинаковые блоки исходного текста дадут одинаковые блоки шифротекста. Чтобы избавиться от этого недостатка, при шифровании указывают параметры, при которых каждый следующий блок так или иначе зависит от предыдущих.
Алгоритм шифрования, который используется для создания цифровых подписей и
шифрования данных. В работе используются открытый ключ (e, n) и закрытый ключ (d, n).
Открытый ключ назван так потому, что его обычно передают на ту сторону, которая будет зашифровывать и отправлять сообщения. Закрытый ключ нельзя никому сообщать, потому что с его помощью можно расшифровать принятое сообщение.
Очень важный и часто используемый алгоритм. Любая входная последовательность байт
шифруется в строку, которая состоит только из символов латинского алфавита и цифр. Таким образом можно передавать любые непечатаемые символы (в частности файлы, строки с непечатаемыми байтами, картинки и URL адреса). Шифротекст можно опознать по конечным символам "=", но их может и не быть.
Ещё одна функция получения хеша. Весьма похожа на md5 и применяется параллельно с ним.
Используется для создания контрольных сумм и уникальных идентификаторов. Также применяется в интернете для хеширования данных запросов и cookies.
Не вижу смысла в том, чтобы пересказывать учебники по криптографии и криптоанализу тем, кто читает эту статью. Если вы решите изучать эту категорию, то сами справитесь с задачей поиска литературы и полезных источников - к счастью их достаточно. Вместо этого, я расскажу о наиболее часто встречающихся алгоритмах и простейших способах их криптоанализа. Все примеры из статьи требуют наличия библиотеки 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 |
Пример использования:
########################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 |
Используется для создания контрольных сумм и уникальных идентификаторов. Также применяется в интернете для хеширования данных запросов и cookies.
Пример использования:
#########################SHA1#############################
from Crypto.Hash import SHA
ciphertext = SHA.new(text).hexdigest()
print text
print ciphertext
##########################################################