Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.10.2010, 09:15
Goof_10 Goof_10 вне форума
Прохожий
 
Регистрация: 26.10.2010
Сообщения: 4
Репутация: 10
По умолчанию ГОСТ 28147-89

Здравствуйте, помогите пожалуйста ГОСТ 28147-89 (Режим простой замены)!
Нужно, чтобы в текстовый файл записывалась криптограмма в 16-ти ричном виде.
Вот исходный текст программы:
Код:
unit Unit1;
interface

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

type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    N2: TMenuItem;
    N3: TMenuItem;
    N4: TMenuItem;
    N5: TMenuItem;
    N6: TMenuItem;
    N7: TMenuItem;
    N8: TMenuItem;
    SaveDialog1: TSaveDialog;
    OpenDialog1: TOpenDialog;
    N9: TMenuItem;
    OpenDialog2: TOpenDialog;
    Button1: TButton;
    procedure N6Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure N3Click(Sender: TObject);
    procedure N4Click(Sender: TObject);
    procedure N9Click(Sender: TObject);
    procedure N7Click(Sender: TObject);
    procedure N8Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  fMess,fEncrypt,fKey: File;
  X : array [0..7] of Cardinal; // КЗУ
  EnCrypt: boolean;
implementation

{$R *.dfm}

procedure TForm1.N6Click(Sender: TObject);
begin
close;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
Release;
end;

procedure TForm1.N3Click(Sender: TObject);
begin
 if OpenDialog1.Execute then
   begin
     AssignFile(fMess,OpenDialog1.FileName);

   end;
end;

procedure TForm1.N4Click(Sender: TObject);
begin
  if SaveDialog1.Execute then
    begin
      AssignFile(fEncrypt,SaveDialog1.FileName);
      {сообщение}
    end;
end;

procedure TForm1.N9Click(Sender: TObject);
var v32b: cardinal;
    myKey: byte;
    i,j: byte;
begin
  if OpenDialog2.Execute then
    begin
      AssignFile(fKey,OpenDialog2.FileName);
      Reset(fKey,1);
      for i:=7 downto 0 do  //заполнение КЗУ
        begin
          X[i]:=0;
          for j:=7 downto 0 do
            begin
              v32b:=0;
              myKey:=0;
              BlockRead(fKey,myKey,1);
              if ($30<=myKey) and (myKey<=$39)
                then X[i]:=X[i] or ((v32b or (myKey-$30)) shl (j*4))
                else X[i]:=X[i] or ((v32b or (myKey-$37)) shl (j*4));
            end;
        end;
    end;
end;

procedure TForm1.N7Click(Sender: TObject);
begin
 EnCrypt:=true;
end;

procedure TForm1.N8Click(Sender: TObject);
begin
  EnCrypt:=false;
end;
procedure TForm1.Button1Click(Sender: TObject);
var N1,N2,N12,SM1,reserv,shablon,v32b,ost: Cardinal;
    RoundNumber,j,l,n,Limit: byte;
    K: array[0..7] of byte;
const Kltab: array[0..7,0..15] of byte = (
   { 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F }
	 ($4,$A,$9,$2,$D,$8,$0,$E,$6,$B,$1,$C,$7,$F,$5,$3),
	 ($E,$B,$4,$C,$6,$D,$F,$A,$2,$3,$8,$1,$0,$7,$5,$9),
	 ($5,$8,$1,$D,$A,$3,$4,$2,$E,$F,$C,$7,$6,$0,$9,$B),
	 ($7,$D,$A,$1,$0,$8,$9,$F,$E,$4,$6,$C,$B,$2,$5,$3),
	 ($6,$C,$7,$1,$5,$F,$D,$8,$4,$A,$9,$E,$0,$3,$B,$2),
	 ($4,$B,$A,$0,$7,$2,$1,$D,$3,$6,$8,$5,$9,$C,$F,$E),
	 ($D,$B,$4,$1,$3,$F,$5,$9,$0,$A,$E,$7,$6,$8,$2,$C),
	 ($1,$F,$D,$0,$5,$7,$A,$4,$9,$2,$3,$E,$6,$B,$8,$C));
