Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.12.14;
Скачать: CL | DM;

Вниз

Алгоритм Blowfish   Найти похожие ветки 

 
TRSteep ©   (2008-11-05 19:55) [0]

доброе время суток. у меня назрел один вопрос по программе :)

Реализую алгоритм Blowfish.
Шифрование производится по 8 символов (64 бита)
сначала шифровал только 8 и меньше затем в цикле сделал поддержку и большего количества (заношу результирующий цифровой код в массив)

Дешифровка тоже должна производится по 8 символов, НО дешифруется только последний блок.

Пытаюсь понять почему.... в отладке когда отслеживал массив rMassiv почему сразу полузабит значениями... ничего не понимаю.....

Можете помочь найти ошибку в коде?
код прилагаю

Пытался

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 st = array [1..4,0..255]of cardinal;
 pt = array [1..18] of cardinal;
 TForm1 = class(TForm)
   EditKey: TEdit;
   EditCryptText: TEdit;
   Btn_Crypt: TButton;
   Btn_Decrypt: TButton;
   MemoMessage: TMemo;
   procedure Btn_CryptClick(Sender: TObject);
   procedure Btn_DecryptClick(Sender: TObject);
   

 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 s:st;
 p:pt;
 l,r: cardinal;
 rMassiv: array[0..100] of cardinal;
 iMassiv: array[0..100] of cardinal;
 Count: integer;

implementation

{$R *.dfm}

function f(l:cardinal):cardinal;
var
 a,b,c,d:byte;
begin
 d:=l;
 c:=l shr 8;
 b:=l shr 16;
 a:=l shr 24;
 f:=((s[1,a]+s[2,b])xor s[3,c])+ s[4,d];
end;

procedure  code (var l,r :cardinal);
var
 i: byte;
 b:cardinal;

begin
 for i:=1 to 16 do
   begin
     l:=l xor p[i];
     r:= f(l) xor r;
     b:=l;
     l:=r;
     r:=b;
   end;
   b:=l;
   l:=r;
   r:=b;
   r:=r xor p[17];
   l:=l xor p[18];
end;

procedure TForm1.Btn_CryptClick(Sender: TObject);
var
 i,j: byte;
 k:cardinal;
 str, st, CryptText:string;
 f1: textfile;
 ilen: integer;
 goback: boolean;
 label Check;
begin
 // Crypt Key
 st:=EditKey.Text;

 k:= (ord(st[1])shl 24) + (ord(st[2])shl 16) + (ord(st[3])shl 8)+ ord(st[4]);

 s:=cs;
 p:=cp;

 for i:=1 to 18 do
   p[i]:=p[i]xor k;

 r:=0;
 l:=0;

 for i:=1 to 18 do
   begin
     code(l,r);
     p[2*i-1]:= l;
     p[2*i]:= r;
   end;

 for i:=1 to 4 do
   for j:=0 to 127 do
     begin
       code (l,r);
       s[i,2*j]:=l;
       s[i,2*j+1]:=r;
     end;

 // Options
 MemoMessage.Lines.Clear;
 Btn_Decrypt.Enabled:=true;
 Btn_Crypt.Enabled:=false;
 MemoMessage.Lines.Append("Зашифрованно");

 CryptText := "";
 Count := 0;
 str:=EditCryptText.Text;

 //check 8?
 Check:

 inc(Count); //Количество итерации по 8

 ILen := length(str);
 if ILen>8 then
 begin
   st := copy(str, 1, 8);
   delete(str, 1, 8);
   GoBack := true;
 end
 else
 begin
   st := str;
   GoBack := false;
 end;

 //Crypt 8 sym

 l:= (ord(st[1])shl 24) + (ord(st[2])shl 16) + (ord(st[3])shl 8)+ ord(st[4]);
 r:= (ord(st[5])shl 24) + (ord(st[6])shl 16) + (ord(st[7])shl 8)+ ord(st[8]);
{ form1.Label1.Caption:=chr(l shr 24) + chr(l shr 16)+chr(l shr 8)+chr(l)+
                       chr(r shr 24) + chr(r shr 16)+chr(r shr 8)+chr(r)  }
 code (l,r);

 iMassiv[Count-1] := l;
 rMassiv[Count-1] := r;

 //addcryptText
 CryptText := CryptText + chr(l shr 24) + chr(l shr 16)+chr(l shr 8)+chr(l)+
                       chr(r shr 24) + chr(r shr 16)+chr(r shr 8)+chr(r);

 if GoBack = true then goto Check; //repeat Crypt

 MemoMessage.Lines.Append(CryptText);

 Btn_Crypt.Default := false;
 Btn_Decrypt.Default := true;
