Форум: "Начинающим";
Текущий архив: 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