Криптография внешних файлов средствами Delphi7
Пользователи, просматривающие топик: none
|
Зашли как: Guest
|
Имя |
Сообщение |
<< Старые топики Новые топики >> |
|
|
Криптография внешних файлов средствами Delphi7 - 2007-03-28 18:01:06.643333
|
|
|
XIO
Сообщений: 45
Оценки: 0
Присоединился: 2005-04-05 06:02:19
|
Люди, кто сталкивался или просто знает как можно зашифровать файл? Средствами Delphi. В общем имеется база данных *.mdb, нужно что бы лишь в момент когда работает программа она была в нормальном состоянии, когда же программа завершает работу с ней, база должна криптоваться, для того что бы пользователь не мог открыть её через Access и поменять значения. Мне советовали поискать CryptoAPI, перерыл много сайтов, прочитал кое какую информацию, и либо я всего этого не понимаю, либо понимаю что это не для моей программы. Есть ли какое то другое решение? Какой нить модуль для дельфи? Или вы подскажите как реализовать, какими методами пользоватся? По идее? шифр я смогу реализовать если узнаю каким образом организовать копирование файла по битам, при этом имея возможность менять значения каких-либо битов. Оригинал затем удаляется? остается "испорченный" файл. При открытии востанавливаем прежние значения подменяных битов, и файл принимает нормальное состояние.8| Как все это сделать? Ну или может у кого-то есть готовые решения, буду очень рад и благодарен :)
|
|
|
RE: Криптография внешних файлов средствами Delphi7 - 2007-03-28 18:46:58.336666
|
|
|
alexbozhko
Сообщений: 1024
Оценки: 0
Присоединился: 2005-11-24 13:35:34
|
Сейчас ждем мнения Технологиста, но от себя скажу. Можно реализовать любой из тысяч известных алгоритмов шифрования самому. Но на torry.net можно найти прекрасные бесплатные реализации с открытым кодом. Я использовал одну из библиотек, чуть позже скажу навание (сейчас не помню) Но может имеются более простые варианты решения задачи вцелом? Использовать пароль Аксеса? Вставлять его при коннекте? Или как-то так
|
|
|
RE: Криптография внешних файлов средствами Delphi7 - 2007-03-29 09:02:18.560000
|
|
|
XIO
Сообщений: 45
Оценки: 0
Присоединился: 2005-04-05 06:02:19
|
quote:
ORIGINAL: alexbozhko Сейчас ждем мнения Технологиста, но от себя скажу. Можно реализовать любой из тысяч известных алгоритмов шифрования самому. Но на torry.net можно найти прекрасные бесплатные реализации с открытым кодом. Я использовал одну из библиотек, чуть позже скажу навание (сейчас не помню) Но может имеются более простые варианты решения задачи вцелом? Использовать пароль Аксеса? Вставлять его при коннекте? Или как-то так Ясненько. Буду очень рад, получить название реализации. Ну что же касается реализации с использованием пароля в Access, то боюсь программисты могу его взломать или подобрать, и тем самым безопасность будет минимальной, просто программа по умолчанию предназначена для программстов-почасовиков, и в базе храница количество отработанных часов. С другой стороны программа является дипломным проектом, но тем не менее будет использоваться на реальном предприятии, и хотелось бы сделать все качественно. Спасибо за помощь, попоже ещё загляну )
|
|
|
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 Спасибо за помощь, попоже ещё загляну ) Пожалуйста ;)
|
|
|
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 Похоже Технологист волынит :( А может случилось чего?
|
|
|
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) <> 0) do
begin
TempKey := TempKey + TempKey[i];
Inc(i);
end;
i := 1;
j := 0;
while (i < 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 >= BlockSize do
begin
SourseStream.Read(Buffer, BlockSize);
EncipherBlock(Buffer);
DestStream.Write(Buffer, BlockSize);
Inc(PrCount, BlockSize);
end;
AddCount := Count - PrCount;
if Count - PrCount <> 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 >= BlockSize do
begin
SourseStream.Read(Buffer, BlockSize);
DecipherBlock(Buffer);
DestStream.Write(Buffer, BlockSize);
Inc(PrCount, BlockSize);
end;
AddCount := Count - PrCount;
if Count - PrCount <> 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 >= 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 >= 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) <> 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 < 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 < 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 > 0) then
begin
if (b > 0) then
begin
p := LongWord(a)*b;
b := p and $ffff;
a := p shr 16;
Result := ((b - a) + Ord(b < 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 >= 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 <> 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 >= 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 <> 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 >= 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 >= 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 > 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 > 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 >= 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.
|
|
|
RE: Криптография внешних файлов средствами Delphi7 - 2007-03-31 14:29:43.126666
|
|
|
XIO
Сообщений: 45
Оценки: 0
Присоединился: 2005-04-05 06:02:19
|
Мощно!!! Мощно!!!…. Я про некоторые толкования… В общем то да, действительно не учёл я такой вариант, как открыть БД в момент работы программы…. Сплохил) В общем спасибо большое за то выложенные исходники. Обязательно попытаюсь в них разобраться, и внедрить в свою программу. Ну если не выйдет то и так сойдёт для beta версии. А там подумаю, если будет время попытаюсь что нить своё придумать, если нет, то и …) Благодарен всем, за предоставленый "F1" :)
|
|
|
|
|