Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.12.14;
Скачать: [xml.tar.bz2];

Вниз

Алгоритм 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.007 c
1-1203322940
kblc
2008-02-18 11:22
2008.12.14
Родительское окно


1-1203778825
Алексей92
2008-02-23 18:00
2008.12.14
Создать объект, зная его класс в строковой переменной


15-1223864185
Slider007
2008-10-13 06:16
2008.12.14
С днем рождения ! 12 октября 2008 воскресенье


15-1223451509
DeadMeat
2008-10-08 11:38
2008.12.14
Data Explorer и MSAccess


15-1223383650
boriskb
2008-10-07 16:47
2008.12.14
ОДКБ





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский