C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

стр.: (2) < [1] 2 >
(Де-)Шифрование по ключу
L.u.M.
Отправлено: 19.11.2006, 17:35


Ученик-кочегар

Группа: Участник
Сообщений: 28



Всем привет!
Видел подобные темы, но немного не то, что мне нужно!
Задача у меня такая: надо организовать шифровку/дешифровку текстового файла по случайно генерирующемуся ключу.

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

Причем сделать все это нужно как можно безопаснее (т.е. обеспечить защиту файла максимальнее).

Как такое реализовать и, если можно — подробнее, пожалуйста, об этом! Ссылки на англоязычные сайты, пожалуйста. не давайте!

Видел подобную статью на cbuilder.ru (PGPSDK — легкий путь к шифрованию), но там в комментарии идет осуждение этого метода (http://rsdn.ru/Forum/Message.aspx?mid=318972&only=1).
Evil_Smile
Отправлено: 20.11.2006, 10:58


Дежурный стрелочник

Группа: Участник
Сообщений: 57



Можно воспользоваться Randomise()
CODE

#include "math.hpp"
//в OnCreate формы требующую авторизацию
Randomize();
int pass = RandomRange(1, i);//i = максимальное колличество знаков в строке
ShowMessage(pass);
return;

затем можно пароль (pass) запомнить и слить в реестр или куда-нить есчо

Отредактировано Evil_Smile — 20.11.2006, 19:05
gvg
Отправлено: 20.11.2006, 11:13


Машинист паровоза

Группа: Участник
Сообщений: 222



Если интересуетесь PGP — есть компоненты. http://idw-doc.homepage.t-online.de/PGPcomp.htm
olegenty
Отправлено: 20.11.2006, 12:17


Ветеран

Группа: Модератор
Сообщений: 2412



с алгоритмом шифрования определился? сам будешь шифровать, или воспользуешься сторонней реализацией? исходя из ответов на эти вопросы и определяйся. компонентов/классов для симметричного шифрования (у тебя по условию задачи — именно такое) — немеряно, например, на torry.net и твоя задача сводится к обеспечению генерации ключа в соответствии с требованиями выбранного алгоритма. я б выбрал отечественный ГОСТ — им официально разрешено шифрование на территории РФ.
L.u.M.
Отправлено: 20.11.2006, 13:50


Ученик-кочегар

Группа: Участник
Сообщений: 28



Спасибо за ответы! =)
olegenty, с алгоритмом пока не определился и естественно буду использовать чужой! =) Свой писать мне еще слишком рано! =)
А можно подробнее о ГОСТе?

И что скажете относительно комментария, ссылку на который я указал в первом сообщении?
Boyko
Отправлено: 21.11.2006, 13:13


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (L.u.M. @ 20.11.2006, 12:50)
А можно подробнее о ГОСТе?

Ищите ГОСТ 28147/89

Обратите внимание на:

1. Режим гаммирования (шифрование/дешифрование данных)

2. Режим имитоставки (используйте на проверку если ключ правильный)
olegenty
Отправлено: 21.11.2006, 13:35


Ветеран

Группа: Модератор
Сообщений: 2412



по ссылке не ходил, но, IMHO, PGP тебе тут совершенно не надо. PGP в полный рост разворачивается, когда требуется ассимметричное шифрование, т.е. шифрование с открытым ключом, которое сводится к использованию ассимметричного алгоритма для генерации сеансового ключа, который потом используется в паре с симметричным алгоритмом шифрования.
L.u.M.
Отправлено: 22.11.2006, 13:25


Ученик-кочегар

Группа: Участник
Сообщений: 28



olegenty, тогда поищу ГОСТ! Надеюсь, что если не найду — вы мне поможете с сылкой! =)
L.u.M.
Отправлено: 25.11.2006, 18:16


Ученик-кочегар

Группа: Участник
Сообщений: 28



QUOTE
Ищите ГОСТ 28147/89

