![]() |
|
#1
|
|||
|
|||
![]() Здравствуйте, помогите пожалуйста ГОСТ 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, 26.10.2010 в 10:56. |
#2
|
||||
|
||||
![]() Цитата:
В 16-ти ричном виде в тхт файл - так: 6432AC5BD5A4.... ? |
#3
|
|||
|
|||
![]() Да, желательно
![]() |
#4
|
|||
|
|||
![]() IntToHex тебя спасет.
|
#5
|
|||
|
|||
![]() Скажите, пожалуйста как это организовать?
|
#6
|
|||
|
|||
![]() Если я не ошибаюсь, IntToHex- это функция в Delphi, которая конвертирует число из десятеричной системы счисления в шестнадцатеричную систему счисления. Подскажите, как мне ее использовать в данном случае?
|
#7
|
|||
|
|||
![]() IntToHex конвертирует число в строку, но в отличие от IntToStr записывает его туда в шестнадцатеричном виде.
PS. Все числа в памяти компьютера хранятся в двоичном виде. Из двоичного вида их легко можно представить в шестнадцатеричный, а вот в десятичный вид их придётся конвертировать. Последний раз редактировалось ilyas09, 31.10.2010 в 08:25. |
#8
|
||||
|
||||
![]() ![]() |