Добро пожаловать! Это — архивная версия форумов на «Хакер.Ru». Она работает в режиме read-only.
 

Криптография внешних файлов средствами Delphi7

Пользователи, просматривающие топик: none

Зашли как: Guest
Все форумы >> [Компилируемые языки] >> Криптография внешних файлов средствами Delphi7
Имя
Сообщение << Старые топики   Новые топики >>
Криптография внешних файлов средствами Delphi7 - 2007-03-28 18:01:06.643333   
XIO

Сообщений: 45
Оценки: 0
Присоединился: 2005-04-05 06:02:19
Люди, кто сталкивался или просто знает как можно зашифровать файл? Средствами Delphi.
В общем имеется база данных *.mdb, нужно что бы лишь в момент когда работает программа она была в нормальном состоянии, когда же программа завершает работу с ней, база должна криптоваться, для того что бы пользователь не мог открыть её через Access и поменять значения.

Мне советовали поискать CryptoAPI, перерыл много сайтов, прочитал кое какую информацию, и либо я всего этого не понимаю, либо понимаю что это не для моей программы.
Есть ли какое то другое решение? Какой нить модуль для дельфи? Или вы подскажите как реализовать, какими методами пользоватся?

По идее? шифр я смогу реализовать если узнаю каким образом организовать копирование файла по битам, при этом имея возможность менять значения каких-либо битов.
Оригинал затем удаляется? остается "испорченный" файл. При открытии востанавливаем прежние значения подменяных битов, и файл принимает нормальное состояние.8|
Как все это сделать?
Ну или может у кого-то есть готовые решения, буду очень рад и благодарен :)
Post #: 1
RE: Криптография внешних файлов средствами Delphi7 - 2007-03-28 18:46:58.336666   
alexbozhko

Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34
Сейчас ждем мнения Технологиста, но от себя скажу. Можно реализовать любой из тысяч известных алгоритмов шифрования самому. Но на torry.net можно найти прекрасные бесплатные реализации с открытым кодом. Я использовал одну из библиотек, чуть позже скажу навание (сейчас не помню)

Но может имеются более простые варианты решения задачи вцелом?
Использовать пароль Аксеса? Вставлять его при коннекте? Или как-то так
Post #: 2
RE: Криптография внешних файлов средствами Delphi7 - 2007-03-29 09:02:18.560000   
XIO

Сообщений: 45
Оценки: 0
Присоединился: 2005-04-05 06:02:19

quote:

ORIGINAL: alexbozhko

Сейчас ждем мнения Технологиста, но от себя скажу. Можно реализовать любой из тысяч известных алгоритмов шифрования самому. Но на torry.net можно найти прекрасные бесплатные реализации с открытым кодом. Я использовал одну из библиотек, чуть позже скажу навание (сейчас не помню)

Но может имеются более простые варианты решения задачи вцелом?
Использовать пароль Аксеса? Вставлять его при коннекте? Или как-то так


Ясненько. Буду очень рад, получить название реализации.
Ну что же касается реализации с использованием пароля в Access, то боюсь программисты могу его взломать или подобрать, и тем самым безопасность будет
минимальной, просто программа по умолчанию предназначена для программстов-почасовиков, и в базе храница количество отработанных часов.
С другой стороны программа является дипломным проектом, но тем не менее будет использоваться на реальном предприятии, и хотелось бы сделать все качественно.

Спасибо за помощь, попоже ещё загляну )
Post #: 3
RE: Криптография внешних файлов средствами Delphi7 - 2007-03-29 09:37:13.523333   
NightmareZz

Сообщений: 1087
Оценки: 0
Присоединился: 2006-10-15 11:16:16.833333
quote:

ORIGINAL: XIO
Люди, кто сталкивался или просто знает как можно зашифровать файл? Средствами Delphi.