Boyko, к сожалению, такой ГОСТ я не нашел... и почему алгоритм шифрования так назван?
BadMan
Отправлено: 25.11.2006, 19:21


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Думаю человеку стандартный алгоритм не подойдет.
Шифруется текстовый файл, ключ к нему, я так понял, должен вводиться ручками, при этом защита должна быть максимальной.
Если хакер будет знать алгоритм (если использовать стандартный), то взлом текстовго файла при короткой длине ключа будет занимать не такое уж солидное время. Короткую длину я имею в иду ту, которую боле-менее комфортно можно ввести с клавиатуры.
Если ключ будет более длинный — его трудно будет ручками ввести...
При коротких ключах надо секретить сам алгоритм шифрования (что не всегда получается)...
Хотя если точно можно быть уверенным, что алгоритм врагам не достанется — то можно налепить практически любой способ (хоть XOR — главное СВОЙ) и тогда взломать файл будет весьма затруднительно.
А при стандартных алгоритмах придется в качестве пароля давать дискетку с ключом.
L.u.M.
Отправлено: 25.11.2006, 21:07


Ученик-кочегар

Группа: Участник
Сообщений: 28



Т.е. придется брать алгоритм и дописывать его самому?

А можно ссылку на справочный материал по XOR, но только на русском?

Ключ надо вводить с клавиатуры. =)
BadMan
Отправлено: 25.11.2006, 21:43


Дежурный стрелочник

Группа: Участник
Сообщений: 37



XOR — это логическая операция "Исключающее ИЛИ"
Если к какому-либо байту применить эту операцию — он изменяется, при повторном применении возвращается в исходный вид.

Данный метод является наипростейшим способом шифрования, описан в любом учебнике по программированию.
Я же пошутил, на самом деле.

Просто если ключик должен быть реально небольшим — то нужно засекретить сам алгоритм шифрования. Грубо говоря, злоумышленник ни в коем случае не должен получить доступ к программе шифрования или дешифрования. Это чисто организационный момент: если есть опасность перехвата только шифрованного файла и 100% отсутствует возможность доступа к самой программе шифрования/дешифрования то самый простой вариант самому придумать некий алгоритм шифрования. Просто текстовые файлы вскрываются легче всего.

Надо начать с оценки реальной угрозы: на сколько нужно злоумышленнику завладеть информацией (т.е. на какие затраты он пойдет для достижения результата). Реально он пойдет на дизассемблирование программы шифратора/дешифратора? Разобраться в коде потребует определенного времени и соответственно денег.

А по сути алгоритмов — тут кто на что способен
Допустим ключ — строка из 4-х символов

Шифрованный текст[0] = Исходный текст[0] XOR Пароль[0]
Шифрованный текст[1] = Исходный текст[1] XOR Пароль[1]
Шифрованный текст[2] = Исходный текст[2] XOR Пароль[2]
Шифрованный текст[3] = Исходный текст[3] XOR Пароль[3]
Шифрованный текст[4] = Исходный текст[4] XOR Пароль[0]
Шифрованный текст[5] = Исходный текст[5] XOR Пароль[1]
Шифрованный текст[6] = Исходный текст[6] XOR Пароль[2]
Шифрованный текст[7] = Исходный текст[7] XOR Пароль[3]
и т.д.

Кстати, если доступа посторонним к самим программам шифрования/дешифрования нет, то ключ вообще не нужен — пишем в свой собственный формат и все дела...

На самом деле на форуме есть такие специалисты по криптографии, которым я в подметки не гожусь — так что по алгоритмам это скорее к ним, я чисто с точки зрения целесообразности затраченных усилий.

Мне нужно было в INI файл зашить пароли. Я точно знал, что пользователи будут ниже среднего уровня подготовки. Поэтому пароли я просто записал в виде
[Символ пароля][Случайный символ][Символ пароля][Два случайных символа] и т.д. — Такого уровня шифрования вполне хватило, чтобы не лазили куда не просят...
L.u.M.
Отправлено: 26.11.2006, 12:00


Ученик-кочегар

Группа: Участник
Сообщений: 28



QUOTE
то нужно засекретить сам алгоритм шифрования

А что это значит? Нельзя использовать доп. файлы для шифрования как в PGP или защитить сам код программы?

Текстовые файлы, которые я буду шифровать содержат номера, адреса и фамилии абонентов, занесенные пользователями программы. (пишу телефонный справочник).
olegenty
Отправлено: 26.11.2006, 12:22


Ветеран

Группа: Модератор
Сообщений: 2412



принципиально не согласен с "засекретить". самописные алгоритмы ломаются на десятки порядков быстрее, чем общеизвестные. если уж хочется секретности, можно просто никому не сказать, что использовался ГОСТ.
BadMan
Отправлено: 26.11.2006, 13:39


Дежурный стрелочник

Группа: Участник
Сообщений: 37



QUOTE (olegenty @ 26.11.2006, 12:22)
принципиально не согласен с "засекретить". самописные алгоритмы ломаются на десятки порядков быстрее, чем общеизвестные. если уж хочется секретности, можно просто никому не сказать, что использовался ГОСТ.

Общеизвестные алгоритмы разве нужно ломать? Они общеизвестные и так. Насколько я знаю по ГОСТу как раз и существует общеизвестный алгоритм — его любой может узнать, но чтобы открыть ключ нужно просто колоссальное количество времени (века)

К вопросу снятия самодельного алгоритма — тут как раз и есть цена вопроса, о которой я спрашивал.
Я на 100% уверен, что смогу написать алгоритм шифрования, который опытный хакер будет открывать достаточно долго (по моей оценке — несколько дней, а то и недель), причем мне его написать будет гораздо быстрее — воды можно столько налить по всевозможным переходам, кодированию и т.п., что просто очень долго и муторно нужно будет ходить по отладчику.

Вопрос: Скорее всего вскрывать мой алгоритм хакеру будет так же нужно как озеленять луну — если открываемая информация ему нужна как козе баян.

Не говорить, что зашифровано по ГОСТу — это и есть секретить алгоритм. Но если пользоваться готовыми компонентами — хакеру будет легче, наверняка у него уже есть подборка сигнатур, чтобы определить тип алгоритма шифрования...

Сейчас я просто филосовствую на тему: А оно надо? Закрыть текстовый файл от просмотра можно достаточно простыми и легкими методами, если информация в таком файле не стоит затрат на расшифровку.
Данную задачу можно решить тремя способами:
1. Взять готовый компонент шифрования (тот же zip с паролем)
2. Взять общедоступный алгоритм ГОСТа или международный и реализовать его самостоятельно (не уверен что он очень простой для реализации, я как-то читал о нем, придется повозиться)
3. Написать свою легкую шифровку (если есть уверенность, что пользователь не будет оплачивать дорогостоящий труд хакера на вскрытие алгоритма)


Возвращаясь к началу темы — ключ нужно вводить ручками. На сколько я помню минимальная длина ключа по ГОСТУ — 32 байта.

Теперь практика: Для получения информации пользователю предлагается ввести пароль в 32 символа сгенерированных случайно...
Автор сей программы умрет быстро.
От икоты — когда каждый пользователь его будет вспоминать...

Все стандартные алгоритмы шифрования, насколько я знаю, построены на одном принципе: Хакер знает алгоритм, но не знает ключа. Соответственно ключ должен быть достаточно длинным

Если нужно полное описание ГОСТовского алгоритма — оно у меня есть могу скинуть на мыло.

Отредактировано BadMan — 26.11.2006, 13:48
Tantos
Отправлено: 26.11.2006, 15:34


Станционный диспетчер

Группа: Участник
Сообщений: 108



Может, тебе посмотреть в сторону набора компонентов TurboPower LockBox (TpLockBox)? Вот что они сами про себя говорят:
QUOTE (TpLockBox readme @ 26.11.2006, 22:37)

LockBox is a cross-platform toolkit for data encryption. It contains routines & components for use with Borland Delphi, C++Builder, & Kylix. It provides support for Blowfish, RSA, MD5, SHA-1, DES, triple-DES, Rijndael, & digital signing of messages.


