| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Шифрование типизированного файла |
| Автор: Z_P 17.4.2005, 22:38 |
| Необходимо шифрование типизированного файла, пусть даже шифрование будет простенькое. Подходит шифрование ксором (xor), но как его применить полностью к записи, а не по отдельным элементам этой записи? |
| Автор: RA 17.4.2005, 23:02 |
| Прлостенький пример шифрования фалов но без оператора xor |
| Автор: Z_P 17.4.2005, 23:20 |
| Это полностью файл декодирует, и прибавляет символ определенный. А мне нужно только запись из типизированного файла декодировать\раскодировать, как это сделать? Как получить доступ к записи в общем, а не по ее элементам? |
| Автор: ~FoX~ 18.4.2005, 08:14 |
| Z_P В DRKB есть пример. |
| Автор: RA 18.4.2005, 10:58 | ||||||
Ну как написанно так это и понимается:
Должныже быть в твоём типизированном файле, указатели на запись, вот по ним и находится доступ к записи в целом. К примеру могу предложить модуль для записи/чтения зашифрованных данных ini файла, как ни как типизированный фаил с указателями. |
| Автор: Snowy 18.4.2005, 11:18 | ||
Самое простое, что тут можно сделать: Создаешь TMemoryStream, загоняешь туда все записи, потом кодируешь весь поток побайтно и сбрасываешь в файл. Обратный процесс: Читаешь в стрим, побайтно декодируешь и нарезаешь на записи. |
| Автор: Yanis 18.4.2005, 11:31 | ||||
К примеру, я делал так:
а в программе, например:
В общем, надеюсь идея ясна. Это самое простое шифрование, но в большинстве случаев вполне приемлимое для типизированых файлов. PS. Под рукой дельфов нету, так что не исключены ошибки |
| Автор: Snowy 18.4.2005, 18:45 |
| Я все сказал. В TMemoryStream можно зашифровать каждый байт, независимо от сложности струкруры. Через move сохраняешь и восстанавливаешь структуру. Стрим зашифровать элементарно |
| Автор: Romtek 18.4.2005, 19:07 | ||
Я навалял на Турбо Паскале такой код, по идее должен работать и в Дельфи.
При этом данные не надо никуда копировать, они шифруются прямо на месте, в записи. Ключом шифра я выбрал размер записи, хотя можно взять любой другой. |
| Автор: Snowy 18.4.2005, 19:11 |
| Это при простой записи, а при сложной Stream в руки и поехали шифровать. стрим превращает структуру любой записи в поток байтов. Ксорим его или любой другой принцимп - по барабану. Гланое, что имеем дело не с полями, а с потоком данных. |
| Автор: Z_P 18.4.2005, 22:58 | ||
| Всем большое спасибо за помощь! С методом XOR я уже разобрался давно.. Пришел к тому как предлогает Yanis, но не очень ведь красиво, но в принципе пока такое решение только вижу. А вообще я с самого начала хотел сделать как предлогает Snowy
Вот только как такое реализовать? Примерчик можно не большой? Ведь с таким способом думаю и будет лучше шифрование?! Кстати еще вопрос, ведь если два раза проксорить сначала к примеру с xor $15, потом еще xor $54, ведь шифрование лучше же? |
| Автор: Romtek 18.4.2005, 23:38 | ||
|
| Автор: Z_P 19.4.2005, 23:39 |
| Romtek Нет конечно, free делаю |
| Автор: Acraft 20.4.2005, 02:07 |
| Нда, послушать вас... операция XOR спасет от прочтения файла вашей бабушкой (если только она не была радисткой в годы бурной военной юности). XOR - ЭТО ОПЕРАЦИЯ исключающего "или", иначе сложение по модулю 2. И является незначительной помехой для крипоанализa 0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 //таблица истинности 1 + 1 = 0 Вот самый простой пример. Шифрование заключается в сложении по модулю 26 символа открытого текста и символа ключа. Если сообщение гласит: ONETIMEPAD. а ключевая последовательноть: TBFRGFARFM то шифртекст будет выглядеть так IPKLPSFHGQ O + T mod 26 = I N + B mod 26 = P E + F mod 26 = K и т.д. a + b mod n; Родственник xor, т.к. в качестве n используется длинна алфавита используемого в сообщении. Недостатком является то, что длина ключа должна совпадать с длиной шифруемого сообщения (и в идеале, алгоритм носит название "Одноразового блокнота", ключ также должен быть одноразовым). Идем дальше. Шифрование: поточное (преобразует открытый текст в шифротекст побитово) и блочное (вся шифруемая информация разбивается на блоки по 64, 128...бит. А дальше идут управляемые операции над блоками) DES - устаревший, но отличный учебный пример. 64 битовый блочный алгоритм. Предназначен для шифрования данных 64 битовыми блоками. Алгоритм симметричен, т.е. для расшифрования его надо прогнать наоборот. Длина ключа - 56 бит (любое 56 битовое число). Секретность целиком определяется ключом. На простейшем уровне алгоритм представляет собой комбинацию рассеивания и перемешивания. Блок шифрования здесь назовем раундом. DES включает 16 раундов, т.е. одна и та же комбинация методов применяется к открытому тексту 16 раз. открытый текст (64 бита) | | Left [0](32 бита) Rigth [0](32 бита) | | xor<------(f)---------| | ^ | \ |---------/---------- K[1] - ключ \ / \ / X / \ / \ //блоки меняются местами | | V V L[1]=R[0] R[1]=L[0] xor f(R[0],K[1]) | | xor<------(f)-----| | ^ | \ |------/---------- K[2] - ключ \ / \ / X / \ / \ //блоки меняются местами | | V V L[2]=R[1] R[2]=L[1] xor f(R[1],K[2]) | | ................... ................... ..................................... | | v v L[15]=R[14] R[15]=L[14] xor f(R[14],K[15]) | | xor<------(f)----------------| | ^ | | |--------------------------------- K[16] - ключ | | v v //на последнем шаге перестановка не осуществляется R15=L14 xor f(R14,K15) R[16]=R[15] |__________________| | шифртекст (64 бита) {Алгоритм DES} Блок разбивается на левую и правую половину по 32 бита. Затем выполняется 16 раундов одинаковых действий, в которых данные объединяются с ключом (ф-я (f)). После 16-го раунда левая и правая половины объединяются. На каждом раунде биты ключа сдвигаются, а затем из 56 битов ключа выбираются 48 битов. Правая половина данных увеличиватся до 48 битов путем перестановки с расширением, XOR'ится с 48 битами смещенного и переставленного ключа, проходит через 8 S-блоков, образуя 32 новых бита, и переставляется снова. Эти четыре операции и выполняются функцией f. Затем результат выполнения ф-ии f складывается с левой половиной с помощью еще одной операции XOR. В итоге этих действий появляется новая правая половина, а старая правая половина становится новой левой. Эти действия повторяются 16 раз, образуя 16 раундов алгоритма ДЕС. Если принять за B[i] результат i-й операции, L[i] и R[i] - левую и правую половины B[i]'го, K[i] - 48 битовый ключ для раунда i, а f - функцию, выполняющую все подстановки, перестановки и оперции XOR с ключом, то раунд можно записать так: L[i]=R[i-1] R[i]=L[i-1] xor f(R[i-1], K[i]) {один раунд - нутро ф-ии (f)} L[i-1] R[i-1] К Л Ю Ч | | | | | | V V | --------| сдвиг сдвиг | | | ---------| |--------- | | v | v v | | | расширяющая | сжимающая | | | перестановка | перестановка | \ / | | | | \ / v | | | \ / XOR<---------------------------| | \/ | | | /\ v | | / \ подстановка | | / \ в S-блоке | | / \ | | | | \ v | | | \ перестановка | | | \ в P-блоке | | | \ | | | | \ v | | | \-> XOR |___ ___| | | | | v v v v L[i] R[i] К Л Ю Ч Осталось расписать операции перестановок и S-блоков в f, но это потом, сейчас СПАТЬ! Кто заинтересуется, можете почитать- книга всех времен и народов: * Б. Шнайер. Прикладная криптография. Протоколы, алгоритмы, исходные тексты на языке Си. – М.: Изд. ТРИУМФ, 2002 – 816 с.: ил. Вот еще неплохая книжечка, но форма изложения тяжеловата. * Молдовян А.А. и др., Криптография: скоростные шифры. – СПб.: БХВ-Петербург, 2002. – 496 с.: ил. (из той же серии, книга дополняет предыдущую - "Криптография, от примитивов к синтезу") Здесь все про скоростные шифры. Добавлено @ 02:10 p.s. нда, псевдогафика тут не получилась, ну ладно, кому надо могу на мыло txt-шку сбросить. |