Шифрование

В криптографии шифрование означает кодировку данных (при помощи ключей), основанную на особом алгоритме. Такие закодированные данные могут быть расшифрованы в случае необходимости восстановления оригинальной информации. Такой процесс называется дешифровка. Одна из основных задач криптографии – гарантия безопасного обмена данными двумя людьми через незащищенный канал связи. Незащищенный канал – вид общения, к которому могут получить доступ другие лица, например, Интернет. Кодировка гарантирует, что третьи лица не смогут прочесть информацию, что обычно достигается при помощи использования ключей. То, из чего состоит такой ключ, зависит от алгоритма, однако, обычно это достаточно большое число, состоящее из нескольких десятков десятичных чисел. Их задача – гарантировать, что только данное лицо(лица) владеет(ют) верными ключами, которые могут расшифровать данные. Большинство криптографических алгоритмов позволяет декодировать зашифрованные данные, не имея доступа к правильным ключам, но процесс дешифровки практически невозможно осуществить таким образом по причине большой последовательности вычислений, заложенных в него. Декодирование данных без верного ключа может занять миллиарды лет даже на самых современных компьютерах. Компьютер пытается взломать ключ, проверяя все возможные ключи до тех пор, пока не установит, что ни один из них не работает. Если ключ представляет собой достаточно большое число, даже самые продвинутые компьютеры не смогут проверить все числа в короткий срок. Сейчас компьютеры работают гораздо быстрее, а это означает, что при выборе варианта для ключа необходимы большие числа. В общих чертах, существует два вида криптографии: симметричный и асимметричный.

Симметричная криптография

В симметричной криптографии отправитель и получатель использует один и тот же ключ. Ключ передается заранее по безопасному каналу (такому, который позволяет проверить личность обоих и делает невозможным доступ третьих лиц с целью получения ключа). Использование одного и того же ключа не всегда означает, что кодирование и декодирование являются идентичными процессами. Если используется Ключ Rot13, который характерен для электронных писем, процесс происходит именно таким образом. Если кто-то декодирует зашифрованное сообщение при помощи ROT13, он увидит оригинальное сообщение. При помощи кодов A→B, B→C и т.д., которые являются примером другого процесса, ключ для декодирования можно легко вычислить, взглянув на ключ кодирования. Оба варианта – примеры симметричной криптографии.

Асимметричная криптография

Более современный вид криптографии – асимметричное множество, именуемое также шифрование открытым ключом. У отправителя и получателя есть набор из двух ключей, один из которых открытый, а другой нет. Теоретически возможно вычислить секретный ключ из открытого, но практически это невозможно. Сообщения, закодированные при помощи открытого ключа, можно декодировать только при помощи секретного закрытого ключа. Другими словами, третьи лица не смогут прочитать сообщения. Есть другой вариант развития событий: информацию, закодированную при помощи чьего-то закрытого ключа, можно расшифровать только при помощи соответствующего открытого ключа. Последний используется в случае наличия цифровой подписи в сообщениях: необходимо убедиться в том, что сообщение отправлено конкретным отправителем. Открытый ключ можно делать общедоступным, а потому его легко можно сообщать через незащищенный канал, например, через Интернет. Для кодировки сообщений и оставления в них цифровой подписи отправителю необходим собственный закрытый ключ и закрытый ключ получателя. Для декодирования полученного сообщения и подтверждения того, что подпись действительно является подписью фактического отправителя, получателю необходим собственный закрытый ключ и закрытый ключ отправителя. Значительным преимуществом асимметричной криптографии является то, что обмен ключами может осуществляться через незащищенный канал. Перехват передаваемой информации, в том числе закрытых ключей, так же не представляет проблем. Существует определенный риск, если отправитель и получатель не проводят процедуру проверки того, действительно ли закрытый ключ сопоставим с другим ключом, потому как тогда третьи лица могут притвориться одной из участвующих сторон. Любой может заявить, что он «такой-то человек» и сказать «вот мой закрытый ключ, отправьте мне, пожалуйста, Вашу информацию». Отправителю и получателю необходимо подтвердить личность друг друга и открытые ключи, используя защищенный канал. Недостаток асимметричной криптографии заключается в том, что необходимы ключи, состоящие из больших чисел (например, из 4096 битов), что говорит о том, что для кодирования и декодирования требуется вычисление больших сумм. В таких случаях обязателен компьютер. Такие ключи должны состоять из больших чисел, потому что в противном случае сверх усовершенствованный компьютер сможет их расшифровать. Часто используется сочетание асимметричной и симметричной криптографии: сначала отправитель и получатель сообщают друг другу закрытый ключ, как в асимметричной криптографии, создавая основу быстрой симметричной криптографии большого объема данных. Для кодировки электронных писем используется асимметричная криптография при помощи PGP, GPG или S/MIME.