Отредактировано Tantos — 26.11.2006, 22:38
L.u.M.
Отправлено: 26.11.2006, 16:07


Ученик-кочегар

Группа: Участник
Сообщений: 28



BadMan, давай! =) Мое мыло — docwar[dog]mail[to4ka]ru
Да и потом... серийник можно скопировать или распечатать куда-нибудь, но 32 символа — это уж слишком...
Tantos, а есть по нему материал на русском языке?

А что о PGP скажете? Стоит-ли использовать?
BadMan
Отправлено: 26.11.2006, 16:56


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Описание гостовского алгоритма скинул
L.u.M.
Отправлено: 26.11.2006, 18:15


Ученик-кочегар

Группа: Участник
Сообщений: 28



Получил, спасибо! =)

Осталось только послушать другие отзывы о PGP и комментарий по комментарию(см. первый пост). =)
BadMan
Отправлено: 26.11.2006, 19:19


Дежурный стрелочник

Группа: Участник
Сообщений: 37



Этот компонет я точно не знаю.

Кстати в догонку еще одну граблю опишу — на которую лично я наступил.

Есть база. Есть поля, в котором хранится то, что я хотел зашифровать (текстовые).
Применил позаимствованную у кого-то шифровку — текстовое поле превратилось в набор байт, в середине которого нагло торчал нулевой символ. Результат — стандартные функции работы с текстовыми полями повылетали. Пришлось бы делать двоичное поле, при записи в базу шифровать, при чтении расшифровывать.
На тот момент у меня это не принципиальный момент был, поэтому на поиск компонентов, подходящих для меня, я потратил примерно 3 часа. Ничего стоящего не нашел и зашифровал текст вручную своим алгоритмом — оказалось быстро и для моих задач вполне хватило.

Вывод: все что я видел про шифровку великолепно поможет закрыть файл целиком, но чтобы работать с этим файлом надо его опять таки раскрыть целиком. Надо поискать компоненты именно работы с БД, которые налету шифруют то, что туда пишется. И по-моему такие есть, но на память не помню.
L.u.M.
Отправлено: 26.11.2006, 19:50


Ученик-кочегар

Группа: Участник
Сообщений: 28



QUOTE (BadMan @ 26.11.2006, 19:19)
все что я видел про шифровку великолепно поможет закрыть файл целиком, но чтобы работать с этим файлом надо его опять таки раскрыть целиком.

Именно это мне и нужно! Т.е. открыть файл полностью в программе при совпадении ключа выданного программой и введеного пользователем, и зашифровать его при выходе.
BadMan
Отправлено: 26.11.2006, 21:24


Дежурный стрелочник

Группа: Участник
Сообщений: 37



QUOTE (L.u.M. @ 26.11.2006, 19:50)
Именно это мне и нужно! Т.е. открыть файл полностью в программе при совпадении ключа выданного программой и введеного пользователем, и зашифровать его при выходе.

При вылете программы файл останется расшифрованным. Если в процессе работы программы прервать ее — файл как на блюдечке.
Я так понимаю, что каждый пользователь, обладающий ключом — 100% надежный человек.
L.u.M.
Отправлено: 26.11.2006, 22:03


Ученик-кочегар

Группа: Участник
Сообщений: 28



QUOTE
При вылете программы файл останется расшифрованным. Если в процессе работы программы прервать ее — файл как на блюдечке.
Я так понимаю, что каждый пользователь, обладающий ключом — 100% надежный человек.

Так ведь файл расшифровывается, когда пользователь введет правильный ключ. А если программа вылетет, то пользователь сможет догадаться посмотреть файл и, если он не зашифрован, — зашифровать.

Только вопрос(по всем алгоритмам): если файл не зашифрован, а мы его открываем, то надо вводить ключ. Но что программа будет расшифровывать, если файл и так не засекречен?
BadMan
Отправлено: 26.11.2006, 22:07


Дежурный стрелочник

Группа: Участник
Сообщений: 37