begin
  Reset(fMess,1);
  Rewrite(fEncrypt,1);
  while not EOF(fMess) do
  Begin
    N1:=0;
    N2:=0;
    try
     BlockRead(fMess,N1,4,ost);  //считывание N1 N2
      try
       BlockRead(fMess,N2,4);
        except
       on EInOutError do
        end;
       except
         on EInOutError do
          n2 := 0;
      end;
 // ROUND'ы 32 шт.
    RoundNumber:=0;
    if EnCrypt
      then begin
        Limit:=24;
        n:=7;
      end
      else begin
        Limit:=8;
        n:=7;
      end;
    while RoundNumber < 32 do
    Begin
      if RoundNumber < Limit
        then reserv:=X[RoundNumber mod 8]
        else begin
          reserv:=X[n];
          if n=0
            then n:=8;
          dec(n);
        end;
      //сумматор первый
      asm
       mov eax, reserv;
       add eax, N1;
       mov SM1, eax;
      end;
      //блок замены
      l:=7;
      shablon:=0;
      for j:=0 to 7 do
      begin
        reserv:=SM1;
        K[j]:=(reserv shl (l*4)) shr 28; // разбиваем на 4 битовые блоки
        K[j]:=Kltab[j,K[j]];             // собственно замена
        v32b:=0;
        shablon:=shablon or ((v32b or K[j]) shl (j*4));//  склейка
        dec(l);
      end;
      ///////////////
      asm rol shablon, 11 ; //сдвиг влево на 11 бит
      end;
      if RoundNumber=31 then
        begin
          N2:=shablon xor N2;
          BREAK; {конец 32 раунда, получено 64 бита криптограммы}
        end;
      N12:=shablon xor N2;
      N2:=N1;
      N1:=N12;
      inc(RoundNumber); // счетчик цикла раундов
    End;
    BlockWrite(fEncrypt,N1,4);//запись в файл криптограммы
    BlockWrite(fEncrypt,N2,4);
  End;
  CloseFile(fMess);
  CloseFile(fEncrypt);
  Application.MessageBox('exelent!','crypto');
end;

end.
Admin: Не забываем про теги!

Последний раз редактировалось Admin, 26.10.2010 в 10:56.
Ответить с цитированием
  #2  
Старый 26.10.2010, 19:33
Аватар для Konrad
Konrad Konrad вне форума
Эксперт
 
Регистрация: 19.03.2009
Сообщения: 1,261
Репутация: 45834
По умолчанию

Цитата:
Сообщение от Goof_10
Здравствуйте, помогите пожалуйста ГОСТ 28147-89 (Режим простой замены)!
Нужно, чтобы в текстовый файл записывалась криптограмма в 16-ти ричном виде.
Так, для начала:

В 16-ти ричном виде в тхт файл - так: 6432AC5BD5A4.... ?
Ответить с цитированием
  #3  
Старый 30.10.2010, 18:24
Goof_10 Goof_10 вне форума
Прохожий
 
Регистрация: 26.10.2010
Сообщения: 4
Репутация: 10
По умолчанию

Да, желательно Но можно и на Edit выводить.
Ответить с цитированием
  #4  
Старый 30.10.2010, 18:26
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,087
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

IntToHex тебя спасет.
Ответить с цитированием
  #5  
Старый 31.10.2010, 07:04
Goof_10 Goof_10 вне форума
Прохожий
 
Регистрация: 26.10.2010
Сообщения: 4
Репутация: 10
По умолчанию

Скажите, пожалуйста как это организовать?
Ответить с цитированием
  #6  
Старый 31.10.2010, 07:08
Goof_10 Goof_10 вне форума
Прохожий
 
Регистрация: 26.10.2010
Сообщения: 4
Репутация: 10
По умолчанию

Если я не ошибаюсь, IntToHex- это функция в Delphi, которая конвертирует число из десятеричной системы счисления в шестнадцатеричную систему счисления. Подскажите, как мне ее использовать в данном случае?
Ответить с цитированием
  #7  
Старый 31.10.2010, 08:19
ilyas09 ilyas09 вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 6
Репутация: 10
По умолчанию

IntToHex конвертирует число в строку, но в отличие от IntToStr записывает его туда в шестнадцатеричном виде.
PS. Все числа в памяти компьютера хранятся в двоичном виде. Из двоичного вида их легко можно представить в шестнадцатеричный, а вот в десятичный вид их придётся конвертировать.

Последний раз редактировалось ilyas09, 31.10.2010 в 08:25.
Ответить с цитированием
  #8  
Старый 31.10.2010, 08:25
Аватар для eXplorer
eXplorer eXplorer вне форума
Активный
 
Регистрация: 06.08.2010
Адрес: Ярославль
Сообщения: 264
Версия Delphi: 7
Репутация: 14
По умолчанию

http://www.delphisources.ru/pages/fa...ToHex.php.html
__________________
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 21:29.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025