Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Алгоритмы > Оцените алгоритм шифрования


Автор: Phoenix555 4.5.2006, 18:03
собвственно вот тест
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Memo1: TMemo;
    Memo2: TMemo;
    Button1: TButton;
    Panel1: TPanel;
    Button2: TButton;
    XPManifest1: TXPManifest;
    Procedure MKey(tk:string);
    procedure Edit1Change(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure dis;
    procedure ena;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  ak:array [1..8] of byte;
implementation

{$R *.dfm}

procedure tform1.dis;
begin
button1.Enabled:=false;
button2.Enabled:=false;
end;
procedure tform1.ena;
begin
button1.Enabled:=not false;
button2.Enabled:=not false;
end;

Procedure TForm1.MKey(tk:string);
var
i,l,k,o:byte;
b:bool;
begin
  if length(tk)=0 then
  begin
    for i:=1 to 8 do ak[i]:=0;
  end else
  begin
  l:=length(tk);
  //----------------------01
  for i:=1 to l do
  begin
    o:=ord(tk[i]);
    b:=not b;
    if b = true then
      k:=i+k*i+o*i+o*k+o*k*i
    else
      k:=i*(l*l-i*i)*o+o*k*o+i*i*i;
  end;
  ak[1]:=k;k:=0;
  //----------------------02
  for i:=1 to l do
  begin
    o:=ord(tk[i]);
    b:=not b;
    if b = true then
      k:=i*i+l*i+o*o
    else
      k:=i*(l-i)*o+o*o*o+i*i*i;
  end;
  ak[2]:=k; 
  //----------------------03
  for i:=1 to l do
  begin
    o:=ord(tk[i]);
    b:=not b;
    if b = true then
      k:=k*(i+o*4)+k*o+k
    else
      k:=k*4-o*(k+o*(l-i))+o*(-1);
  end;
  ak[3]:=k;k:=0;
  //----------------------04
  for i:=1 to l do
  begin
    o:=ord(tk[i]);
    b:=not b;
    if b = true then
      k:=k*(i*3+o*4)-k*(o-256)+k
    else
      k:=k*o*(k*o+i*l)-o*o+k*i;
  end;
  ak[4]:=k;k:=0;
  //----------------------05
  for i:=1 to l do
  begin
    o:=ord(tk[(l-i)+1]);
    b:=not b;
    if b = true then
      k:=k+o*k*(l-i)+i*i*l
    else
      k:=k*(k*o+(l-i)*l)-o+k*(l-i);
  end;
  ak[5]:=k;k:=0;
  //----------------------06
  for i:=1 to l do
  begin
    o:=ord(tk[i])-127;
    b:=not b;
    if b = true then
      k:=k+o*l*k*i*(l-i)
    else
      k:=k+(l-i)*(l-i)*i*o+i*o*o;
  end;
  ak[6]:=k;k:=0;
  //----------------------07
  for i:=1 to l do
  begin
    o:=ord(tk[i])-127;
    b:=not b;
    if b = true then
      k:=k*o-o*i+o*(l+i)-o*(l-i)
    else
      k:=k*o-k*i+k*(l+i)-k*(l-i);
  end;
  ak[7]:=k;k:=0;
  //----------------------08
  for i:=1 to l do
  begin
    o:=ord(tk[i])-127;
    b:=not b;
    if b = true then
      k:=k+o*(l+i)-k*(l-i)
    else
      k:=k*o*o-o*(l+i)*k*((l-i)+o);
  end;
  ak[8]:=k;k:=0;
  end;
memo1.Clear;
memo1.lines.add(inttohex(ak[1],2));
memo1.lines.add(inttohex(ak[2],2));
memo1.lines.add(inttohex(ak[3],2));
memo1.lines.add(inttohex(ak[4],2));
memo1.lines.add(inttohex(ak[5],2));
memo1.lines.add(inttohex(ak[6],2));
memo1.lines.add(inttohex(ak[7],2));
memo1.lines.add(inttohex(ak[8],2));
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
if edit1.Text='' then
dis else ena;
MKey(edit1.Text);
end;

procedure TForm1.Button1Click(Sender: TObject);//полное шифрование
var
s,s1:string;
l1,l2,k,b,c:byte;
bo:bool;
i,i2,x:integer;
t:ttime;
begin
  t:=now;
  s:=memo2.Text;
  s1:=edit1.Text;
  MKey(s1);
  l1:=length(s1);
  l2:=length(s);
  c:=1;
  x:=ak[1]*ak[2]*ak[3]*ak[4]*ak[5]*ak[6]*ak[7]*ak[8];
  for i:=1 to length(s) do
  begin
    bo:=not bo;
    b:=ord(s[i]);
    //if b>31 then begin
    i2:=i*i;
    case bo of
    true:
    begin
      b:=b xor ord(s1[c])*i xor l2 xor l1 xor ord(s1[length(s1)-c]);
      b:=b xor ak[1] xor l1 xor i2 xor l2;
      b:=b xor ak[2]*i xor l2 xor l1;
      b:=b xor ak[3] xor l1 xor i2 xor l2;
      b:=b xor ak[4]*i xor l2 xor l1;
      b:=b xor ak[5] xor l1 xor i2 xor l2;
      b:=b xor ak[6]*i xor l2 xor l1;
      b:=b xor ak[7] xor l1 xor i2 xor l2;
      b:=b xor ak[8]*i xor l2 xor l1;
    end;
    false:
    begin
      b:=b xor ord(s1[length(s1)-c]) xor l1 xor i2 xor l2 xor ord(s1[c]);
      b:=b xor ak[8] xor l1 xor i2 xor l2;
      b:=b xor ak[7]*i xor l2 xor l1;
      b:=b xor ak[6] xor l1 xor i2 xor l2;
      b:=b xor ak[5]*i xor l2 xor l1;
      b:=b xor ak[4] xor l1 xor i2 xor l2;
      b:=b xor ak[3]*i xor l2 xor l1;
      b:=b xor ak[2] xor l1 xor i2 xor l2;
      b:=b xor ak[1]*i xor l2 xor l1;
    end;
    end;
      b:=b xor ord(s1[c]);
      b:=b xor l2*i xor i*l1*l1 xor l1*l2*i2;
      b:=b xor l2*i*l1 xor x;
    //if b>31 then
    if b>0 then
    s[i]:=chr(b);
    c:=c+1;
    if c>l1 then c:=1;
  end;
  memo2.Text:=s;
  s:='';
  beep; button1.caption:=formatdatetime('nn:ss:zzz',now-t);
end;

procedure TForm1.Button2Click(Sender: TObject);//шифрование с сохранением кол-ва строк
var
s,s1:string;
l1,l2,k,b,c:byte;
bo:bool;
i,i2,x:integer;
t:ttime;
begin
  t:=now;
  s:=memo2.Text;
  s1:=edit1.Text;
  MKey(s1);
  l1:=length(s1);
  l2:=length(s);
  c:=1;
  x:=ak[1]*ak[2]*ak[3]*ak[4]*ak[5]*ak[6]*ak[7]*ak[8];
  for i:=1 to length(s) do
  begin
    bo:=not bo;
    b:=ord(s[i]);
    if b>31 then begin
    i2:=i*i;
    case bo of
    true:
    begin
      b:=b xor ord(s1[c])*i xor l2 xor l1 xor ord(s1[length(s1)-c]);
      b:=b xor ak[1] xor l1 xor i2 xor l2;
      b:=b xor ak[2]*i xor l2 xor l1;
      b:=b xor ak[3] xor l1 xor i2 xor l2;
      b:=b xor ak[4]*i xor l2 xor l1;
      b:=b xor ak[5] xor l1 xor i2 xor l2;
      b:=b xor ak[6]*i xor l2 xor l1;
      b:=b xor ak[7] xor l1 xor i2 xor l2;
      b:=b xor ak[8]*i xor l2 xor l1;
    end;
    false:
    begin
      b:=b xor ord(s1[length(s1)-c]) xor l1 xor i2 xor l2 xor ord(s1[c]);
      b:=b xor ak[8] xor l1 xor i2 xor l2;
      b:=b xor ak[7]*i xor l2 xor l1;
      b:=b xor ak[6] xor l1 xor i2 xor l2;
      b:=b xor ak[5]*i xor l2 xor l1;
      b:=b xor ak[4] xor l1 xor i2 xor l2;
      b:=b xor ak[3]*i xor l2 xor l1;
      b:=b xor ak[2] xor l1 xor i2 xor l2;
      b:=b xor ak[1]*i xor l2 xor l1;
    end;
    end;
      b:=b xor ord(s1[c]);
      b:=b xor l2*i xor i*l1*l1 xor l1*l2*i2;
      b:=b xor l2*i*l1 xor x;
    end;
    if b>31 then
    //if b>0 then
    s[i]:=chr(b);
    c:=c+1;
    if c>l1 then c:=1;
  end;
  memo2.Text:=s;
  s:='';
  beep; button2.caption:=formatdatetime('nn:ss:zzz',now-t);
end;

procedure TForm1.FormShow(Sender: TObject);
begin
edit1.SetFocus;
end;

end.

только не пинайте ногами это моя первая более-менее толковая программа шифрования .... и мне нужна беспристрастная оценка
сам знаю что программа недоделанная и медленная .. меня больше всего интересует криптостойкость .. если она плохая, то есть просьба прокоментировать конктретный участок кода .. и если не лень дать совет по его улучшению
 

Автор: Heremum 4.5.2006, 18:08
Лучше выпиши алгоритм и дай народу на суд. не все владеют языком, на котором ты написал, а во-вторых вид исходного кода заранее отпугивает. Не охото расгребать. 

Автор: Phoenix555 4.5.2006, 18:19
1) из пароля высчитываются 8 байт - 65-149 строка
   учитывается длинна пароля, ASCI-номера символов, честность симоволов
2) заданый текст XOR-ится этими восьми байтами +длинной пароля +длинной текста +четностью символа(особый упор .. здесь алгоритм делится на две ветки) + наложением пароля +порядковым числом символа в тексте .. в различных комбинациях

пока контрольной суммы нету .. но елси оцентие программу, то мб займусь ею =)    

Автор: SoWa 4.5.2006, 20:57
Это не интересно...
Просто последовательность из уже известных действий. Я, например, элементарно закольцую и захеширую MD5.  И что, новый хеш я изобрел?! 

Автор: Phoenix555 4.5.2006, 21:05
это один из первых моих шагов в криптографию ( просил же не пинаться  smile )
кто-нибудь может оценить криптостойкость ? 

Автор: SoWa 4.5.2006, 21:11
Судя по всему- маленькая... Догадаться можно...
Я тоже не криптограф, но придумать что нибудь дельное можно. Давай вместе думать? smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)