end;

procedure TForm1.Btn_DecryptClick(Sender: TObject);
var
 i, k: byte;
 b:cardinal;
 UnCryptText: string;
begin
 UnCryptText := "";
 MemoMessage.Lines.Clear;
 Btn_Decrypt.Enabled:=false;
 Btn_Crypt.Enabled:=true;
 MemoMessage.Lines.Append("Расшифрованно");

 for k := Count-1 downto 0 do
 begin
   l := iMassiv[Count-1];
   r := rMassiv[Count-1];

   for i:=18 downto 3 do
   begin
     l:=l xor p[i];
     r:= f(l) xor r;
     b:=l;
     l:=r;
     r:=b;
   end;

   b:=l;
   l:=r;
   r:=b;
   r:=r xor p[2];
   l:=l xor p[1];

   UnCryptText := UnCryptText + chr(l shr 24) + chr(l shr 16)+chr(l shr 8)+chr(l)+
                                 chr(r shr 24) + chr(r shr 16)+chr(r shr 8)+chr(r);
 end;

 MemoMessage.Lines.Append(UnCryptText );

 Btn_DeCrypt.Default := false;
 Btn_crypt.Default := true;
end;

end.


 
TRSteep ©   (2008-11-05 19:57) [1]

константы не влезают в сообщение....
может они и лезут в память....


 
Slym ©   (2008-11-06 05:10) [2]

1.var
s:st;
p:pt;
l,r: cardinal;
rMassiv: array[0..100] of cardinal;
iMassiv: array[0..100] of cardinal;
Count: integer;

Если Delphi все свои переменные в глобальные переведет у тебя фантазии нехватит чтоб придумать уникальное осмысленное имя
2.
st:=EditKey.Text;
k:= (ord(st[1])shl 24)+...+ ord(st[4]);

нет проверки Length(st)<4
3.
d:=l;
c:=l shr 8;
b:=l shr 16;
a:=l shr 24;

оно тебе надо постоянно?

TKey=packed record
   case boolean of
     false: (All:cardinal);
     true:  (a,b,c,d:byte);
 end;

4.if GoBack = true then goto Check;
%( каслом машу не испортишь, но это дурной тон


 
Slym ©   (2008-11-06 05:48) [3]

for i:=1 to 18 do
  p[i]:=p[i]xor k;

а тут что делаешь? в p[i] мусор? т.к. объявления cp я не нашел :)
один черт ты ниже затираешь нашифрованное
for i:=1 to 18 do
  begin
    code(l,r);
    p[2*i-1]:= l;
    p[2*i]:= r;
  end;

сам придумал?
pt = array [1..18] of cardinal; так?
так какого i ты делаешь p[2*18-1]? p[35]
(ord(st[1])shl 24) + (ord(st[2])shl 16) + (ord(st[3])shl 8)+ ord(st[4]);
мать мая женщина... проще никак?


 
TRSteep ©   (2008-11-06 07:15) [4]

я же говорю констаты в сообщение не влезает...
это заранее генерированные таблицы, которые не изменяются на протяжении всего алгоритма

