|
Криптография в С++ Николай "GоrluM" Андреев Xakep, номер #051, стр. 051-082-3 Шифруем Если есть указатель на массив символов файла и его размер, мы можем приступить к шифрованию. Для этого очень удобно сделать специальную функцию, в параметрах которой мы будем передавать: 1) Указатель на шифруемую строку 2) Длину этой строки 3) Указатель на ключ 4) Длину ключа Мощь синтаксиса языка С++ позволяет записать ВСЮ функцию шифрования массива символов ксором с ключом заданной тобой длины в ОДНУ СТРОКУ, не считая объявления функции. Вот как это будет выглядеть: for(int i = 0,t = 0; i < szin; in[i++] ^= key[t++]) if(t >= szkey) t = 0; Цикл for, ты, конечно, узнал, а вот назначение таких хитрых выражений я сейчас объясню. Легче всего это сделать, приведя аналогию с более простым циклом while. for(выражение 1; выражение 2; выражение 3) оператор; это то же самое, что: выражение 1; while(выражение 2){ оператор; выражение 3; } Так станет понятнее, что же делает приведенный цикл. По началу он объявляет переменные i и t, затем начинает цикл, который будет длиться до тех пор, пока i не станет больше или равна szin (передаваемая в параметрах функции длина шифруемой строки). Далее в цикле ксорится i-ый элемент массива с t-ым элементом ключа. Потом оба счетчика i и t повышаются на один. При этом если счетчик t станет вдруг больше или равен длине ключа szkey (тоже передается в параметрах), то t обнулится. Таким образом этот несложный цикл ухитряется шифровать, а при повторном вызове расшифровывать строку с ключом любой длины. Наша программа - консольное Win32-приложение. И запускаться, соответственно, будет из командной строки. При запуске она берет первое значение аргумента (argv[1]) за параметр, содержащий путь к файлу, и пытается его открыть, а второй аргумент (argv[2]) - шифрующий ключ. Например, чтобы зашифровать файл C:\password.txt, необходимо запустить программу следующим образом: crypto.exe C:\password.txt ключ Декриптовать зашифрованный текст можно, повторно запустив программу. Двухмеговый файл наша прога криптует за мгновение ока, а стомеговый файл она делала около десяти секунд. Имхо, неплохо. Реализация сложных криптоалгоритмов С простыми криптоалгоритмами мы разобрались, а как быть со сложными? Ведь для их реализации требуется знание не только языка, но и высшей математики. Так, например, для генерации ключа для алгоритма RSA требуется найти простое число длиной около 512 бит (в зависимости от стойкости криптоалгоритма), а это не так легко сделать. На написание программы, реализующей сложный криптоалгоритм, ушло бы очень много времени, и в одной статье это не поместится. Но здесь нам на помощь приходят криптопровайдеры. Криптопровайдер (далее КП) - это чаще всего просто библиотека готовых функций шифрования, расшифровки, генерации ключей для существующих криптоалгоритмов. Если поискать в Сети, таких провайдеров можно найти очень много, но удобнее всего использовать КП от фирмы Mircosoft. Он уже встроен в Windows и готов к употреблению. Набор функций, использующих Windows КП, называется CryptoAPI, и с его помощью ты можешь зашифровать все что угодно и практически любым алгоритмом. Единственный недостаток криптоапи - поставляется он без исходников, а это может вызвать недоверие. Но на этот случай можно воспользоваться набором очень качественно реализованных алгоритмов проекта www.openssl.org. Вот точный урл на документацию к нему: http://www.openssl.org/docs/crypto/crypto.html |