QUOTE (L.u.M. @ 26.11.2006, 22:03)
Только вопрос(по всем алгоритмам): если файл не зашифрован, а мы его открываем, то надо вводить ключ. Но что программа будет расшифровывать, если файл и так не засекречен?

Это уже на совести программиста.
Программа должна сама разобраться зашифрован файл или нет.
Думаю, в зашифрованном файле должна хранится какая-то служебная информация и (или) сигнатура.
Tantos
Отправлено: 27.11.2006, 16:45


Станционный диспетчер

Группа: Участник
Сообщений: 108



2 L.u.M.: на русском help'a не видел. Отдельно можно скачать английский, очень подробный и понятный.
L.u.M.
Отправлено: 27.11.2006, 18:11


Ученик-кочегар

Группа: Участник
Сообщений: 28



Оставь, пожалуйста, ссылку в теме на хлеп. Спасибо! =)
Tantos
Отправлено: 29.11.2006, 14:43


Станционный диспетчер

Группа: Участник
Сообщений: 108



_http://download.sourceforge.net/tplockbox/tplockbox_docs.zip
L.u.M.
Отправлено: 08.12.2006, 11:16


Ученик-кочегар

Группа: Участник
Сообщений: 28



Спасибо, но это мне не поможет... =)

Какие ГОТОВЫЕ библиотеки можете посоветовать? Поскольку сам не смогу написать или переделать алгоритм, да и так, чтобы защита данных была высокой...
Заранее спасибо!
gvg
Отправлено: 08.12.2006, 13:27


Машинист паровоза

Группа: Участник
Сообщений: 222



Ну лови уже...
CODE
//---------------------------------------------------------------------------
#include "CPPB.h" //объяви свое
//---------------------------------------------------------------------------
/* STRCODE */
byte codekey[] =
{
 0x74,0x17,0x26,0x80,0x3f,0xff,0x74,0x0c,       //внеси свою маску какой хочешь длины
 0x26,0x38,0x67,0x01,0x72,0x06,0x26,0x82,
 0x00
};
//---------------------------------------------------------------------------
static byte rol ( byte s, unsigned i, int w )
{
 byte c;

 i %= 8;
 if ( i == 0 )
    i++;

 while ( i-- )//> 0 )
 {
   if ( w != 0 )  // decoding
   {
     c = (byte) ( s & 1 );
     s >>= 1;
     if ( c != 0 )
         s |= 0x80;
   }
   else      // coding
   {
     c = (byte) ( s & 0x80 );
     s <<= 1;
     if ( c != 0 )
         s |= 1;
   }
 }

 return ( s );
}
//---------------------------------------------------------------------------
char* __fastcall strcode ( char *str, bool work, unsigned len )
{
 unsigned i, j, o;
 char c;
 byte *q1, *q2;
 char buf[128]; // поправь длину, если маска длиннее!

 strcpy ( buf, (char*)codekey );
 q1 = codekey;
 q2 = (byte*)strrev ( buf );

 for (; *q1 != 0; q1++, q2++ )
     *q2 = rol ( *q2, *q1, FALSE );
 i = len + strlen ((char*) codekey );

 for ( j = 0, q1 = (byte*)buf, o = 0; j < len; j++, q1++ )
 {
   if ( !*q1 )
   {
     q1 = (byte*)buf;
     o++;
   }
   c = str[j];
   str[j] = rol ( str[j], i + *q1 + o, work );
   i = !work ? str[j] : c;
 }

 return ( str );
}
//---------------------------------------------------------------------------


Отредактировано gvg — 08.12.2006, 13:31
Boyko
Отправлено: 08.12.2006, 16:19


Станционный диспетчер

Группа: Участник
Сообщений: 88



QUOTE (olegenty @ 26.11.2006, 11:22)
самописные алгоритмы ломаются на десятки порядков быстрее, чем общеизвестные.

Лучше не могу сказать. Кстаты, алгоритм qvq самописный. Все таки ГОСТ 28147/89 на порядков лучший. wink.gif
стр.: (2) < [1] 2 >
Вернуться в Вопросы программирования в C++Builder