const
cs: st = ((
$d1310ba6, $98dfb5ac, $2ffd72db, $d01adfb7, $b8e1afed, $6a267e96,
$ba7c9045, $f12c7f99, $24a19947, $b3916cf7, $0801f2e2, $858efc16,
$636920d8, $71574e69, $a458fea3, $f4933d7e, $0d95748f, $728eb658,
$718bcd58, $82154aee, $7b54a41d и тд... 4 блока по 256...

cp : pt = (
$243f6a88, $85a308d3, $13198a2e, $03707344, $a4093822, $299f31d0,
$082efa98, $ec4e6c89, $452821e6, $38d01377, $be5466cf, $34e90c6c,
$c0ac29b7, $c97c50dd, $3f84d5b5, $b5470917, $9216d5d9, $8979fb1b);


> Если Delphi все свои переменные в глобальные переведет у
> тебя фантазии нехватит чтоб придумать уникальное осмысленное
> имя

не понял...


> goto

знаю что несоветовали - просто уже не до дурных тонов-  нужно реализовывать любыми средствами.


> TKey=packed record
>   case boolean of
>     false: (All:cardinal);
>     true:  (a,b,c,d:byte);
> end;

Не понял этой конструкции....


> p[i]:=p[i]xor k;

массив констант ксорим с ключем...

> один черт ты ниже затираешь нашифрованное

code(l,r); здесь в процедуре мы его используем....


> так какого i ты делаешь p[2*18-1]? p[35]

i же меняется....


> (ord(st[1])shl 24) + (ord(st[2])shl 16) + (ord(st[3])shl
> 8)+ ord(st[4]);

Как показали так и делаем :)


 
Slym ©   (2008-11-06 07:18) [5]

TRSteep ©   (06.11.08 7:15) [4]
> так какого i ты делаешь p[2*18-1]? p[35]

i же меняется....

в диапазоне 1-18... потом индекс удваивается p[2*i-1] и при максимальном значении i=18 получаем доступ к 35 элементу (array [1..18]) сечеш?


 
Slym ©   (2008-11-06 07:53) [6]

TRSteep ©   (06.11.08 7:15) [4]
> Если Delphi все свои переменные в глобальные переведет у
> тебя фантазии нехватит чтоб придумать уникальное осмысленное
> имя

не понял...

поймеш когда в начале юнита имена будут иметь такой характер
l,r: cardinal;
l1,r1,l2,r2,...,l99,r99: cardinal;
Count: integer;
CountProcCode2: integer;
i,j:integer;
i_для_процедуры_Btn_CryptClick_для_второго_цикла:integer;

где инициализация ключа в декрипторе?


 
Riply ©   (2008-11-06 08:01) [7]

> [6] Slym ©   (06.11.08 07:53)
> i_для_процедуры_Btn_CryptClick_для_второго_цикла:integer;

:)


 
TRSteep ©   (2008-11-06 14:10) [8]

код трансливался из явы...
http://www.javable.com/columns/crypto/algorythms/01/


 
Jeer ©   (2008-11-06 17:28) [9]


> TRSteep ©   (05.11.08 19:55)
>
> доброе время суток. у меня назрел один вопрос по программе
> :)
>
> Реализую алгоритм Blowfish.


Погляди на реализацию Blowfish..

Code Author:  Greg Carter, gregc@cryptocard.com
Organization: CRYPTOCard Corporation, info@cryptocard.com, http://www.cryptocard.com
R&D Division, Carleton Place, ON, CANADA, K7C 3T2
1-613-253-3152 Voice, 1-613-253-4685 Fax.
Date of V.1:  Jan. 3 1996.

http://www.delphipages.com/news/detaildocs.cfm?ID=20

"Рано или поздно все мы меняемся" (С)


 
Slym ©   (2008-11-07 06:34) [10]

TRSteep ©   (06.11.08 14:10) [8]
код трансливался из явы...

код транслировался с твоей трансляции :)

type
 TPArray = array[1..18] of cardinal;
 TSBox   = array[0..3, 0..255] of cardinal;
 PBlock  =^TBlock;
 TBlock  = array[0..1] of cardinal;

 TBlowFishContext=record
   PArray:TPArray;
   SBox:TSBox;
 end;

procedure InitBlowFish(const Key:string;var Context:TBlowFishContext);
procedure EncryptBlowFish(Data:PBlock;const Context:TBlowFishContext);
procedure DecryptBlowFish(Data:PBlock;const Context:TBlowFishContext);

function StrEncryptBlowFish(const Data:string;const Context:TBlowFishContext):string;
function StrDecryptBlowFish(const Data:string;const Context:TBlowFishContext):string;

implementation