Руками. Серьёзно. Реализуй какой-нить криптоалгоритм и шифруй на здоровье. В ][, кажись, была реализация RC4. Просто и сердито.

quote:

ORIGINAL: XIO
В общем имеется база данных *.mdb, нужно что бы лишь в момент когда работает программа она была в нормальном состоянии, когда же программа завершает работу с ней, база должна криптоваться, для того что бы пользователь не мог открыть её через Access и поменять значения.

Что мешает ему открыть её и поменять значения, когда программа работает?

quote:

ORIGINAL: XIO
Мне советовали поискать CryptoAPI, перерыл много сайтов, прочитал кое какую информацию, и либо я всего этого не понимаю, либо понимаю что это не для моей программы.

Правильный совет. По сабжу четай MSDN.

quote:

ORIGINAL: XIO
Есть ли какое то другое решение?

Либо сам пишешь, либо юзаешь готовое. Какое решение ещё тебе нужно?

quote:

ORIGINAL: XIO
Какой нить модуль для дельфи?

50$ - будет тебе модуль.
Стучись в аську: 95-96-93

quote:

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

Ты сам то понял, что сморозил?

quote:

ORIGINAL: XIO
Оригинал затем удаляется?

Как хочешь.

quote:

ORIGINAL: XIO
остается "испорченный" файл.

Какой, извиняюсь, в задницу, "испорченный"? Называй вещи своими именами: "зашифрованный", "закриптованный" и т.д.

quote:

ORIGINAL: XIO
Как все это сделать?

/dev/hands

quote:

ORIGINAL: XIO
Ну или может у кого-то есть готовые решения, буду очень рад и благодарен :)

95-96-93 ;)

quote:

ORIGINAL: alexbozhko
Сейчас ждем мнения Технологиста

Да-да, ждём. Давно я его не обсерал :D

quote:

ORIGINAL: XIO
Ну что же касается реализации с использованием пароля в Access, то боюсь программисты могу его взломать или подобрать, и тем самым безопасность будет
минимальной, просто программа по умолчанию предназначена для программстов-почасовиков, и в базе храница количество отработанных часов.

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

quote:

ORIGINAL: XIO
С другой стороны программа является дипломным проектом

Ну в этом случае можно любую лажу написать и преподнести в виде аццкого проекта.

quote:

ORIGINAL: XIO
но тем не менее будет использоваться на реальном предприятии, и хотелось бы сделать все качественно.

Как может что-то сделать качественно человек, если он в теме не шарит и пытается реализовать это первый раз?

quote:

ORIGINAL: XIO
Спасибо за помощь, попоже ещё загляну )

Пожалуйста ;)
Post #: 4
RE: Криптография внешних файлов средствами Delphi7 - 2007-03-29 10:07:37.796666   
alexbozhko

Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34
quote:

ORIGINAL: NightmareZz

quote:

ORIGINAL: XIO
Люди, кто сталкивался или просто знает как можно зашифровать файл? Средствами Delphi.

Руками. Серьёзно. Реализуй какой-нить криптоалгоритм и шифруй на здоровье. В ][, кажись, была реализация RC4. Просто и сердито.

quote:

ORIGINAL: XIO
В общем имеется база данных *.mdb, нужно что бы лишь в момент когда работает программа она была в нормальном состоянии, когда же программа завершает работу с ней, база должна криптоваться, для того что бы пользователь не мог открыть её через Access и поменять значения.

Что мешает ему открыть её и поменять значения, когда программа работает?

quote:

ORIGINAL: XIO
Мне советовали поискать CryptoAPI, перерыл много сайтов, прочитал кое какую информацию, и либо я всего этого не понимаю, либо понимаю что это не для моей программы.

Правильный совет. По сабжу четай MSDN.

quote:

ORIGINAL: XIO
Есть ли какое то другое решение?

Либо сам пишешь, либо юзаешь готовое. Какое решение ещё тебе нужно?

quote:

ORIGINAL: XIO
Какой нить модуль для дельфи?

50$ - будет тебе модуль.
Стучись в аську: 95-96-93

quote:

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

Ты сам то понял, что сморозил?

quote:

ORIGINAL: XIO
Оригинал затем удаляется?

Как хочешь.

quote:

ORIGINAL: XIO
остается "испорченный" файл.

Какой, извиняюсь, в задницу, "испорченный"? Называй вещи своими именами: "зашифрованный", "закриптованный" и т.д.

quote:

ORIGINAL: XIO
Как все это сделать?

/dev/hands

quote:

ORIGINAL: XIO
Ну или может у кого-то есть готовые решения, буду очень рад и благодарен :)

95-96-93 ;)

quote:

ORIGINAL: alexbozhko
Сейчас ждем мнения Технологиста

Да-да, ждём. Давно я его не обсерал :D

quote:

ORIGINAL: XIO
Ну что же касается реализации с использованием пароля в Access, то боюсь программисты могу его взломать или подобрать, и тем самым безопасность будет
минимальной, просто программа по умолчанию предназначена для программстов-почасовиков, и в базе храница количество отработанных часов.

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

quote:

ORIGINAL: XIO
С другой стороны программа является дипломным проектом

Ну в этом случае можно любую лажу написать и преподнести в виде аццкого проекта.

quote:

ORIGINAL: XIO
но тем не менее будет использоваться на реальном предприятии, и хотелось бы сделать все качественно.

Как может что-то сделать качественно человек, если он в теме не шарит и пытается реализовать это первый раз?

quote:

ORIGINAL: XIO
Спасибо за помощь, попоже ещё загляну )

Пожалуйста ;)


Delphi Encryption Compendium
Вот такая есть лабуда.
Мне нравится, хотя, конечно, реализовать самому какой-нибудь алгоритм - приобрести  несравнимый ни с чем опыт.
Вряд-ли ты защитишь ее (БД) лучше чем парни из MS (ну, по крайней мере на сегодняшний день).

2NightmareZz

Похоже Технологист волынит :(
А может случилось чего?


Post #: 5
RE: Криптография внешних файлов средствами Delphi7 - 2007-03-29 19:31:24.383333   
blacksun

Сообщений: 2360
Оценки: 0
Присоединился: 2006-09-27 03:05:59.350000
RC6:
unit RC6; interface uses SysUtils, Classes; const Rounds = 20; KeyLength = 2 * (Rounds + 2); BlockSize = 16; KeySize = 16 * 4; P32 = $b7e15163; Q32 = $9e3779b9; lgw = 5; type TRC6Block = array[1..4] of LongWord; var S : array[0..KeyLength-1] of LongWord; Key : string; KeyPtr : PChar; //////////////////////////////////////////////////////////////////////////////// // Дополнительные функции procedure Initialize(AKey: string); // Инициализация procedure CalculateSubKeys; // Подготовка подключей function EncipherBlock(var Block): Boolean; // Шифрация блока (16 байт) function DecipherBlock(var Block): Boolean; // Дешифрация блока //////////////////////////////////////////////////////////////////////////////// // Главные функции function EncryptCopy(DestStream, SourseStream : TStream; Count: Int64; Key : string): Boolean; // Зашифровать данные из одного потока в другой function DecryptCopy(DestStream, SourseStream : TStream; Count: Int64; Key : string): Boolean; // Расшифровать данные из одного потока в другой function EncryptStream(DataStream: TStream; Count: Int64; Key: string): Boolean; // Зашифровать содержимое потока function DecryptStream(DataStream: TStream; Count: Int64; Key: string): Boolean; // Расшифровать содержимое потока implementation //////////////////////////////////////////////////////////////////////////////// function ROL(a, s: LongWord): LongWord; asm mov ecx, s rol eax, cl end; //////////////////////////////////////////////////////////////////////////////// function ROR(a, s: LongWord): LongWord; asm mov ecx, s ror eax, cl end; //////////////////////////////////////////////////////////////////////////////// procedure InvolveKey; var TempKey : string; i, j : Integer; K1, K2 : LongWord; begin // Разворачивание ключа до длинны KeySize = 64 TempKey := Key; i := 1; while ((Length(TempKey) mod KeySize) &lt;&gt; 0) do begin TempKey := TempKey + TempKey[i]; Inc(i); end; i := 1; j := 0; while (i &lt; Length(TempKey)) do begin Move((KeyPtr+j)^, K1, 4); Move(TempKey[i], K2, 4); K1 := ROL(K1, K2) xor K2; Move(K1, (KeyPtr+j)^, 4); j := (j + 4) mod KeySize; Inc(i, 4); end; end; //////////////////////////////////////////////////////////////////////////////// procedure CalculateSubKeys; var i, j, k : Integer; L : array[0..15] of LongWord; A, B : LongWord; begin // Копирование ключа в L Move(KeyPtr^, L, KeySize); // Инициализация подключа S S[0] := P32; for i := 1 to KeyLength-1 do S[i] := S[i-1] + Q32; // Смешивание S с ключом i := 0; j := 0; A := 0; B := 0; for k := 1 to 3*KeyLength do begin A := ROL((S[i] + A + B), 3); S[i] := A; B := ROL((L[j] + A + B), (A + B)); L[j] := B; i := (i + 1) mod KeyLength; j := (j + 1) mod 16; end; end; //////////////////////////////////////////////////////////////////////////////// procedure Initialize(AKey: string); begin GetMem(KeyPtr, KeySize); FillChar(KeyPtr^, KeySize, #0); Key := AKey; InvolveKey; end; //////////////////////////////////////////////////////////////////////////////// function EncipherBlock(var Block): Boolean; var RC6Block : TRC6Block absolute Block; i : Integer; t, u : LongWord; Temp : LongWord; begin // Инициализация блока Inc(RC6Block[2], S[0]); Inc(RC6Block[4], S[1]); for i := 1 to Rounds do begin t := ROL((RC6Block[2] * (2*RC6Block[2] + 1)), lgw); u := ROL((RC6Block[4] * (2*RC6Block[4] + 1)), lgw); RC6Block[1] := ROL((RC6Block[1] xor t), u) + S[2*i]; RC6Block[3] := ROL((RC6Block[3] xor u), t) + S[2*i+1]; Temp := RC6Block[1]; RC6Block[1] := RC6Block[2]; RC6Block[2] := RC6Block[3]; RC6Block[3] := RC6Block[4]; RC6Block[4] := Temp; end; RC6Block[1] := RC6Block[1] + S[2*Rounds+2]; RC6Block[3] := RC6Block[3] + S[2*Rounds+3]; Result := TRUE; end; //////////////////////////////////////////////////////////////////////////////// function DecipherBlock(var Block): Boolean; var RC6Block : TRC6Block absolute Block; i : Integer; t, u : LongWord; Temp : LongWord; begin // Инициализация блока RC6Block[3] := RC6Block[3] - S[2*Rounds+3]; RC6Block[1] := RC6Block[1] - S[2*Rounds+2]; for i := Rounds downto 1 do begin Temp := RC6Block[4]; RC6Block[4] := RC6Block[3]; RC6Block[3] := RC6Block[2]; RC6Block[2] := RC6Block[1]; RC6Block[1] := Temp; u := ROL((RC6Block[4] * (2*RC6Block[4] + 1)),lgw); t := ROL((RC6Block[2] * (2*RC6Block[2] + 1)),lgw); RC6Block[3] := ROR((RC6Block[3]-S[2*i+1]), t) xor u; RC6Block[1] := ROR((RC6Block[1]-S[2*i]), u) xor t; end; Dec(RC6Block[4], S[1]); Dec(RC6Block[2], S[0]); Result := TRUE; end; //////////////////////////////////////////////////////////////////////////////// // Реализация главных функций function EncryptCopy(DestStream, SourseStream : TStream; Count: Int64; Key : string): Boolean; var Buffer : TRC6Block; PrCount : Int64; AddCount : Byte; begin Result := True; try if Key = '' then begin DestStream.CopyFrom(SourseStream, Count); Exit; end; Initialize(Key); CalculateSubKeys; PrCount := 0; while Count - PrCount &gt;= BlockSize do begin SourseStream.Read(Buffer, BlockSize); EncipherBlock(Buffer); DestStream.Write(Buffer, BlockSize); Inc(PrCount, BlockSize); end; AddCount := Count - PrCount; if Count - PrCount &lt;&gt; 0 then begin SourseStream.Read(Buffer, AddCount); DestStream.Write(Buffer, AddCount); end; except Result := False; end; end; //////////////////////////////////////////////////////////////////////////////// function DecryptCopy(DestStream, SourseStream : TStream; Count: Int64; Key : string): Boolean; var Buffer : TRC6Block; PrCount : Int64; AddCount : Byte; begin Result := True; try if Key = '' then begin DestStream.CopyFrom(SourseStream, Count); Exit; end; Initialize(Key); CalculateSubKeys; PrCount := 0; while Count - PrCount &gt;= BlockSize do begin SourseStream.Read(Buffer, BlockSize); DecipherBlock(Buffer); DestStream.Write(Buffer, BlockSize); Inc(PrCount, BlockSize); end; AddCount := Count - PrCount; if Count - PrCount &lt;&gt; 0 then begin SourseStream.Read(Buffer, AddCount); DestStream.Write(Buffer, AddCount); end; except Result := False; end; end; //////////////////////////////////////////////////////////////////////////////// function EncryptStream(DataStream: TStream; Count: Int64; Key: string): Boolean; var Buffer : TRC6Block; PrCount : Int64; begin Result := True; try if Key = '' then begin DataStream.Seek(Count, soFromCurrent); Exit; end; Initialize(Key); CalculateSubKeys; PrCount := 0; while Count - PrCount &gt;= BlockSize do begin DataStream.Read(Buffer, BlockSize); EncipherBlock(Buffer); DataStream.Seek(-BlockSize, soFromCurrent); DataStream.Write(Buffer, BlockSize); Inc(PrCount, BlockSize); end; except Result := False; end; end; //////////////////////////////////////////////////////////////////////////////// function DecryptStream(DataStream: TStream; Count: Int64; Key: string): Boolean; var Buffer : TRC6Block; PrCount : Int64; begin Result := True; try if Key = '' then begin DataStream.Seek(Count, soFromCurrent); Exit; end; Initialize(Key); CalculateSubKeys; PrCount := 0; while Count - PrCount &gt;= BlockSize do begin DataStream.Read(Buffer, BlockSize); DecipherBlock(Buffer); DataStream.Seek(-BlockSize, soFromCurrent); DataStream.Write(Buffer, BlockSize); Inc(PrCount, BlockSize); end; except Result := False; end; end; // Завершение главных функций ... //////////////////////////////////////////////////////////////////////////////// end.
IDEA:
unit IDEA; interface uses SysUtils, Classes, Math; const Rounds = 8; KeyLength = (Rounds * 6) + 4; Maxim = 65537; type TIDEAKey = array[0..KeyLength-1] of Word; TIDEABlock = array[1..4] of Word; var Z : TIDEAKey; K : TIDEAKey; FBlockSize : Integer; FKey : string; FBufferSize : Integer; FKeySize : Integer; FKeyPtr : PChar; //////////////////////////////////////////////////////////////////////////////// // Дополнительные функции procedure Initialize(AKey: string); // Инициализация procedure CalculateSubKeys; // Подготовка подключей function EncipherBlock(var Block): Boolean; // Шифрация блока (8 байт) function DecipherBlock(var Block): Boolean; // Дешифрация блока //////////////////////////////////////////////////////////////////////////////// // Основные функции function EncryptCopy(DestStream, SourseStream : TStream; Count: Int64; Key : string): Boolean; // Зашифровать данные из одного потока в другой function DecryptCopy(DestStream, SourseStream : TStream; Count: Int64; Key : string): Boolean; // Расшифровать данные из одного потока в другой function EncryptStream(DataStream: TStream; Count: Int64; Key: string): Boolean; // Зашифровать содержимое потока function DecryptStream(DataStream: TStream; Count: Int64; Key: string): Boolean; // Расшифровать содержимое потока implementation //////////////////////////////////////////////////////////////////////////////// function ROL(a, s: LongWord): LongWord; asm mov ecx, s rol eax, cl end; //////////////////////////////////////////////////////////////////////////////// procedure InvolveKey; var TempKey : string; i, j : Integer; K1, K2 : LongWord; begin // Разворачивание ключа до длинны 51 символ TempKey := FKey; i := 1; while ((Length(TempKey) mod FKeySize) &lt;&gt; 0) do begin TempKey := TempKey + TempKey[i]; Inc(i); end; // Now shorten the key down to one KeySize block by combining the bytes i := 1; j := 0; while (i &lt; Length(TempKey)) do begin Move((FKeyPtr+j)^, K1, 4); Move(TempKey[i], K2, 4); K1 := ROL(K1, K2) xor K2; Move(K1, (FKeyPtr+j)^, 4); j := (j + 4) mod FKeySize; Inc(i, 4); end; end; //////////////////////////////////////////////////////////////////////////////// {$R-,Q-} procedure ExpandKeys; var i : Integer; begin // Копирование ключа в Z Move(FKeyPtr^, Z, FKeySize); // Генерация подключа зашифрование for i := 8 to KeyLength-1 do begin if (((i+2) mod 8) = 0) then Z[i] := (Z[i- 7] shl 9) xor (Z[i-14] shr 7) else if (((i+1) mod 8) = 0) then Z[i] := (Z[i-15] shl 9) xor (Z[i-14] shr 7) else Z[i] := (Z[i- 7] shl 9) xor (Z[i- 6] shr 7); end; end; //////////////////////////////////////////////////////////////////////////////// procedure InvertKeys; type PWord = ^Word; var j : Integer; pz, pp : PWord; t1, t2, t3 : Word; //////////////////////////////////////// function Inv(I: Integer): Integer; var n1, n2, q, r, b1, b2, t : Integer; begin if (I = 0) then Result := 0 else begin n1 := Maxim; n2 := I; b2 := 1; b1 := 0; repeat r := (n1 mod n2); q := (n1-r) div n2; if (r = 0) then begin if (b2 &lt; 0) then b2 := Maxim + b2; end else begin n1 := n2; n2 := r; t := b2; b2 := b1 - q * b2; b1 := t; end; until (r = 0); Result := b2; end; Result := (Result and $ffff); end; //////////////////////////////////////// begin pz := @Z; pp := @K; Inc(pp, KeyLength); // t1 = inv(*Z++); t1 := Inv(pz^); Inc(pz); // t2 = -*Z++; t2 := -pz^; Inc(pz); // t3 = -*Z++; t3 := -pz^; Inc(pz); // *--p = inv(*Z++); Dec(pp); pp^ := Inv(pz^); Inc(pz); // *--p = t3; Dec(pp); pp^ := t3; // *--p = t2; Dec(pp); pp^ := t2; // *--p = t1; Dec(pp); pp^ := t1; for j := 1 to Rounds-1 do begin // t1 = *Z++; t1 := pz^; Inc(pz); // *--p = *Z++; Dec(pp); pp^ := pz^; Inc(pz); // *--p = t1; Dec(pp); pp^ := t1; // t1 = inv(*Z++); t1 := Inv(pz^); Inc(pz); // t2 = -*Z++; t2 := -pz^; Inc(pz); // t3 = -*Z++; t3 := -pz^; Inc(pz); // *--p = inv(*Z++); Dec(pp); pp^ := Inv(pz^); Inc(pz); // *--p = t2; Dec(pp); pp^ := t2; // *--p = t3; Dec(pp); pp^ := t3; // *--p = t1; Dec(pp); pp^ := t1; end; // t1 = *Z++; t1 := pz^; Inc(pz); // *--p = *Z++; Dec(pp); pp^ := pz^; Inc(pz); // *--p = t1; Dec(pp); pp^ := t1; // t1 = inv(*Z++); t1 := Inv(pz^); Inc(pz); // t2 = -*Z++; t2 := -pz^; Inc(pz); // t3 = -*Z++; t3 := -pz^; Inc(pz); // *--p = inv(*Z++); Dec(pp); pp^ := Inv(pz^); // *--p = t3; Dec(pp); pp^ := t3; // *--p = t2; Dec(pp); pp^ := t2; // *--p = t1; Dec(pp); pp^ := t1; end; {$R+,Q+} //////////////////////////////////////////////////////////////////////////////// procedure CalculateSubKeys; begin ExpandKeys; InvertKeys; end; //////////////////////////////////////////////////////////////////////////////// procedure Initialize(AKey: string); begin FBlockSize := 8; FBufferSize := 2048; FKey := AKey; FKeySize := 32; FillChar(Z, SizeOf(Z), 0); FillChar(K, SizeOf(K), 0); GetMem(FKeyPtr, FKeySize); FillChar(FKeyPtr^, FKeySize, #0); InvolveKey; end; //////////////////////////////////////////////////////////////////////////////// {$R-,Q-} procedure Cipher(var Block: TIDEABlock; const Keys: TIDEAKey); var x1, x2, x3, x4 : Word; t1, t2 : Word; pz : ^Word; r : Integer; //////////////////////////////////////// function Mul(a,b: Word): Word; var p : LongWord; begin if (a &gt; 0) then begin if (b &gt; 0) then begin p := LongWord(a)*b; b := p and $ffff; a := p shr 16; Result := ((b - a) + Ord(b &lt; a)); end else Result := 1 - a; end else Result := 1 - b; end; //////////////////////////////////////// begin // x1 = *in++; x2 = *in++; x1 := Block[1]; x2 := Block[2]; // x3 = *in++; x4 = *in; x3 := Block[3]; x4 := Block[4]; pz := @Keys; for r := 1 to Rounds do begin // MUL(x1,*Z++); x1 := Mul(x1, pz^); Inc(pz); // x2 += *Z++; x2 := x2 + pz^; Inc(pz); // x3 += *Z++; x3 := x3 + pz^; Inc(pz); // MUL(x4, *Z++); x4 := Mul(x4, pz^); Inc(pz); // t2 = x1^x3; t2 := x1 xor x3; // MUL(t2, *Z++); t2 := Mul(t2, pz^); Inc(pz); // t1 = t2 + (x2^x4); t1 := t2 + (x2 xor x4); // MUL(t1, *Z++); t1 := Mul(t1, pz^); Inc(pz); // t2 = t1+t2; t2 := (t1 + t2); // x1 ^= t1; x1 := x1 xor t1; // x4 ^= t2; x4 := x4 xor t2; // t2 ^= x2; t2 := t2 xor x2; // x2 = x3^t1; x2 := x3 xor t1; // x3 = t2; x3 := t2; end; // MUL(x1, *Z++); x1 := Mul(x1, pz^); Inc(pz); // *out++ = x1; Block[1] := x1; // *out++ = x3 + *Z++; Block[2] := x3 + pz^; Inc(pz); // *out++ = x2 + *Z++; Block[3] := x2 + pz^; Inc(pz); // MUL(x4, *Z); x4 := Mul(x4, pz^); // *out = x4; Block[4] := x4; end; {$R+,Q+} //////////////////////////////////////////////////////////////////////////////// function EncipherBlock(var Block): Boolean; begin Cipher(TIDEABlock(Block), Z); Result := TRUE; end; //////////////////////////////////////////////////////////////////////////////// function DecipherBlock(var Block): Boolean; begin Cipher(TIDEABlock(Block), K); Result := TRUE; end; //////////////////////////////////////////////////////////////////////////////// // Главные функции ... function EncryptCopy(DestStream, SourseStream : TStream; Count: Int64; Key : string): Boolean; var Buffer : TIDEABlock; PrCount : Int64; AddCount : Byte; begin Result := True; try if Key = '' then begin DestStream.CopyFrom(SourseStream, Count); Exit; end; Initialize(Key); CalculateSubKeys; PrCount := 0; while Count - PrCount &gt;= 8 do begin SourseStream.Read(Buffer, SizeOf(TIDEABlock)); EncipherBlock(Buffer); DestStream.Write(Buffer, SizeOf(TIDEABlock)); Inc(PrCount, 8); end; AddCount := Count - PrCount; if Count - PrCount &lt;&gt; 0 then begin SourseStream.Read(Buffer, AddCount); DestStream.Write(Buffer, AddCount); end; except Result := False; end; end; //////////////////////////////////////////////////////////////////////////////// function DecryptCopy(DestStream, SourseStream : TStream; Count: Int64; Key : string): Boolean; var Buffer : TIDEABlock; PrCount : Int64; AddCount : Byte; begin Result := True; try if Key = '' then begin DestStream.CopyFrom(SourseStream, Count); Exit; end; Initialize(Key); CalculateSubKeys; PrCount := 0; while Count - PrCount &gt;= 8 do begin SourseStream.Read(Buffer, SizeOf(TIDEABlock)); DecipherBlock(Buffer); DestStream.Write(Buffer, SizeOf(TIDEABlock)); Inc(PrCount, 8); end; AddCount := Count - PrCount; if Count - PrCount &lt;&gt; 0 then begin SourseStream.Read(Buffer, AddCount); DestStream.Write(Buffer, AddCount); end; except Result := False; end; end; //////////////////////////////////////////////////////////////////////////////// function EncryptStream(DataStream: TStream; Count: Int64; Key: string): Boolean; var Buffer : TIDEABlock; PrCount : Int64; AddCount : Byte; begin Result := True; try if Key = '' then begin DataStream.Seek(Count, soFromCurrent); Exit; end; Initialize(Key); CalculateSubKeys; PrCount := 0; while Count - PrCount &gt;= 8 do begin DataStream.Read(Buffer, SizeOf(TIDEABlock)); EncipherBlock(Buffer); DataStream.Seek(-SizeOf(TIDEABlock), soFromCurrent); DataStream.Write(Buffer, SizeOf(TIDEABlock)); Inc(PrCount, 8); end; except Result := False; end; end; //////////////////////////////////////////////////////////////////////////////// function DecryptStream(DataStream: TStream; Count: Int64; Key: string): Boolean; var Buffer : TIDEABlock; PrCount : Int64; begin Result := True; try if Key = '' then begin DataStream.Seek(Count, soFromCurrent); Exit; end; Initialize(Key); CalculateSubKeys; PrCount := 0; while Count - PrCount &gt;= 8 do begin DataStream.Read(Buffer, SizeOf(TIDEABlock)); DecipherBlock(Buffer); DataStream.Seek(-SizeOf(TIDEABlock), soFromCurrent); DataStream.Write(Buffer, SizeOf(TIDEABlock)); Inc(PrCount, 8); end; except Result := False; end; end; // Завершение главных функций ... //////////////////////////////////////////////////////////////////////////////// end.
TEA:
unit ucrypt; interface type TEAKey = array[0..3] of cardinal; //Use 64-bit aligned data size (8,16...) or else some data will be left unencrypted! procedure TEA_Encode(Input, Output: pointer; size: integer; key: TEAKey); procedure TEA_Decode(Input, Output: pointer; size: integer; key: TEAKey); implementation type TEAData = array[0..1] of cardinal; PTEAKey = ^TEAKey; PTEAData = ^TEAData; procedure TEA_Cipher(v: PTEAData; var w: PTEAData; k: PTEAKey); var y, z, sum, delta, n: Cardinal; begin y := (v)[0]; z := (v)[1]; sum := 0; delta := $9E3779B9; n := 32; while (n &gt; 0) do begin inc(y, (z shl 4 xor z shr 5) + z xor sum + (k)[sum and 3]); inc(sum, delta); inc(z, (y shl 4 xor y shr 5) + y xor sum + (k)[sum shr 11 and 3]); dec(n); end; (w)[0] := y; (w)[1] := z; end; procedure TEA_DeCipher(v: PTEAData; var w: PTEAData; k: PTEAKey); var y, z, sum, delta, n: Cardinal; begin y := v[0]; z := v[1]; sum := $0C6EF3720; delta := $9E3779B9; n := 32; while (n &gt; 0) do begin dec(z, (y shl 4 xor y shr 5) + y xor sum + k[sum shr 11 and 3]); dec(sum, delta); dec(y, (z shl 4 xor z shr 5) + z xor sum + k[sum and 3]); dec(n); end; w[0] := y; w[1] := z; end; procedure TEA_EnDec(encode: boolean; Input, Output: pointer; size: integer; key: TEAKey); var DataIn, DataOut: TEAData; DOut: PTEAData; i, sz: integer; begin DOut := @DataOut; sz := (size shr 3) shl 3; i := 0; repeat DataIn[0] := Cardinal((pointer(Cardinal(Input) + Cardinal(i)))^); DataIn[1] := Cardinal((pointer(Cardinal(Input) + Cardinal(i + 4)))^); if encode then TEA_Cipher(@DataIn, DOut, @key) else TEA_DECipher(@DataIn, DOut, @key); Cardinal(pointer(Cardinal(Output) + Cardinal(i))^) := DataOut[0]; Cardinal(pointer(Cardinal(Output) + Cardinal(i + 4))^) := DataOut[1]; inc(i, 8); until i &gt;= sz; end; procedure TEA_Encode(Input, Output: pointer; size: integer; key: TEAKey); begin TEA_EnDec(true, Input, Output, size, key); end; procedure TEA_Decode(Input, Output: pointer; size: integer; key: TEAKey); begin TEA_EnDec(false, Input, Output, size, key); end; end.
Post #: 6
RE: Криптография внешних файлов средствами Delphi7 - 2007-03-31 14:29:43.126666   
XIO

Сообщений: 45
Оценки: 0
Присоединился: 2005-04-05 06:02:19
Мощно!!! Мощно!!!…. Я про некоторые толкования…
В общем то да, действительно не учёл я такой вариант, как открыть БД в момент работы программы…. Сплохил)
В общем спасибо большое за то выложенные исходники. Обязательно попытаюсь в них разобраться, и внедрить в свою программу.
Ну если не выйдет то и так сойдёт для beta версии. А там подумаю, если будет время попытаюсь что нить своё придумать, если нет, то и …)
Благодарен всем, за предоставленый "F1" :)
Post #: 7
Страниц:  [1]
Все форумы >> [Компилируемые языки] >> Криптография внешних файлов средствами Delphi7







Связаться:
Вопросы по сайту / xakep@glc.ru

Предупреждение: использование полученных знаний в противозаконных целях преследуется по закону.