Lampiran A Listing Program

A-1

Universitas Kristen Maranatha

Listing UMain.pas unit UMain; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, Menus, ComCtrls, Buttons, ShellAPI; type TMain = class(TForm) PageControl1: TPageControl; TabSheet1: TTabSheet; Label1: TLabel; Label5: TLabel; Label6: TLabel; Label7: TLabel; Label3: TLabel; Label4: TLabel; btBrowse: TButton; btGen: TButton; GroupBox1: TGroupBox; Label8: TLabel; Label9: TLabel; PrivD: TEdit; PrivN: TEdit; GroupBox2: TGroupBox; Label10: TLabel; Label11: TLabel; PubE: TEdit; PubN: TEdit; edStart: TEdit; edDuration: TEdit; edEnd: TEdit; edPath: TEdit; btEncrypt: TButton; RPlain: TRichEdit; edPass: TEdit; TabSheet2: TTabSheet; Label12: TLabel; Label13: TLabel; Label14: TLabel; Label15: TLabel; Label16: TLabel; Label17: TLabel; edPath1: TEdit; btBrowse1: TButton;

A-2

Universitas Kristen Maranatha

edPass1: TEdit; edStart1: TEdit; edEnd1: TEdit; edDuration1: TEdit; GroupBox3: TGroupBox; Label18: TLabel; Label19: TLabel; PubE1: TEdit; PubN1: TEdit; btDecrypt: TButton; RCipher: TMemo; MainMenu1: TMainMenu; File1: TMenuItem; Exit1: TMenuItem; About1: TMenuItem; OpenDlgDec: TOpenDialog; OpenDlgEnc: TOpenDialog; SaveDlgEnc: TSaveDialog; SaveDlgDec: TSaveDialog; SaveDlgV: TSaveDialog; OpenDlgV: TOpenDialog; TabSheet3: TTabSheet; CreateP: TMemo; btSimpan: TButton; SaveDlgP: TSaveDialog; BtnViewCipherFiles: TBitBtn; BitBtn1: TBitBtn; procedure btSimpanClick(Sender: TObject); procedure btBrowseClick(Sender: TObject); procedure btBrowse1Click(Sender: TObject); procedure btGenClick(Sender: TObject); procedure About1Click(Sender: TObject); procedure btEncryptClick(Sender: TObject); procedure btDecryptClick(Sender: TObject); procedure BtnViewCiphrFilesClick(Sender: TObject); procedure Exit1Click(Sender: TObject); procedure TabSheet1Show(Sender: TObject); procedure TabSheet2Show(Sender: TObject); procedure BitBtn1Click(Sender: TObject); procedure TabSheet3Show(Sender: TObject); private { Private declarations } public { Public declarations } end; var Main: TMain;

A-3

Universitas Kristen Maranatha

implementation uses Camellia, RSATools, Tools, UAbout; {$R *.dfm} procedure TMain.btSimpanClick(Sender: TObject); begin if SaveDlgP.Execute then begin CreateP.Lines.SaveToFile(SaveDlgP.FileName); end; end; procedure TMain.btBrowseClick(Sender: TObject); begin if OpenDlgEnc.Execute then begin edPath.Text:=OpenDlgEnc.FileName; RPlain.Clear; RPlain.Lines.LoadFromFile(OpenDlgEnc.FileName); end; end; procedure TMain.btBrowse1Click(Sender: TObject); begin if OpenDlgDec.Execute then begin edPath1.Text:=OpenDlgDec.FileName; RCipher.Clear; RCipher.Lines.LoadFromFile(OpenDlgDec.FileName); end; end; procedure TMain.btGenClick(Sender: TObject); var p : Longint; //random prime q : Longint; //second random prime that not equal to p n : Longint; //p * q pi : Longint; //(p - 1)(q - 1) e : Longint; //e that relatively prime to pi but less than pi d : Longint; //d that d*e congruent to 1 mod pi i1 : Longint; //counter c : Longint; temp2 : array of Longint; // temp dynamic array handler that hand selection of e temp3 : Longint;

A-4

Universitas Kristen Maranatha

temp4 : Longint; temp5 : Longint; // temp handler temp6 : Longint; // temp handler 2 label lagi,ulang; begin lagi: p := RdmPrime; q := RdmPrime; //Trap handler if p = q If p = q Then GoTo lagi; n := p * q; PrivN.Text := IntToStr(n); PubN.Text := IntToStr(n); pi := (p - 1) * (q - 1); //search for e c := pi - 1; SetLength(temp2,c); For e := 2 To (pi - 1) do begin temp6 := gcd(pi, e); If temp6 = 1 Then begin temp2[c] := e; c := c - 1; end; end; //random selection of e ulang: Randomize; temp3 := Round((pi - 1) * (Random(10000)/10000)); temp4 := temp2[temp3]; If (temp4 = 0) Or (temp4 = Null) Then GoTo ulang;

//select e that is prime For i1 := 2 To Round(Sqrt(temp4)) do begin temp5 := temp4 Mod i1; If temp5 = 0 Then

A-5

Universitas Kristen Maranatha

GoTo ulang; end; PubE.Text := IntToStr(temp4); //determine d such that d*e congruent 1 mod pi and d > 0, d > e d := Euclid(pi, temp4); If d < temp4 Then GoTo ulang; PrivD.Text := IntToStr(d); end; procedure TMain.About1Click(Sender: TObject); begin frmAbout.ShowModal; end; procedure TMain.btEncryptClick(Sender: TObject); var slama:String; Source,Dest:File; valid:TextFile; Buffer: array[0..15] of byte; temp:Byte128; Read:Integer; awal,akhir,lama:TDateTime; i,d,n:Integer; s,x:longint; begin if edPass.Text = '' then MessageDlg('Kata Kunci Belum Diisi',mtError,mbOKCancel,0) else if RPlain.Text = '' then MessageDlg('Document masih kosong',mtError,mbOKCancel,0) else if PrivD.Text = '' then MessageDlg('Klik dahulu Generate Key',mtError,mbOKCancel,0) else begin ShowMessage('Masukan Nama File Ciphertext'); if SaveDlgEnc.Execute then begin awal:=Time; edStart.Text:=TimeToStr(awal); AssignFile(Source,edPath.Text); AssignFile(Dest,SaveDlgEnc.FileName); Reset(source,1); ReWrite(Dest,1);

A-6

Universitas Kristen Maranatha

repeat FillChar(Buffer,sizeof(Buffer),0); FillChar(temp,sizeof(temp),0); BlockRead(Source,Buffer,sizeof(Buffer),read); if read 0 then begin move(Buffer,temp,read); Encrypt(temp,edPass.Text,temp); move(temp,Buffer,sizeof(temp)); BlockWrite(Dest,Buffer,SizeOf(Buffer)); end; until read sizeof(Buffer); CloseFile(Source); CloseFile(Dest); akhir:=Time; edEnd.Text:=TimeToStr(akhir); lama:=(akhir-awal)*86000; str(lama:12:8,slama); edDuration.Text:=slama; end; if Application.MessageBox('Masukan Nama File Validasi dan Digital Signature','Pesan',MB_OK) = IDOK then begin if SaveDlgV.Execute then begin AssignFile(Source,SaveDlgEnc.FileName); Reset(Source,1); repeat BlockRead(Source,Buffer,sizeof(Buffer),read); for i:=0 to 15 do s := s xor buffer[i]; until read sizeof(buffer); CloseFile(Source); AssignFile(valid,SaveDlgV.FileName); Rewrite(valid); d:=StrToInt(PrivD.Text); n:=StrToInt(PrivN.Text); x:=pangkatmod(s,d,n); write(valid,inttostr(x)); CloseFile(valid); end; end; end; end; procedure TMain.btDecryptClick(Sender: TObject); var slama,temp1:String; Source,Dest:File;

A-7

Universitas Kristen Maranatha

valid:TextFile; Buffer: array[0..15] of byte; temp:Byte128; Read:Integer; awal,akhir,lama:TDateTime; i,e,n:Integer; s,p:Longint; begin if edPass1.Text = '' then MessageDlg('Kata Kunci Belum Diisi',mtError,mbOKCancel,0) else if RCipher.Text = '' then MessageDlg('Document masih kosong',mtError,mbOKCancel,0) else if (PubE1.Text = '') or (PubN1.Text = '') then MessageDlg('Public Key Belum Di Isi',mtError,mbOKCancel,0) else begin MessageDlg('Buka File Validasi',mtInformation,mbOKCancel,0); if OpenDlgV.Execute then begin e:=StrToInt(PubE1.Text); n:=StrToInt(PubN1.Text); AssignFile(valid,OpenDlgV.FileName); Reset(valid); Readln(valid,temp1); CloseFile(valid); AssignFile(Source,edPath1.Text); Reset(Source,1); repeat BlockRead(Source,Buffer,sizeof(Buffer),read); for i:=0 to 15 do s := s xor buffer[i]; until read sizeof(buffer); CloseFile(Source); p:=pangkatmod(StrToInt(temp1),e,n); if p s then begin MessageDlg('File Chipertext tidak valid proses berhenti',mtError,mbOKCancel,0); exit; end else if SaveDlgDec.Execute then begin awal:=Time; edStart1.Text:=TimeToStr(awal); AssignFile(Source,edPath1.Text);

A-8

Universitas Kristen Maranatha

AssignFile(Dest,SaveDlgDec.FileName); Reset(Source,1); Rewrite(Dest,1); repeat FillChar(Buffer,sizeof(Buffer),0); FillChar(temp,sizeof(temp),0); BlockRead(Source,Buffer,sizeof(Buffer),read); if read 0 then begin move(Buffer,temp,read); Decrypt(temp,edPass.Text,temp); move(temp,Buffer,sizeof(temp)); BlockWrite(Dest,Buffer,read); end; until read sizeof(Buffer); CloseFile(Source); CloseFile(Dest); akhir:=Time; edEnd1.Text:=TimeToStr(akhir); lama:=(akhir-awal)*86000; str(lama:12:8,slama); edDuration1.Text:=slama; end; end; end; end; procedure TMain.BtnViewCiphrFilesClick(Sender: TObject); begin if FileExists(SaveDlgEnc.FileName) then ShellExecute(Handle, nil, PChar('NotePad.exe'), PChar(SaveDlgEnc.FileName), nil, sw_ShowNormal); end; procedure TMain.Exit1Click(Sender: TObject); begin Application.Terminate; end; procedure TMain.TabSheet1Show(Sender: TObject); begin OpenDlgEnc.FileName:=''; SaveDlgEnc.FileName:=''; SaveDlgV.FileName:=''; edPath.Clear; edStart.Clear; edDuration.Clear; edEnd.Clear;

A-9

Universitas Kristen Maranatha

edPass.Clear; PrivD.Clear; PrivN.Clear; PubE.Clear; PubN.Clear; RPlain.Clear; end; procedure TMain.TabSheet2Show(Sender: TObject); begin OpenDlgDec.FileName:=''; SaveDlgDec.FileName:=''; OpenDlgV.FileName:=''; edPath1.Clear; edPass1.Clear; edStart1.Clear; edDuration1.Clear; edEnd1.Clear; PubE1.Clear; PubN1.Clear; RCipher.Clear; end; procedure TMain.BitBtn1Click(Sender: TObject); begin if FileExists(SaveDlgDec.FileName) then ShellExecute(Handle, nil, PChar('NotePad.exe'), PChar(SaveDlgDec.FileName), nil, sw_ShowNormal); end; procedure TMain.TabSheet3Show(Sender: TObject); begin SaveDlgP.FileName:=''; CreateP.Clear; end; end.

A-10

Universitas Kristen Maranatha

Listing Tools.pas unit Tools; interface uses Sysutils; type {$IFDEF VER120} dword= longword; {$ELSE} dword= longint; {$ENDIF} Word64 = array[0..1] of DWord; Word128 = array[0..3] of Dword; Byte64 = array[0..7] of Byte; Byte128 = array[0..15] of Byte; Byte256 = array[0..31] of Byte; function LRot16(X: word; c: integer): word; assembler; function RRot16(X: word; c: integer): word; assembler; function LRot32(X: dword; c: integer): dword; assembler; function RRot32(X: dword; c: integer): dword; assembler; function SwapDWord(X: DWord): DWord; register; assembler; procedure XorBlock128(const I1: Byte128; const I2: Byte128; var O1: Byte128); procedure XorBlock64(const I1: Byte64; const I2: Byte64; var O1: Byte64); procedure IncBlock(P: PByteArray; Len: integer); procedure SwapHalf(var x: Byte128); procedure ByteDword(const x: PByteArray; var y: Word128); procedure DWordByte(const x: Word128; var y: PByteArray); function RotBlock128(const x: Byte128; const n: integer): Byte128; procedure split128(const x: Byte128; var L: Byte64; var R: Byte64); procedure merge128(const L: Byte64; const R: Byte64; var z: Byte128); implementation function LRot16(X: word; c: integer): word; assembler; asm mov ecx,&c mov ax,&X rol ax,cl mov &Result,ax end; function RRot16(X: word; c: integer): word; assembler;