const
 InitialPArray:TPArray=(...
 InitialSBox:TSBox=(...

procedure EncryptBlowFish(Data:PBlock;const Context:TBlowFishContext);
 function F(const Input:cardinal):cardinal;
 var IBytes:array[0..3] of byte absolute Input;
 begin
   with Context do
     result:=((SBox[0,IBytes[0]]+SBox[1,IBytes[1]] XOR SBox[2,IBytes[2]]) + SBox[3,IBytes[3]]);
 end;
var
 i:integer;
 Temp,xL,xR:cardinal;
begin
 xL:=Data[0];xR:=Data[1];

 for i:=1 to 16 do
 begin
   xL:=xL XOR Context.PArray[i];
   xR:=F(xL) XOR xR;
   Temp:=xL;
   xL:=xR;
   xR:=Temp;
 end;
 Temp:=xL;
 xL:=xR;
 xR:=Temp;

 xR:=xR XOR Context.PArray[17];
 xL:=xL XOR Context.PArray[18];

 Data[0]:=xL;Data[1]:=xR;
end;

procedure DecryptBlowFish(Data:PBlock;const Context:TBlowFishContext);
 function F(const Input:cardinal):cardinal;
 var IBytes:array[0..3] of byte absolute Input;
 begin
   with Context do
     result:=((SBox[0,IBytes[0]]+SBox[1,IBytes[1]] XOR SBox[2,IBytes[2]]) + SBox[3,IBytes[3]]);
 end;
var
 i:integer;
 Temp,xL,xR:cardinal;
begin
 xL:=Data[0];xR:=Data[1];

 for i:=18 downto 3 do
 begin
   xL:=xL XOR Context.PArray[i];
   xR:=F(xL) XOR xR;
   Temp:=xL;
   xL:=xR;
   xR:=Temp;
 end;
 Temp:=xL;
 xL:=xR;
 xR:=Temp;

 xR:=xR XOR Context.PArray[2];
 xL:=xL XOR Context.PArray[1];

 Data[0]:=xL; Data[1]:=xR;
end;

procedure InitBlowFish(const Key:string;var Context:TBlowFishContext);
var
 i,j,k:integer;
 Data:cardinal;
 Block:TBlock;
begin
 if Length(Key)=0 then raise Exception.Create("Zero length key");
 Context.PArray:=InitialPArray;
 Context.SBox:=InitialSBox;
 k:=1;
 for i:=1 to 18 do
 begin
   Data:=0;
   for j:=1 to 4 do
   begin
     Data:=((Data shl 8) or Ord(Key[k]));
     Inc(k);
     if k>Length(Key) then
       k:=1;
   end;
  Context.PArray[i]:=Context.PArray[i] xor Data;
 end;
 Block[0]:=0;Block[1]:=0;
 i:=Low(Context.PArray);
 while i<High(Context.PArray) do
 begin
   EncryptBlowFish(@Block,Context);
   Context.PArray[i]:=Block[0];
   Context.PArray[i+1]:=Block[1];
   Inc(i,2);
 end;

 for i:=0 to 3 do
 begin
   j:=Low(Context.SBox);
   while j<High(Context.SBox) do
   begin
     EncryptBlowFish(@Block,Context);
     Context.SBox[i,j]:=Block[0];
     Context.SBox[i,j+1]:=Block[1];
     Inc(j,2);
   end;
 end;
end;

function StrEncryptBlowFish(const Data:string;const Context:TBlowFishContext):string;
var
 BlockCount:integer;
 Block:PBlock;
begin
 BlockCount:=length(Data) div SizeOf(TBlock);
 result:=copy(Data,1,BlockCount*SizeOf(TBlock));
 Block:=PBlock(PChar(result));
 while BlockCount>0 do
 begin
   EncryptBlowFish(Block,Context);
   inc(Block);
   dec(BlockCount);
 end;
end;

function StrDecryptBlowFish(const Data:string;const Context:TBlowFishContext):string;
var
 BlockCount:integer;
 Block:PBlock;
begin
 BlockCount:=length(Data) div SizeOf(TBlock);
 result:=copy(Data,1,BlockCount*SizeOf(TBlock));
 Block:=PBlock(PChar(result));
 while BlockCount>0 do
 begin
   DecryptBlowFish(Block,Context);
   inc(Block);
   dec(BlockCount);
 end;
end;

юзадж
var Context:TBlowFishContext;
 str:string;
begin
 InitBlowFish("12345678",Context);
 str:="Же неменж па сис жур";
 str:=StrEncryptBlowFish(str,Context);
 str:=StrDecryptBlowFish(str,Context);
 Memo2.Lines.Text:=str;
end;



Страницы: 1 вся ветка

Текущий архив: 2008.12.14;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.014 c
2-1225629295
M
2008-11-02 15:34
2008.12.14
D6 + D7 на одной машине


4-1201164271
apic
2008-01-24 11:44
2008.12.14
меню "пуск",


15-1223908317
Marcos
2008-10-13 18:31
2008.12.14
аналог радмина


15-1223417611
Nic
2008-10-08 02:13
2008.12.14
MasterCard Cirrus


2-1225800533
newbie
2008-11-04 15:08
2008.12.14
таймер