Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.11.2010, 20:34   #1
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию Алгоритм шифрования TEA

Ребят, 5-ый день бьюсь над этой якобы ерундой (так везде написано, что легко), однако у меня даже исходники из интернета не работают и переделывал их и по другому делал, ничего не выходит. Вот что сейчас есть:
Код:
Const
  Delta=$9E3779B9;

type
  TTEAKey=array [0..3] of Cardinal;
  TTEAData=array [0..1] of Cardinal;
  PTEAKey=^TTEAKey;
  PTEAData=^TTEAData;

var
  Form1: TForm1;
  Sum:DWORD;
  InData,OutData:TTEAData;
  Key:TTEAKey;

function pEnCodeTEA(aData:PTEAData;aKey:TTEAKey):PTEAData;
Var
  i:Integer;
begin
  Sum:=0;
  Result:=aData;
  for i:=1 to 32 do
  begin
    Inc(Sum,Delta);
      Inc(Result^[0],(((Result^[1] shl 4)+aKey[0]) xor
                  (Result^[1]+Sum) xor ((Result^[1] shr 5)+aKey[1])));
      Inc(Result^[1],(((Result^[0] shl 4)+aKey[2]) xor
                  (Result^[0]+Sum) xor ((Result^[0] shr 5)+aKey[3])));
  end;
end;

function pDeCodeTEA(aData:PTEAData;aKey:TTEAKey):PTEAData;
Var
  i:Integer;
begin
  Result:=aData;
  for i:=1 to 32 do
  begin
      Dec(Result^[1],(((Result^[0] shl 4)+aKey[2]) xor
                  (Result^[0]+Sum) xor ((Result^[0] shr 5)+aKey[3])));
      Dec(Result^[0],(((Result^[1] shl 4)+aKey[0]) xor
                  (Result^[1]+Sum) xor ((Result^[1] shr 5)+aKey[1])));
    Dec(Sum,Delta);
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  RichEdit2.Text:='';
  Key[0]:=$195AF45B;
  Key[1]:=$165AF44F;
  Key[2]:=$194AF4FB;
  Key[3]:=$193FF421;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  InData[0]:=$77359400; //2 000 000 000
  InData[1]:=$3B9ACA00; //1 000 000 000
  OutData:=pEnCodeTEA(@InData,Key)^;
  RichEdit1.Text:=inttostr(OutData[0])+' '+inttostr(OutData[1]);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  InData[0]:=OutData[0];
  InData[1]:=OutData[1];
  FillChar(OutData,SizeOf(TTEAData),0);
  OutData:=pEnCodeTEA(@InData,Key)^;
  RichEdit2.Text:=inttostr(OutData[0])+' '+inttostr(OutData[1]);
end;
Помогите разобраться пожалуйста, что неправильно. А то препод задал, ничего не объяснив...
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 30.11.2010 в 20:53.
ImmortalAlexSan вне форума Ответить с цитированием
Старый 30.11.2010, 22:37   #2
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Ребят, разобрался сам. Сейчас выложу правильный код, если кому нужно будет.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 30.11.2010, 22:44   #3
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Код:
unit Unit1;

interface

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

Const
  Delta=$9E3779B9;

type
  TTEAKey=array [0..3] of Cardinal;
  TTEAData=array [0..1] of Cardinal;
  PTEAKey=^TTEAKey;
  PTEAData=^TTEAData;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    RichEdit1: TRichEdit;
    RichEdit2: TRichEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    TextForEnCode:String;
    TextForDeCode:String;
    InData,OutData:TTEAData;
    Key:TTEAKey;
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  Sum:Cardinal;

implementation

{$R *.dfm}


function pEnCodeTEA(aData:PTEAData;aKey:TTEAKey):TTEAData;
Var
  i:Integer;
  y,z:Cardinal;
begin
  FillChar(Result,SizeOf(TTEAData),0);
  y:=aData^[0];
  z:=aData^[1];
  Sum:=0;
  for i:=1 to 32 do
  begin
    inc(Sum,Delta);
    inc(y,(((z shl 4)+aKey[0]) xor (z+Sum) xor ((z shr 5)+akey[1])));
    inc(z,(((y shl 4)+aKey[2]) xor (y+Sum) xor ((y shr 5)+akey[3])));
  end;
  Result[0]:=y;
  Result[1]:=z;
end;

function pDeCodeTEA(aData:PTEAData;aKey:TTEAKey):TTEAData;
Var
  i:Integer;
  y,z:Cardinal;
begin
  FillChar(Result,SizeOf(TTEAData),0);
  y:=aData^[0];
  z:=aData^[1];
  for i:=1 to 32 do
  begin
    dec(z,(((y shl 4)+aKey[2]) xor (y+Sum) xor ((y shr 5)+akey[3])));
    dec(y,(((z shl 4)+aKey[0]) xor (z+Sum) xor ((z shr 5)+akey[1])));
    dec(Sum,Delta);
  end;
  Result[0]:=y;
  Result[1]:=z;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FillChar(InData,SizeOf(TTEAData),0);
  InData[0]:=$77359400; //2 000 000 000
  InData[1]:=$3B9ACA00; //1 000 000 000
  OutData:=pEnCodeTEA(@InData,Key);
  RichEdit1.Text:=inttostr(OutData[0])+' '+inttostr(OutData[1]);
  FillChar(InData,SizeOf(TTEAData),0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  InData:=pDeCodeTEA(@OutData,Key);
  RichEdit2.Text:=inttostr(InData[0])+' '+inttostr(InData[1]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  RichEdit2.Text:='';
  Key[0]:=$195AF45B;
  Key[1]:=$165AF44F;
  Key[2]:=$194AF4FB;
  Key[3]:=$193FF421;
end;

end.
Вот рабочий код для алгоритма шифрования TEA, знаю, что проблема с описанием этого алгоритма (его как-такового и нет), а если и есть, то нерабочие. Сейчас чуть-чуть переделаю с шифрованием текстов и выложу отдельной темой наверное... Всем спасибо.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 01.12.2010, 20:38   #4
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Сделал шифрование текста. Писал в дельфи 2010. Основная проблема была с переводом числа в символ, так как после шифрования получается число типа Cardinal со всеми заполненными битами, а Chr берет только первые 16 бит, так что пришлось отдельно сохранять каждое старшее слово шифр-буквы и потом восстанавливать шифрованное число для обратной дешифровки. Добавил исходники как обещал.
Вложения
Тип файла: zip TEA.zip (30.1 Кб, 190 просмотров)
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 30.04.2012, 12:14   #5
medved62
Новичок
Джуниор
 
Регистрация: 30.04.2012
Сообщений: 1
По умолчанию

а почему де шифрование не корректно работает?

а все работает)можете прокоментировать его????

Последний раз редактировалось artemavd; 19.05.2012 в 11:17.
medved62 вне форума Ответить с цитированием
Старый 31.10.2013, 22:07   #6
Huligan799
Пользователь
 
Регистрация: 23.10.2012
Сообщений: 14
По умолчанию

де шифрование не корректно работает
Huligan799 вне форума Ответить с цитированием
Старый 01.11.2013, 02:24   #7
alextrof94
Форумчанин
 
Регистрация: 16.03.2013
Сообщений: 599
По умолчанию

Чуваки, теме 2-3 года, не насилуйте труп.
alextrof94$gmail.com
alextrof94 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[Алгоритм] Симметричного шифрования tuxx32 Помощь студентам 6 13.05.2010 09:39
алгоритм шифрования RC6 Anenya.K Фриланс 2 18.03.2010 13:55
RC6 алгоритм шифрования Anenya.K Фриланс 9 10.03.2010 20:48
Алгоритм шифрования/дешифрования Horus92 Помощь студентам 2 05.12.2009 21:40
Алгоритм шифрования Simply-Art Общие вопросы Delphi 14 01.02.2008 14:30