A-11

Universitas Kristen Maranatha

asm mov ecx,&c mov ax,&X ror ax,cl mov &Result,ax end; function LRot32(X: dword; c: integer): dword; register; assembler; asm mov ecx, edx rol eax, cl end; function RRot32(X: dword; c: integer): dword; register; assembler; asm mov ecx, edx ror eax, cl end; function SwapDWord(X: DWord): DWord; register; assembler; asm xchg al,ah rol eax,16 xchg al,ah end; procedure XorBlock128(const I1: Byte128; const I2: Byte128; var O1: Byte128); var i: integer; begin for i:= 0 to 15 do O1[i]:= I1[i] xor I2[i]; end; procedure XorBlock64(const I1: Byte64; const I2: Byte64; var O1: Byte64); var i: integer; begin for i:= 0 to 7 do O1[i]:= I1[i] xor I2[i]; end; procedure IncBlock(P: PByteArray; Len: integer); begin Inc(P[Len-1]); if (P[Len-1]= 0) and (Len> 1) then IncBlock(P,Len-1);

A-12

Universitas Kristen Maranatha

end; procedure SwapHalf(var x: Byte128); var t:byte; i:integer; begin for i:=0 to 7 do begin t:=x[i]; x[i]:=x[8+i]; x[8+i]:=t; end; end; procedure ByteDword(const x: PByteArray; var y: Word128); var i: Integer; begin for i:=0 to 3 do begin y[i]:= x[i*4+0]; y[i]:= y[i] shl 8; y[i]:= y[i] + x[i*4+1]; y[i]:= y[i] shl 8; y[i]:= y[i] + x[i*4+2]; y[i]:= y[i] shl 8; y[i]:= y[i] + x[i*4+3]; end; end; procedure DWordByte(const x: Word128; var y: PByteArray); var i: integer; rr,ll: word; begin for i:=0 to 3 do begin rr:=(x[i] shl 16) shr 16; ll:=(x[i] shr 16); y[i*4+1]:=(ll shl 8) shr 8; y[i*4+0]:=(ll shr 8); y[i*4+3]:=(rr shl 8) shr 8; y[i*4+2]:=(rr shr 8); end; end; function pangkat(const x: integer; const y: integer): integer; var res,i : integer; begin if y = 0 then

A-13

Universitas Kristen Maranatha

result:=1 else begin res:=1; for i:=1 to y do res:=res * x; result:=res; end; end; function RotBlock128(const x: Byte128; const n: integer): Byte128; var y:Byte128; m:array[0..127] of integer; i,j,l,t:integer; begin FillChar(m,sizeof(m),0); for i:=0 to 15 do begin l:=x[i]; j:=7; while l>0 do begin m[8*i+j]:= l mod 2; l := l div 2; dec(j); end; end; for i:= 1 to n do begin t:=m[0]; for j:=0 to 126 do m[j]:=m[j+1]; m[127]:=t; end; for i:=0 to 15 do begin l:=0; for j:=0 to 7 do l:=l+pangkat(2,7-j)*m[i*8+j]; y[i]:=l; end; move(y,Result,sizeof(y)); end; procedure split128(const x: Byte128; var L: Byte64; var R: Byte64); var i:integer; Le,Ri: Byte64; begin

A-14

Universitas Kristen Maranatha

for i:=0 to 7 do begin Le[i]:=x[i]; Ri[i]:=x[i+8]; end; move(Le,L,sizeof(Le)); move(Ri,R,sizeof(Ri)); end; procedure merge128(const L: Byte64; const R: Byte64; var z: Byte128); var i:integer; begin for i:=0 to 7 do begin z[i]:=L[i]; z[i+8]:=R[i]; end; end; end.

A-15

Universitas Kristen Maranatha

