Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Копирование с шифрованием


Страницы:   1 2

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]


> Нужна по возможности быстрая функция которая копировала
> и попутно зашифровывала бы файл, требования к алгоритму
> шифрования самые минимальные.

А какие требования к файлу?
По-моему это уже третий за год подобный вопрос.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо