Криптография в С++

Николай "GоrluM" Андреев

Xakep, номер #051, стр. 051-082-1

(gorlum@xakep.ru)

В последнее время единственным способом защиты информации стала криптография. Все шифруется: windows и unix защищают свои пароли, любой интернет-магазин - номера кредитных карточек, а ты наверняка пользовался услугами PGP. В этой статье я расскажу о том, какие бывают шифры, как они работают, и как их можно реализовать в своих программах. На примере шифрующей файл программы ты убедишься, что С++ больше чем другие языки подходит для криптографии.

Важные письма шифровались еще во времена Цезаря. Шифры были несложные, и в наши дни даже ребенок справился бы с ними за пару минут. Например, в Древнем Риме шифром служил алфавит со сдвигом на три буквы (D вместо A и т.д.). К счастью, криптоалгоритм Цезаря сейчас никем не используется :). Теперь создана куча других, очень и очень сложных шифров, и нам предстоит не только разобраться в принципах их работы, но и реализовать один алгоритм в собственной программе.

Асимметричные и симметричные шифры

Представь себе криптоалгоритм, с помощью которого ты шифруешь что-либо одним ключом, а расшифровываешь уже совсем другим. Такой шифр называется асимметричным. Ключ, которым шифруют, называют открытым ключом (public key). Почему его так называют? Потому что он раздается всем. Но даже имея открытый ключ, ты все равно не сможешь расшифровать информацию за разумное время, не имея второго ключа. Открытый ключ можно спокойно выкладывать у себя на домашней страничке и просить посылать тебе письма, зашифрованные им. Второй же ключ называется закрытым (private key). Именно с его помощью ты сможешь получить информацию, зашифрованную первым ключом. Типичный пример асимметричного шифра - это RSA, используемый в PGP. Основной задачей таких шифров является защита передаваемой информации.

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

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

Пишем шифровщик

Наша программа будет реализовывать, наверное, один из самых простых, но в то же время очень популярных алгоритмов шифрования - XOR (на самом деле шифрованием это назвать трудно, но некоторые кодеры любят использовать этот метод, хотя в серьезных продуктах такое вряд ли когда-нибудь встретится - прим. ред.). Название его говорит само за себя, XOR - это логический оператор "поразрядное исключающее ИЛИ". Именно с его помощью мы будем шифровать каждый символ файла с ключом - другим символом.

Содержание  Вперед на стр. 051-082-2

ttfb: 3.2491683959961 ms