![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Копирование с шифрованием
RustB © (2008-10-02 00:08:00)Нужна по возможности быстрая функция которая копировала и попутно зашифровывала бы файл, требования к алгоритму шифрования самые минимальные. Если кто сталкивался с подобным подскажите пожалуйсто.
TStas (2008-10-02 21:47:00) [21]Вот чем я пользуюсь. Дёшево и сердито:
{Ïðîöåäóðà êñîðíîãî øèôðîâàíèÿ/äåøèôðîâàíèÿ ïîòîêà. Src - èñõîäíûé ïîòîê,
Dest - ðåçóëüòèðóþùè 233;, Key - ïîòîê-êëþ÷}
Procedure XorCodeStream(Src, Dest, Key: TStream);
var
b1, b2, b3: Byte;
I, SrcLn, KeyLn, n, m: Integer;
Begin
m := src.Seek(0, soFromCurrent); //Çàïîìíèë ïîëîæåíèå óêàçàòåëÿ ïîòîêà
SrcLn := src.Seek(0, soFromEnd); //Ïîëó÷èë äëèííó ïîòîêà
src.Seek(m, soFromBeginning); //Âåðíóë óêàçàòåëü â çàä
KeyLn := Key.Seek(0, soFromEnd); //Ïîëó÷èë äëèííó ïîòîêà
Key.Seek(0, soFromBeginning); //Âåðíóë óêàçàòåëü â çàä
For i := 1 to SrcLn do //Öèêë ïî âñåìó èñõîäíîìó ïîòîêó
Begin
N := Src.Read(b1, 1); //Ïðî÷¸ë îäèí áàéò èç èñõîäíîãî
n := n mod KeyLn; //Ïîëó÷èë, êàêîé áàéò ÷èòàòü èç êëþ÷à
Key.Seek(n, soFromBeginning); //Íàø¸ë ýòîò áàéò
Key.Read(b2, 1); //Ïðî÷¸ë áàéò
b3 := b1 xor b2; //Îòêñîðèë èñõîäíûé áàéò
Dest.Write(b3, 1); //È çàïèñàë â ãîòîâûé ïîòîê
End;
End;
ПЗ (2008-10-02 21:17:00) [22]Не знаю, что понимается под копированием, но выше готовая консольная утилита для шифрования\расшифрования файла. На фходе - шифрованный, на выходе - расшифрованный, и наоборот. Поддерживает несколько режимов. Года три назад писал...
ПЗ (2008-10-02 21:15:00) [23]//Шифрование файла в режиме простой замены (р-р д.б. кратен 64 бит)
procedure SimpleEncrypt(var f1,f2:file);
var Block:Int64;
c:Integer;
begin
while not eof(f1) do
begin
Block:=0;
BlockRead(f1,Block,Sizeof(Block),c);//Получение блока данных
EncryptBase(Block); //Шифрование
BlockWrite(f2,Block,8); //Запись (строго 64бит!)
end;
end;
//Расфрование файла в режиме простой замены (р-р д.б. кратен 64 бит)
procedure SimpleDecrypt(var f1,f2:file);
var Block:Int64;
c:Integer;
begin
while not eof(f1) do
begin
Block:=0;
BlockRead(f1,Block,Sizeof(Block),c);//Получение блока данных
DecryptBase(Block); //Расшифрование
BlockWrite(f2,Block,8); //Запись (строго 64бит!)
end;
end;
//Шифрование файла в режиме гаммирования
procedure GammingEncrypt(var f1,f2:file; S:Int64);
var Block:Int64;
S0,S1:LongWord;
c:Integer;
begin
EncryptBase(S); //Зашифровка синхропосылки
S0:=S; //Младшая часть синхропосылки
S1:=S shr 32; //Старшая часть синхропосылки
while not eof(f1) do
begin
BlockRead(f1,Block,Sizeof(Block),c); //Получение блока данных
S0:=(S0+C1)mod two32;
S1:=((S1+C2-1)mod (two32-1))+1;
S:=S1;
S:=(S shl 32)or S0;
EncryptBase(S); //Зашифрование
Block:=Block xor S;
BlockWrite(f2,Block,c); //Запись блока данных
end;
end;
//Расшифрование файла в режиме гаммирования (аналогично)
procedure GammingDecrypt(var f1,f2:file; S:Int64);
begin
GammingEncrypt(f1,f2,S);
end;
//Шифрование файла в режиме гаммирования с обратной связью
procedure FeedbackGammingEncrypt(var f1,f2:file; S:Int64);
var Block:Int64;
c:Integer;
begin
while not eof(f1) do
begin
BlockRead(f1,Block,Sizeof(Block),c); //Получение блока данных
EncryptBase(S); //Зашифровка синхропосылки
Block:=Block xor S;
S:=Block;
BlockWrite(f2,Block,c); //Запись блока данных
end;
end;
//Расшифрование файла в режиме гаммирования с обратной связью
procedure FeedbackGammingDecrypt(var f1,f2:file; S:Int64);
var Block,NewBlock:Int64;
c:Integer;
begin
while not eof(f1) do
begin
BlockRead(f1,Block,Sizeof(Block),c); //Получение блока данных
EnCryptBase(S); //Зашифровка синхропосылки
NewBlock:=Block xor S;
S:=Block; //Синхропосылка формируется из ЗАШИФРОВАННЫХ данных
BlockWrite(f2,NewBlock,c); //Запись блока данных
end;
end;
//Вычисление имитовставки файла
function ImitoInjection(var f:File):int64;
var Pos:Longint;
S,Block:Int64;
c:Integer;
begin
Pos:=FilePos(f); //Вычисление текущей позиции
Seek(F,0);
S:=0;
while not eof(f) do
begin
BlockRead(f,Block,Sizeof(Block),c);
S:=Block xor S;
ImitoBase(S); //Базовый цикл выработки имитовставки
end;
Seek(F,Pos); //Возврат позиции в файле
Result:=S;
end;
procedure Err(msg:String);
begin
WriteLn(msg);
WriteLn(helpStr);
try
CloseFile(f1);
CloseFile(f2);
except
end;
Halt;
end;
begin
if (ParamCount<2) then Err('');
src:=ParamStr(1); if not FileExists(src) then src:='';
dst:=ParamStr(2);
if UpperCase(ParamStr(3))='-E' then task:=1 else
if UpperCase(ParamStr(3))='-D' then task:=2;
if UpperCase(ParamStr(4))='-S' then mode:=1 else
if UpperCase(ParamStr(4))='-G' then mode:=2 else
if UpperCase(ParamStr(4))='-F' then mode:=3;
if UpperCase(ParamStr(5))='-I' then imito:=True;
if (src='')or(dst='') then Err('source or destination file expected');
WriteLn('NTF.EXE v.1.1');
WriteLn('Source file:',src);
WriteLn('Destination file:',dst);
WriteLn('Enter key (8 numbers):');
try //Ввод ключа
for j:=0 to 7 do
begin
Write('#',j+1,' :');
ReadLn(K[j]);
end;
except //Введено неверное число (или буква)
Err('Invalid number');
end;
AssignFile(f1,src);
Reset(f1,1);
AssignFile(f2,dst);
Rewrite(f2,1);
if (task<1)or(task>2) then Err('Incorrect task (crypt\decrypt)') else
if task=1 then //Шифрование файла
begin
if (mode<1)or(mode>3) then Err('Incorrect crypting mode');
WriteLn('Encoding....');
if imito then //Запись имитовставки
begin
I:=ImitoInjection(f1); //Вычисление имитовставки незашифрованного файла
BlockWrite(f2,I,8);
WriteLn('Imito injection written:',I);
end;
if mode=1 then SimpleEncrypt(f1,f2) else
if mode=2 then GammingEncrypt(f1,f2,S) else
if mode=3 then FeedBackGammingEncrypt(f1,f2,S);
end else
if task=2 then
begin
if (mode<1)or(mode>3) then Err('Incorrect crypting mode');
WriteLn('Decoding....');
if imito then BlockRead(f1,I,8);//Чтение имитовставки
if mode=1 then SimpleDecrypt(f1,f2) else
if mode=2 then GammingDecrypt(f1,f2,S) else
if mode=3 then FeedBackGammingDecrypt(f1,f2,S);
if imito then //Сравнение имитовставки
begin
//Вычисление имитовставки расшифрованного файла
if I=ImitoInjection(f2) then WriteLn('Imito check OK ',I) else WriteLn('Imito check FAILED ',I);
end;
end;
WriteLn(FileSize(f2),' bytes processed');
CloseFile(f1);
CloseFile(f2);
end.
ПЗ (2008-10-02 21:15:00) [24]program Project1;
{$APPTYPE CONSOLE}
uses
SysUtils;
const
two32=4294967296; //2^32
C1=$1010104;
C2=$1010101;
S=7476199048732314356; //Синхропосылка
helpStr='Usage:<sourcefile> <dstfile> [-E|-D] [-S|-G|-F] [-I]'#13#10+
'-E -encrypt srcfile to dstfile'#13#10+
'-D -decrypt srcfile to dstfile'#13#10+
'-S -simple mode (8 bit aligned data)'#13#10+
'-G -gamma mode'#13#10+
'-F -gamma with feedback mode'#13#10+
'-I -data safety mode (imito injection)';
var K:array [0..7] of LongWord=(0,1,2,3,4,5,6,7); //Ключ
H:array[0..7,0..15] of Byte=
((4,10,9,2,13,8,0,14,6,11,1,12,7,15,5,3),
(14,11,4,12,6,13,15,10,2,3,8,1,0,7,5,9),
(5,8,1,13,10,3,4,2,14,15,12,7,6,0,9,11),
(7,13,10,1,0,8,9,15,14,4,6,12,11,2,5,3),
(6,12,7,1,5,15,13,8,4,10,9,14,0,3,11,2),
(4,11,10,0,7,2,1,13,3,6,8,5,9,12,15,14),
(13,11,4,1,3,15,5,9,0,10,14,7,6,8,2,12),
(1,15,13,0,5,7,10,4,9,2,3,14,6,11,8,12)); //Таблица замен
src,dst:String;
task:Byte=0;
mode:Byte=0;
imito:Boolean=false;
f1,f2:File;
j:Byte;
I:Int64;
function DecToBin(K:Int64;Bits:Byte):String;
var i:Integer;
begin
Result:='';
for i:=1 to 64 do
begin
if i>Bits then Break;
if (K mod 2)=0 then Result:='0'+Result else Result:='1'+Result;
K:=K div 2;
end;
end;
//Циклический сдвиг влево
function ROL(val: LongWord; shift: Byte): LongWord;
asm
mov cl, dl;
rol eax, cl;
end;
//Основной шаг криптопреобразования
procedure CryptoStep(var N:Int64; X:LongWord);
var S,Sh,N1,N2:LongWord;
i,Si:Byte;
begin
N1:=N; //Младшая часть блок данных
N2:=N shr 32; //Старшая часть блок данных
Sh:=0;
S:=(N1+X)mod two32;
for i:=0 to 7 do
begin
Si:=((S shr (i*4)) and 15); //Выделяем тетрады S для замены
Sh:=Sh or H[i,Si] shl (i*4);//Замена тетрады и образование нового S
end;
S:=Rol(Sh,11); //Сдвиг
S:=S xor N2;
N:=N1;
N:=(N shl 32) or S; //Обмен местами частей блока
end;
//Базовый шаг шифрования
procedure EncryptBase(var N:Int64);
var i,j:Byte;
N1:LongWord;
begin
for i:=0 to 31 do //32 шага криптопреобразования
begin //01234567012345670123456776543210
if i<24 then j:=i mod 8 else j:=31-i;
CryptoStep(N,K[j]);
end;
N1:=N shr 32; //Обмен частей блока данных
N:=(N shl 32) or N1;
end;
//Базовый шаг расшифрования
procedure DecryptBase(var N:Int64);
var i,j:Byte;
N1:LongWord;
begin
for i:=0 to 31 do //32 шага криптопреобразования
begin //01234567765432107654321076543210
if i<8 then j:=i else j:=(31-i) mod 8;
CryptoStep(N,K[j]);
end;
N1:=N shr 32; //Обмен частей блока данных
N:=(N shl 32) or N1;
end;
//Базовый шаг выработки имитовставки
procedure ImitoBase(var N:Int64);
var i:Byte;
begin
for i:=0 to 15 do //16 шагов криптопреобразования
CryptoStep(N,K[i mod 8]);
end;
@!!ex (2008-10-02 20:00:00) [25]Насколько я могу судить по коду - это тупо массив байтов...
Поросенок Винни-Пух (2008-10-02 18:55:00) [26]Key[2] := ....
так что такое TWordTripple?
RustB (2008-10-02 18:45:00) [27]TWordTriple что за тип? Или нужно еще чтото дописать в раздел uses?
blackman (2008-10-02 17:39:00) [28]function MemoryEncrypt(Src: Pointer; SrcSize: Cardinal; Target: Pointer; TargetSize: Cardinal; Key: TWordTriple): boolean;
var
pIn, pOut: ^byte;
i : Cardinal;
begin
if SrcSize = TargetSize then
begin
pIn := Src;
pOut := Target;
for i := 1 to SrcSize do
begin
pOut^ := pIn^ xor (Key[2] shr 8);
Key[2] := Byte(pIn^ + Key[2]) * Key[0] + Key[1];
inc(pIn);
inc(pOut);
end;
Result := True;
end else
Result := False;
end;
function MemoryDecrypt(Src: Pointer; SrcSize: Cardinal; Target: Pointer; TargetSize: Cardinal; Key: TWordTriple): boolean;
var
pIn, pOut: ^byte;
i : Cardinal;
begin
if SrcSize = TargetSize then
begin
pIn := Src;
pOut := Target;
for i := 1 to SrcSize do
begin
pOut^ := pIn^ xor (Key[2] shr 8);
Key[2] := byte(pOut^ + Key[2]) * Key[0] + Key[1];
inc(pIn);
inc(pOut);
end;
Result := True;
end else
Result := False;
end;
function TextCrypt(const s: string; Key: TWordTriple; Encrypt: Boolean): string;
var
bOK: Boolean;
begin
SetLength(Result, Length(s));
if Encrypt then
bOK := MemoryEncrypt(PChar(s), Length(s), PChar(Result), Length(Result), Key)
else
bOK := MemoryDecrypt(PChar(s), Length(s), PChar(Result), Length(Result), Key);
if not bOK then Result := '';
end;
@!!ex (2008-10-02 10:28:00) [29]> [5] RustB (02.10.08 10:10)
ну и в чем проблема?
RustB (2008-10-02 10:10:00) [30]шифруются файлы до 1 Mb.
Как вариант
function FileCrypt(InFile, OutFile: String; Key: TWordTriple; Encrypt: Boolean): boolean;
var
MIn, MOut: TMemoryStream;
begin
MIn := TMemoryStream.Create;
MOut := TMemoryStream.Create;
Try
MIn.LoadFromFile(InFile);
MOut.SetSize(MIn.Size);
if Encrypt then
Result := MemoryEncrypt(MIn.Memory, MIn.Size, MOut.Memory, MOut.Size, Key)
else
Result := MemoryDecrypt(MIn.Memory, MIn.Size, MOut.Memory, MOut.Size, Key);
MOut.SaveToFile(OutFile);
finally
MOut.Free;
MIn.Free;
end;
end;
толко нужна еще сюда функция для шифрования памяти MemoryEncrypt ну и MemoryDecrypt разумеется
@!!ex (2008-10-02 09:55:00) [31]xor, что тут думать... самая быстрая операция.
делаешь башой ключ. шифруеш его RSA и все.
Jeer (2008-10-02 09:36:00) [32]
> попутно зашифровывала
Таблица подстановок ( побайтная ) - как вариант.
Anatoly Podgoretsky (2008-10-02 07:48:00) [33]> RustB (02.10.2008 0:08:00) [0]
Если минимальные, то XOR, если максимальные, то тоже XOR, но с ключом L>M
Германн (2008-10-02 01:42:00) [34]
> Нужна по возможности быстрая функция которая копировала
> и попутно зашифровывала бы файл, требования к алгоритму
> шифрования самые минимальные.
А какие требования к файлу?
По-моему это уже третий за год подобный вопрос.