Хеширование

Строго говоря, криптографическое хеширование не является видом кодирования, так как оригинальные данные нельзя восстановить при помощи хеш-кода. Однако, оно использует ту же технологию, что и кодирование, и является частью протоколов шифрования. Разница между хеширование и кодированием заключается в том, что хеширование может использоваться только в одну сторону, а кодирование работает в две стороны (кодирование и декодирование). В хешировании для расчета хеш-кода из массы данных используется хеш-алгоритм. Из подобного хеш-кода невозможно извлечь оригинальные данные, но тот, кто владеет такой информацией, может использовать ее для расчета ее хеш-кода и проверки того, соответствует ли она предыдущей версии хеш-кода. По той причине, что такой хеш-код часто оказывается меньше, чем оригинальный объем данных, можно проверить, просматривался ли конкретный документ ранее без необходимости сохранять весь документ. Кроме того, можно доказать то, что кто-то имеет конкретный документ, публикуя в открытом доступе его хеш-код, не выкладывая сам документ в общем доступе. Если в какой-то момент человек решит опубликовать его, каждый сможет проверить то, что лицо, опубликовавшее хеш-код, и владело документом, потому что не будет другой возможности рассчитать тот же хеш-код. Для того, чтобы хеш-код был безопасным, необходимо обеспечить невозможность восстановления оригинального объема данных, которые привели к созданию данного кода. Кроме того, необходимо следить за тем, чтобы два различных объема данных не имели один и тот же хеш-код. Это означает, что хеш-коду необходимы те же характеристики, как и цифровому отпечатку пальца.

Хеширование паролей

Для того, чтобы войти в компьютер, часто необходимо иметь имя и пароль. Такие пароли часто хранят закодированными, чтобы они не стали известны, если файл с паролем попадет в руки третьего лица. Данный процесс осуществляется при помощи хеш-алгоритма, а потому становится невозможно декодировать данные. Кроме того, в этом нет необходимости, потому что достаточно проверить, ввел ли пользователь верный пароль. В паролях небезопасно использовать простые хеш-алгоритмы. В паролях необходимо использовать особые хеш-алгоритмы, такие как bcrypt, scrypt или PBKDF. Причина в том, что регулярные хеш-алгоритмы предназначены для максимально быстрого расчета. Но при хешировании паролей их использование нежелательно по той причине, что тот, кто владеет кодами, может выяснить, какой из них относится к какому паролю. Длина и сложность используемых паролей ограничена, а компьютеры становятся все более совершенными. Это означает, что тому, кто пытается взломать хеш-коды для паролей, становится все легче и легче, так как просто необходимо иметь компьютер с различными возможностями. Хеш-алгоритмы для паролей блокируют данный метод, потому как чтобы выбрать их, можно выбрать, сколько времени займет их расчет. Алгоритмы устроены таким образом, что их расчет занимает одну миллисекунду, а расчет хеш-кода при помощи регулярного алгоритма может занять менее микросекунды. Нам обычно не так важно, что проверка пароля занимает миллисекунду, а не микросекунду, но для тех, кто пытается взломать хеш-код, возникает необходимость делать в тысячу раз больше расчетов, что, несомненно, означает большие временные затраты.