* Program Pembangkit Kunci procedure Ekeygen(const n: integer; const key: Byte256); var i: integer; f,ktemp:Byte128; d:Byte64; begin // key burn FillChar(KL,sizeof(KL),0); FillChar(KR,sizeof(KR),0); FillChar(KA,sizeof(KA),0); FillChar(KB,sizeof(KB),0); FillChar(K,sizeof(K),0); FillChar(K1,sizeof(K1),0); FillChar(Kw,sizeof(Kw),0); if n = 128 then begin for i:= 0 to 15 do KL[i]:=key[i]; for i:=0 to 15 do KR[i]:=0; end else if n = 192 then begin for i:= 0 to 15 do KL[i]:=key[i]; for i:=0 to 7 do begin KR[i]:=key[i+16]; KR[i+8]:=key[i+16]; end; end else if n = 256 then begin for i:= 0 to 15 do begin KL[i]:=key[i]; KR[i]:=key[i+16]; end; end;

A-16

Universitas Kristen Maranatha

// preschedule XorBlock128(KL,KR,f); Feistel(f,Sigma1,f); Feistel(f,Sigma2,f); XorBlock128(f,KL,f); Feistel(f,Sigma3,f); Feistel(f,Sigma4,f); move(f,KA,sizeof(f)); XorBlock128(f,KR,f); Feistel(f,Sigma5,f); Feistel(f,Sigma6,f); move(f,KB,sizeof(f)); if n = 128 then begin // Kw schedule split128(KL,Kw[1],Kw[2]); ktemp:=RotBlock128(KA,111); split128(ktemp,Kw[3],Kw[4]); // k schedule split128(KA,k[1],k[2]); ktemp:=RotBlock128(KL,15); ktemp:=RotBlock128(KA,15); ktemp:=RotBlock128(KL,45); ktemp:=RotBlock128(KA,45); ktemp:=RotBlock128(KL,60); ktemp:=RotBlock128(KA,60); ktemp:=RotBlock128(KL,94); ktemp:=RotBlock128(KA,94); ktemp:=RotBlock128(KL,111); // K1 schedule ktemp:=RotBlock128(KA,30); ktemp:=RotBlock128(KL,77); end else

split128(ktemp,k[3],k[4]); split128(ktemp,k[5],k[6]); split128(ktemp,k[7],k[8]); split128(ktemp,k[9],d); split128(ktemp,d,k[10]); split128(ktemp,k[11],k[12]); split128(ktemp,k[13],k[14]); split128(ktemp,k[15],k[16]); split128(ktemp,k[17],k[18]);

split128(ktemp,k1[1],k1[2]); split128(ktemp,k1[3],k1[4]);

begin // Kw schedule split128(KL,Kw[1],Kw[2]); ktemp:=RotBlock128(KB,111); split128(ktemp,Kw[3],Kw[4]);

A-17

Universitas Kristen Maranatha

// k schedule split128(KB,k[1],k[2]); ktemp:=RotBlock128(KR,15); ktemp:=RotBlock128(KA,15); ktemp:=RotBlock128(KB,30); ktemp:=RotBlock128(KL,45); ktemp:=RotBlock128(KA,45); ktemp:=RotBlock128(KR,60); ktemp:=RotBlock128(KB,60); ktemp:=RotBlock128(KL,77); ktemp:=RotBlock128(KR,94); ktemp:=RotBlock128(KA,94); ktemp:=RotBlock128(KL,111); // K1 schedule ktemp:=RotBlock128(KR,30); ktemp:=RotBlock128(KL,60); ktemp:=RotBlock128(KA,77); end; end;

split128(ktemp,k[3],k[4]); split128(ktemp,k[5],k[6]); split128(ktemp,k[7],k[8]); split128(ktemp,k[9],k[10]); split128(ktemp,k[11],k[12]); split128(ktemp,k[13],k[14]); split128(ktemp,k[15],k[16]); split128(ktemp,k[17],k[18]); split128(ktemp,k[19],k[20]); split128(ktemp,k[21],k[22]); split128(ktemp,k[23],k[24]);

split128(ktemp,k1[1],k1[2]); split128(ktemp,k1[3],k1[4]); split128(ktemp,k1[5],k1[6]);

A-18

Universitas Kristen Maranatha

* Program Enkripsi procedure Encrypt(const p: Byte128; const key: string; var c: Byte128); var i,round,keylen:integer; kn: Byte256; ktmp,ptmp: Byte128; N:array[0..24] of Byte128; begin //key schedule keylen:=length(key); if keylen