Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Шифрование типизированного файла


Автор: Z_P 17.4.2005, 22:38
Необходимо шифрование типизированного файла, пусть даже шифрование будет простенькое.
Подходит шифрование ксором (xor), но как его применить полностью к записи, а не по отдельным элементам этой записи? smile

Автор: RA 17.4.2005, 23:02
Прлостенький пример шифрования фалов но без оператора xor smile

Автор: Z_P 17.4.2005, 23:20
Это полностью файл декодирует, и прибавляет символ определенный.
А мне нужно только запись из типизированного файла декодировать\раскодировать, как это сделать?
Как получить доступ к записи в общем, а не по ее элементам?

Автор: ~FoX~ 18.4.2005, 08:14
Z_P
В DRKB есть пример.

Автор: RA 18.4.2005, 10:58
Цитата(Z_P @ 17.4.2005, 23:20)
Это полностью файл декодирует, и прибавляет символ определенный.
А мне нужно только запись из типизированного файла декодировать\раскодировать, как это сделать?


Ну как написанно так это и понимается:
Цитата(Z_P @ 17.4.2005, 22:38)
Необходимо шифрование типизированного файла




Цитата(Z_P @ 17.4.2005, 23:20)
Как получить доступ к записи в общем, а не по ее элементам?


Должныже быть в твоём типизированном файле, указатели на запись, вот по ним и находится доступ к записи в целом.

К примеру могу предложить модуль для записи/чтения зашифрованных данных ini файла, как ни как типизированный фаил с указателями. smile

Автор: Snowy 18.4.2005, 11:18
Цитата(Z_P @ 17.4.2005, 22:38)
Необходимо шифрование типизированного файла, пусть даже шифрование будет простенькое.

Самое простое, что тут можно сделать:
Создаешь TMemoryStream, загоняешь туда все записи, потом кодируешь весь поток побайтно и сбрасываешь в файл.
Обратный процесс: Читаешь в стрим, побайтно декодируешь и нарезаешь на записи.

Автор: Yanis 18.4.2005, 11:31
К примеру, я делал так:
Код

type
  TRec = record
    f1: Integer;
    f2: String;
  end;
...

function CryptDecryptRec(const R: TRec): TRec;
var
  TR: TRec;
  i: integer;
const
  M = $666;
begin
  Result := TR;
  // каждое поле по отдельности:
  // сначала ксорим первое поле записи
  TR.f1 = R.f1 xor M;

  // затем второе поле
  for i := 1 to Length(R.f2)-1 do
    TR.f2[i] := Chr(Ord(R.f2[i]) xor M);
end;


а в программе, например:
Код

var
  R: TRec;
begin
...
  // при записи в файл
  R := CryptDecryptRec(R);
  write(f, R);

  // или при чтении
  read(f, R);
  R := CrypDecryptRec(R);


В общем, надеюсь идея ясна. Это самое простое шифрование, но в большинстве случаев вполне приемлимое для типизированых файлов. PS. Под рукой дельфов нету, так что не исключены ошибки smile

Автор: Snowy 18.4.2005, 18:45
Я все сказал. В TMemoryStream можно зашифровать каждый байт, независимо от сложности струкруры.
Через move сохраняешь и восстанавливаешь структуру.
Стрим зашифровать элементарно

Автор: Romtek 18.4.2005, 19:07
Я навалял на Турбо Паскале такой код, по идее должен работать и в Дельфи.
Код
program xor_record;

type
  TRec = record
    f1, f2: Integer;
    f3: String;
  end;

  XX = array [1..SizeOf (TRec)] of byte;
  PX = ^XX;

var
  X: PX;
  Rec: TRec;
  Recsize,
  i: integer;

begin
  readln (Rec.f1);
  readln (Rec.f2);

  X := @Rec;
  Recsize := SizeOf (TRec);

  for i := 1 to Recsize do
   X^[i] := X^[i] xor lo (Recsize);

  readln;
end.

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

Автор: Snowy 18.4.2005, 19:11
Это при простой записи, а при сложной Stream в руки и поехали шифровать.
стрим превращает структуру любой записи в поток байтов. Ксорим его или любой другой принцимп - по барабану. Гланое, что имеем дело не с полями, а с потоком данных.

Автор: Z_P 18.4.2005, 22:58
Всем большое спасибо за помощь!
С методом XOR я уже разобрался давно..
Пришел к тому как предлогает Yanis, но не очень ведь красиво, но в принципе пока такое решение только вижу.

А вообще я с самого начала хотел сделать как предлогает Snowy


Цитата(Snowy @ 18.4.2005, 19:11)
стрим превращает структуру любой записи в поток байтов. {...}  имеем дело c потоком данных. 


Вот только как такое реализовать? Примерчик можно не большой? Ведь с таким способом думаю и будет лучше шифрование?!


Кстати еще вопрос, ведь если два раза проксорить сначала к примеру с xor $15, потом еще xor $54, ведь шифрование лучше же?

Автор: Romtek 18.4.2005, 23:38
Цитата(Z_P @ 18.4.2005, 22:58)
ведь если два раза проксорить сначала к примеру с xor $15, потом еще xor $54, ведь шифрование лучше же?
ничего подобного, мелочи это. Одного xor хватит. Ты ведь не shareware программу пишешь?

Автор: Z_P 19.4.2005, 23:39
Romtek
Нет конечно, free делаюsmile

Автор: Acraft 20.4.2005, 02:07
Нда, послушать вас... операция XOR спасет от прочтения файла вашей бабушкой (если только она не была радисткой в годы бурной военной юности). smile
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-шку сбросить.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)