• Tidak ada hasil yang ditemukan

Uji tingkat kerandoman Bit pada enkripsi data encryption standard

N/A
N/A
Protected

Academic year: 2017

Membagikan "Uji tingkat kerandoman Bit pada enkripsi data encryption standard"

Copied!
81
0
0

Teks penuh

(1)

i

UJI TINGKAT KERANDOMAN BIT

PADA ENKRIPSI

DATA ENCRYPTION STANDARD

Zamzamiah

PROGRAM STUDI MATEMATIKA

FAKULTAS SAINS DAN TEKNOLOGI

UNIVERSITAS ISLAM NEGERI

SYARIF HIDAYATULLAH

JAKARTA

(2)

ii

UJI TINGKAT KERANDOMAN BIT

PADA ENKRIPSI

DATA ENCRYPTION STANDARD

Skripsi

Sebagai Salah Satu Syarat untuk Memperoleh Gelar Sarjana Sains

Fakultas Sains dan Teknologi

Universitas Islam Negeri Syarif Hidayatullah Jakarta

Oleh :

Zamzamiah

103094029748

PROGRAM STUDI MATEMATIKA

FAKULTAS SAINS DAN TEKNOLOGI

UNIVERSITAS ISLAM NEGERI

SYARIF HIDAYATULLAH

JAKARTA

(3)

iii

PENGESAHAN UJIAN

Skripsi yang berjudul “ Uji Tingkat Kerandoman Bit pada Enkripsi

Data Encryption Standard”, yang ditulis oleh Zamzamiah, NIM 103094029748

telah diujikan dan dinyatakan lulus dalam siding Munaqosyah Fakultas Sains dan Teknologi, Universitas Islam Negeri Syarif Hidayatullah Jakarta, pada tanggal 30 Agustus 2010. Skripsi ini telah diterima sebagai salah satu syarat untuk memperoleh gelar strata satu (S1) pada Program Studi Matematika.

Menyetujui :

Penguji I, Penguji II,

Taufik Edy S, M.ScTech Suma’innah

NIP. 19790530 200604 1002 NIP. 150 408 699 Pembimbing I, Pembimbing II,

Hermawan S, M.Kom Yanne Irene, M.Si NIP. 19740623 1993121 001 NIP. 19741231 2005012 018

Mengetahui :

Dekan Fakultas Sains dan Teknoligi, Ketua Program Studi Matematika,

(4)

iv

PERNYATAAN

DENGAN INI SAYA MENYATAKAN BAHWA SKRIPSI INI BENAR-BENAR HASIL KARYA SENDIRI YANG BELUM PERNAH DIAJUKAN SEBAGAI SKRIPSI ATAU SKRIPSI PADA PERGURUAN TINGGI ATAU LEMBAGA MANAPUN.

Jakarta, Agustus 2010

Zamzamiah

(5)

v

Sesungguhnya perjalanan menuntut ilmu

Tidaklah sunyi dari rasa lelah

Karena bahwasanya menuntut ilmu itu

Perkara yang lebih besar dan lebih utama

Dari peperangan menurut para ulama

Barang siapa yang sabar di dalam menuntut ilmu

Maka ia akan memperoleh kelezatan ilmu

Yang mengalahkan

Semua kelezatan-kelezatan dunia

(Dikutip dari perkataan Nabi Musa AS.)

Skripsi ini kupersembahkan

Untuk Aku beserta keluargaku

Semoga Allah menjadikan kami orang-orang yang selalu haus akan ilmu

(6)

vi

ABSTRAK

Aspek keamanan data telah menjadi aspek yang sangat penting dari suatu sistem informasi. Salah satu cara menjaga keamanan dan kerahasiaan data tersebut yaitu dengan digunakannya algoritma kriptografi untuk melakukan penyandian data. Salah satu jenis algoritma kriptografi yang paling popular adalah algoritma DES (Data Encrytion Standard).

Untuk mengetahui tingkat kerandoman barisan binari pada ciperteks algoritma DES dapat dilakukan dengan menggunakan deretan uji NIST . Deretan uji NIST tersebut merupakan sebuah paket uji statistik yang mengandung 16 uji. Diantaranya adalah uji frekuensi monobit, uji frekuensi dengan sebuah blok, uji run, uji kumulatif sums (cumsum), dan sebagainya.

(7)

vii

ABSTRACK

The security aspect data becoming an important aspect from one system information. Another one is to take savety and keep secret the data with used algorithm cryptographic to share data. Another kind of algorithm cryptographic the most popular is algoritm DES (Data Encryption Standard).

To know level of randomness binary formation in ciphertext algoritm DES can do with use test line of NIST. The line formation of NIST is one packet statistical test than include 16 test. Between that is frequency test (monobit), frequency test within a block, run test, cumulative sums test (cumsum), and etc .

(8)

viii

KATA PENGANTAR

Alhamdulillah, penulis panjatkan rasa syukur pada Allah swt. yang senantiasa memberikan rahmat dan hidayah-Nya sehingga penulis dapat menyelesikan skripsi ini. Skripsi ini berjudul “Uji Kerandoman Bit Pada Enkripsi DES (Data Enkription Standard)”.

Pada kesempatan ini penulis ingin mengucapkan terima kasih yang tak terhingga dan memberikan penghargaan yang sebesar-besarnya kepada:

1. Dr. Syopiansyah Jaya Putra, M.Sis, Dekan Fakultsa Sains dan Teknologi. 2. Yanne Irene, M.Si., Ketua Program Studi Matematika, Suma’inna, M.Si.,

Sekretaris Ketua Program Studi Matematika yang senantiasa memberikan nasehat dan bimbingan selama penulis kuliah di prodi Matematika.

3. Hermawan Setiawan, M.Si. selaku pembimbing I dan Yanne Irene, M.Si selaku pembimbing II yang memberikan banyak ilmu, waktu, pengarahan dan bimbingan, serta dorongan semangatkepada penulis.

4. Kelurga besar dosen Program Studi Matematika yang telah memberikan banyak ilmu yang sangat bermanfaatkepada penulis.

5. Ayah dan ibu serta kakak-kakakku yang telah memberikan dorongan kepada penulis dalam menyelesaikan skipsi ini.

(9)

ix Penulis menyadari , masih banyak kekurangan pada penulisan skripsi ini. Oleh karena itu, penulis mengharapkan kritik dan saran yang membangun dari para pembaca.

Penulis berharap semoga skripsi ini dapat bermanfaat khususnya bagi penulis dan pembaca pada umumnya.

Jakarta, Agustus 2010

Penulis

(10)

x

DAFTAR ISI

Halaman

HALAMAN JUDUL ... i

PENGESAHAN PENGUJI ... ii

PERNYATAAN ... iii

PERSEMBAHAN DAN MOTTO ... iv

ABSTRAK ... v

ABSTRACK ... vi

KATA PENGANTAR ... vii

DAFTAR ISI ... ix

DAFTAR LAMPIRAN ... xi

BAB I PENDAHULUAN ... 1

1.1 Latar Belakang ... 1

1.2 Rumusan Masalah ... 2

1.3 Tujuan Penelitian ... 2

1.4 Batasan Masalah ... 3

1.5 Manfaat Penelitian ... 3

BAB II LANDASAN TEORI ... 4

2.1 Kriptografi dan Algoritma Kriptografi ... 4

2.2 Data Encryption Standard (DES) ... 6

2.3 Bentuk-bentuk Uji Statistik ... 11

2.4 Hipotesis, Nilai Kritikal dan Level Signifikan ... 14

2.5 Deskripsi Teknisi dari Uji-uji ... 15

(11)

xi

2.5.2 Uji Frekuensi Within a Block ... 16

2.5.3 Uji Run ... 17

BAB III PENGUMPULAN DAN PENGOLAHAN DATA ... 19

3.1 Kerandoman (Randomnes) ... 19

3.2 Pengambilan Data ... 19

3.3 Pengolahan Data ... 20

3.3.1 Uji Frekuensi (Monobit) ... 20

3.3.2 Uji Frekuensi dalam Sebuah Blok ... 21

3.3.3 Uji Run ... 23

BAB IV UJI KERANDOMAN BIT PADA DES ... 26

4.1 Analisis Hasil ... 26

4.1.1 Uji Kerandoman Bit dengan Uji Statistik Monobit 27

4.1.2 Uji Kerandoman Bit dengan Uji Statistik Frekuensi dalam Sebuah Blok ... 28

4.1.3 Uji Kerandoman Bit dengan Uji Statistik Run ... 29

BAB V KESIMPULAN DAN SARAN ... 31

5.1 Kesimpulan ... 31

5.2 Saran ... 32

REFERENSI ... 33

(12)

xii

DAFTAR LAMPIRAN

Halaman

Lampiran 1 : Plainteks dan Chiperteks dengan Menggunakan Kunci yang

Sama ... 35 Lampiran 2 : Program Enkripsi dan Dekripsi Algoritma DES ... 42 Lampiran 3 : Tabel ASCII (American Standard Code for Information

Interchange) ... 56

(13)

1

BAB I

PENDAHULUAN

1.1Latar Belakang Masalah

Perkembangan teknologi komputer dan telekomunikasi yang cukup pesat saat ini cukup berpengaruh pada penggunaan informasi. Kemampuan untuk mengakses dan menyediakan informasi secara cepat dan akurat menjadi sangat penting bagi sebuah organisasi komersial (perusahaan), perguruan tinggi (akademis), lembaga pemerintah (birokrasi), maupun individual (pribadi).

Seiring dengan perkembangan teknologi komunikasi dan penyimpanan data dengan menggunakan komputer, memungkinkan pengiriman data jarak jauh yang relatif murah dan cepat. Salah satunya yaitu dengan menggunakan internet, jaringan tersebut menyediakan berbagai macam layanan komunikasi. Saat ini penggunaan internet sangat marak digunakan oleh masyarakat, hal ini disebabkan oleh berbagai macam layanan yang ditawarkan oleh internet tersebut salah satunya yaitu dalam pengiriman pesan, namun seiring dengan itu semua masalah pun bermunculan. Salah satunya dalam bidang keamanan dan kerahasiaan data atau pesan yang disampaikan melalui media komunikasi.

(14)

2 berhak. Saat ini lebih dikenal dengan proses enkripsi. Enkripsi adalah Suatu teknik untuk membuat pesan menjadi tidak dapat dibaca dan proses yang merupakan kebalikan dari enkripsi disebut sebagai dekripsi[9].

Pada proses enkripsi atau deskripsi tersebut pesan yang dikirim akan ditransformasikan ke dalam bentuk barisan binari dan akan menghasilkan pesan yang berupa cipherteks yang mengandung barisan binari pula. Dalam ilmu kriptografi kerandoman pada barisan binari juga berpengaruh terhadap keamanan dan kerahasian sebuah data atau pesan. Maka pada penulisan skripsi ini penulis ingin mengetahui apakah barisan binari pada cipherteks yang dihasilkan oleh hasil enkripsi pada algoritma DES merupakan barisan yang random.

1.2Rumusan Masalah

Masalah yang akan dibahas pada penelitian ini adalah menguji tingkat kerandoman bit atau tingkat keacakan pada hasil enkripsi DES.

1.3Tujuan Penelitian

(15)

3

1.4Batasan Masalah

Penelitian tugas akhir ini dibatasi hanya pada ciperteks hasil enkripsi pada algoritma DES dengan menggunakan beberapa uji statistik yang telah ditetapkan oleh NIST.

1.5Manfaat Penelitian

(16)

4

BAB II

LANDASAN TEORI

2.1 Kriptografi dan Algoritma Kriptografi

Kriptografi berasal dari bahasa yunani, menurut bahasa kriptografi dibagi menjadi dua yaitu kripto dan graphia, kripto berarti secret (rahasia) dan graphia berarti writing (tulisan). Menurut terminologinya kriptografi adalah ilmu dan seni untuk menjaga keamanan pesan ketika pesan dikirim dari satu tempat ke tempat yang lain[1].

Algoritma ditinjau dari asal usul kata, Algoritma muncul di dalam kamus Webster sampai akhir tahun 1957 hanya menemukan kata algorism yang mempunyai arti proses perhitungan dengan bahasa Arab. Algoritma berasal dari nama penulis buku Arab yang terkenal yaitu Abu Ja’far Muhammad ibnu Musa al-Khuarizmi. Kata algorism lambat laut menjadi algorithm.

Dalam terminologinya Algoritma adalah urutan langkah-langkah logis untuk menyelesaikan masalah yang disusun secara sistematis[3]. Algoritma kriptografi merupakan langkah-langkah logis bagaimana menyembunyikan pesan dari orang-orang yang tidak berhak atas tersebut. Algoritma kriptografi terdiri dari tiga fungsi dasar yaitu:

(17)

5 b. Dekripsi: Dekripsi merupakan kebalikan dari enkripsi, pesan yang telah

dienkripsi dikembalikan kebentuk asalnya (plaintext).

c. Kunci: Kunci yang dimaksud adalah kunci yang dipakai untuk melakukan enkripsi dan dekripsi, kunci terbagi menjadi dua bagian kunci pribadi (Private key) dan kunci umum (public key).

Algoritma kriptografi dibagi menjadi tiga bagian berdasarkan dari kunci yang dipakainya[4]:

1. Algoritma Simetri

Algoritma ini sering disebut dengan algoritma klasik, karena memakai kunci yang sama untuk kegiatan enkripsi dan dekripsinya. Algoritma yang menggunakan kunci simetri diantaranya; Data Encryption Standard (DES), RC2, RC4, RC5, RC6, International Data Encryption Algorithm (IDEA), Advanced Encryption Standard (AES), One Time Pad (OTP), A5, dan lain sebagainya.

2. Algoritma Asimetri

Algoritma Asimetri sering disebut dengan algoritma kunci _inary. Pada algoritma asimetri kunci terbagi menjadi dua bagian:

(18)

6 b. Kunci pribadi (Private key): kunci yang dirahasiakan (hanya boleh

diketahui satu orang). 3. Hash Function (Fungsi Hash)

Fungsi hash sering disebut dengan fungsi hash satu arah (one-way function), message digest, fingerprint, fungsi kompresi dan message

authentication code (MAC), hal ini merupakan suatu input matematika

yang mengambil input panjang _inary_e dan mengubahnya ke dalam urutan panjang _inary yang tetap. Fungsi hash biasanya digunakan untuk membuat sidik jari dari suatu pesan.

2.2 Data Encryption Standard (DES)

Data Encryption Standard (DES) ditetapkan oleh FIPS sebagai suatu

algoritma kriptografi yang telah disetujui dan digunakan oleh FIPS 140-1. DES dipublikasikan dalam rangka menyediakan sebuah gambaran komplit dari sebuah algoritma matematika untuk mengenkrip dan mendekrip informasi kode biner. Data Encryption Standard (DES) diadopsi tahun 1977 oleh National Bureau of Standard, sekarang National Institute of Standards and Technology

(19)

7 keluaran 64-bit. Dengan langkah dan kunci yang sama digunakan sebagai proses kebalikan dari enkripsi (dekripsi).

Pada awal tahun 1960-an, IBM mengadakan sebuah projek penelitian yang memegang peranan penting dalam kriptografi komputer oleh Horst Feistel. Projek tersebut telah ditandatangani pada tahun 1971, pada perkembangan terakhir algoritma tersebut ditandai dengan LUCIFER, yang telah dijual kepada L1oyd’s of London untuk digunakan dalam sistem penarikan uang . LUCIFER adalah chiper blok Feistel yang beroperasi pada blok-blok 64-bit menggunakan kunci berukuran 128-bit. Karena hasil yang diciptakan oleh projek LUCIFER memberikan harapan , IBM telah memulai sebuah usaha untuk mengembangkan sebuah produk enkripsi komersial yang dapat dipasarkan yang lebih ideal yang dapat dilaksanakan pada single chip. Usaha tersebut dikepalai oleh Walter Tuchman dan Carl Meyer, usaha itu tidak hanya meliputi para peneliti dari IBM saja tapi juga konsultan dari pihak luar serta penasehat teknikal dari NSA. Hasil dari usaha ini merupakan penghalusan dari versi LUCIFER yang lebih resisten terhadap kriptanalisis dengan meredusi ukuran kunci menjadi 56-bit yang sesuai dengan single chip.

(20)

8

Operasi Mode-mode pada Blok Chiper

Algoritma DES adalah dasar pembentukan blok untuk memberikan keamanan data. Empat mode operasi yang telah dikembangkan untuk DES. Empat mode ini sebenarnya diperuntukkan untuk melindungi semua kemungkinan aplikasi-aplikasi yang digunakan untuk mengenkripsi dengan menggunakan model DES. Akan tetapi, NIST telah mengembangkan daftar mode-mode yang telah direkomendasikan menjadi lima mode. Mode-mode tersebut adalah[7]:

1. Mode Electronic Code Book (ECB)

Mode ECB suatu blok cipher yang panjang dibagi dalam bentuk sequence binary menjadi satu blok tanpa mempengaruhi blok-blok yang lain, tiap blok

terdiri dari 64 bit atau 128 bit, setiap blok dienkripsi dengan menggunakan kunci yang sama. Pada mode ini untuk pesan yang lebih panjang dari 64 bit prosedur yang digunakan adalah dengan membagi pesan menjadi blok-blok dengan panjang 64 bit dan menambahkannya pada blok terakhir jika dibutuhkan. Sifat yang paling mendasar pada mode ECB adalah blok plainteks yang sama akan dikodekan menjadi cipherteks yang sama. Sehingga kelemahan pada mode ini yaitu penukaran pesan yang sedang dikirim sudah bisa diterka apa kira-kira isi pesan tersebut.

2. Mode Cipher Blok Chaining (CBC)

(21)

9 berhubungan dengan blok cipher yang lain. Melainkan tergantung pada cipher sebelumnya. Pada mode CBC, input untuk enkripsi merupakan hasil dari XOR antara plainteks dengan cipherteks sebelumnya dan menggunakan kunci yang sama pada setiap blok. Bentuk formal dari mode CBC yaitu:

C1 = Ek (IV ⊕ P1) P1 = IV ⊕ Dk+ (C1) dengan C1 = cipherteks ke-1

Ek= enkripsi Dk= dekripsi P1 = plainteks ke-1 IV = initialization vector

3. Mode Cipher Feed Back (CFB)

(22)

10 Enkripsi terdiri dari input yang lama digeser ke kiri sejauh 8 bit. Kekosongan 8 bit ini akan diisi oleh text cipher sebelumnya. Input enkripsi mula-mula adalah Initialization Vector (IV). Salah satu kerugian mode CFB adalah perambatan kesalahan. Jika satu blok cipher mengalami kesalahan ketika di saluran, maka blok-blok berikutnya akan terpengaruh. Secara matematis, CFB dapat dinyatakan sebagai berikut:

Ci = Pi ⊕ Ek ( Ci-1) Pi = Ci ⊕ Ek (Ci-1) dengan Ci = cipherteks ke-i

Ek = enkripsi

Dk = dekripsi

Pi = plainteks ke-i

4. Mode Output Feed Back (OFB)

(23)

11 5. Mode Counter (CTR)

Nilai counter dalam proses enkripsi harus berbeda untuk setiap blok plainteks. Counter adalah beberapa nilai awal lalu ditambahkan dengan 1 untuk setiap subbarisan blok (modulo 2b, dimana b merupakan ukuran blok). Untuk proses enkripsi, counter dienkripsi lalu di XOR-kan blok plainteks untuk memperoleh blok cipherteks. Untuk proses dekripsi digunakan barisan nilai counter yang sama, stiap counter yang telah dienkripsi dan di-XOR-kan dengan blok cipherteks untuk memperoleh kembali blok plainteks yang sesuai.

2.3 Bentuk-bentuk Uji Statistik

Pada proses pengujian kerandoman pada barisan binari bentuk–bentuk uji statistik yang digunakan antara lain sebagai berikut[5]:

a. Fungsi Standar Normal (Distribusi Kumulatif)

Fungsi standar normal (distribusi kumulatif) merupakan fungsi normal untuk mean μ = 0 dan varian σ2 = 1, secara matematis dapat dituliskan sebagai berikut:

∞ −

− =

Φ z u

du e

z 2/2

2 1 ) (

(24)

12 di mana π = 3.14159

z = Variabel random Z dengan N(0,1)

(Z memilki distribusi normal dengan mean μ = 0 dan varian σ2

= 1)

u = Variabel pengintegrasi ( dengan u =( x – μ) / σ)

) (z

Φ = Fungsi distributif kumulatif normal standar dari z

b. Fungsi Gamma

dt e z

z

z t

∞ − − = Γ 0 1 ) (

di mana t = variabel random

z = parameter (merupakan bilangan bulat positif) Γ(z) = Fungsi gamma pada z

c. Fungsi Gamma Tidak Komplit

− − Γ

≡ Γ

x t a

dt t e a a x a x a P 0 1 ) ( 1 ) ( ) , ( ) , ( γ

dengan P(a,0) = 0 dan P(a,) = 1

di mana P(a,x) = fungsi gamma tidak komplit a = nilai parameter

(25)

13

d. Distribusi Chi-Square

= (( )/ )

2

i i i e e

o χ

di mana: oi = frekuensi kejadian

ei = frequensi observasi dalam satu waktu tertentu secara

berturut-turut

e. Distribusi Normal Standar

z = (x – μ)/σ2

di mana: x = sampel nilai uji statistik. μ = nilai mean pada uji statistik

σ2

= nilai varian pada uji statistic

f. Teorema Central Limit

Definisi Teorema Central Limit adalah jika X1, X2, …, Xn adalah contoh

random dari sebuah distribusi normal dengan mean μ dan varian σ2

, variabel random,

{

a

}

e dx

P a x

n n X X n

n /2

2 1 2 1 lim − ∞ − − + + ∞ → σ ≤ =

π μ Λ

Jika =

n=

i i

n X

S

1 , di mana X1, X2, …, Xn adalah distribusi yang

(26)

14 E[Xi], di mana teorema central limit menyatakan bahwa Sn mempunyai

asimtotik distribusi normal sebagai n→∞

2.4 Hipotesis, Nilai Kritikal, dan Level Signifikan

Analisis hipotesis uji statistik kerandoman bit pada DES adalah: Hipotesis null (H0) adalah bentuk barisan yang di ujikan random

Hipotesis alternatif (Ha ) adalah bentuk barisan yang di ujikan tidak random Untuk setiap uji yang digunakan akan menghasilkan sebuah keputusan atau kesimpulan dimana apakah hipotesis null tersebut diterima atau ditolak, artinya apakah generator itu menghasilkan nilai yang random atau tidak dari input barisan yang telah dihasilkan.

Nilai kritikal adalah nilai yang terdapat pada daerah penolakan pada hipotesis.

Jika data yang di ujikan random maka kesimpulan untuk menolak H0 atau presentase terjadinya bahwa data tersebut tidak random kecil disebut tipe error I. Probabilitas dari tipe error I disebut level signifikan. Nilai level signifikan (α) yang lazim digunakan adalah 0.01. Level signifikan (α) pada uji statistik hipotesis H0 adalah probabilitas H0 di tolak pada hal H0 tersebut bernilai benar[9].

(27)

15

2.5 Deskripsi Teknis dari Uji-uji

Deretan uji NIST yaitu sebuah paket statistik yang mengandung 16 uji. Di mana uji-uji tersebut dikembangkan untuk menguji kerandoman barisan binari (panjang berubah-ubah) yang dihasilkan oleh hardware dan software dengan input dari hasil kerandoman pada kriptografi atau pseudorandom number generator. [5] menyatakan ada16 uji:

1. The Frequency (Monobit) Test

2. Frequency Test within a Block

3. The Runs Test

4. Test for Longest-Run-of-Ones in a Block

5. The Binary Matrix Rank Test

6. The Discrete Fourier Transform (Spectral) Test

7. The Non-Overlapping Tempate Matching Test

8. The Overlapping Tempate Matching Test

9. Maurer’s “Universal Statistical” Test

10.The Lempel-Ziv Copression Test

11.The Linear Complexity Test

12.The Serial Test

13.The Aproximate Entropy Test

14.The Cumulative Sums (Cumsums) Test

15.The Random Excurtions Test

(28)

16

2.5.1 Uji Frekuensi (Monobit)

Uji ini diperoleh dari teorema Central Limit untuk random walk, n

n X X

S = 1 +Λ + . Berdasarkan teorema Central Limit:

∞ − − ∞ → ≤ =Φ ≡ z u n S

n P z z e du

n /2

2 1 2 ) ( ) ( lim π

Secara tidak langsung menyatakan bahwa, untuk z positif:

1 ) ( 2 | | − Φ = ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛

z z

n S P n

Berdasarkan dasar pengujian pada statistik

n S

s= n , menaksir

nilai observnya s(obs) = X1 +Κ +Xn / n, dan maka dapat dihitung P-value adalah 2

[

1−Φ

(

s(obs)

)

]

=erfc

(

s(obs)/ 2

)

, di mana erfc adalah komplemen dari fungsi error.

erfc z e du z

u

= 2 2

) (

π ………(1)

2.5.2 Uji Frequensi Within a Block

(29)

17

χ

2

[

]

2

1 2 1 4 ) ( =

N i M obs π

di bawah hipotesis kerandoman yang memiliki distribusi

χ

2 dengan derajat kebebasan N.

Didapat P-value yaitu

) 2 ...( ... ... ... 2 ) ( , 2 ) 2 / ( 2 ) 2 / ( 2 ) ( 1 2 / 2 / ) ( 1 2 / 2 / 2 2 ⎟⎟ ⎠ ⎞ ⎜⎜ ⎝ ⎛ = Γ = Γ

∞ Χ − − ∞ Χ − − obs N igamc N du u e N du u e obs N u N obs N u χ

2.5.3 Uji Runs ( Runs Test)

Uji runs merupakan salah satu uji nonparametrik. Runs didefinisikan sebagai substring yang angka 1-nya berturut-turut dan angka 0-nya berturut-turut dan untuk menentukan apakah pergerakan (osilasi) antara setiap substring yang bersifat homogen tersebut bersifat cepat atau lambat.

Uji spesifik di sini didasarkan pada distribusi total bilangan runs.

Di mana

=

j n

j ε

π

(dengan π mendekati 0.5:

n 2 2 1 ≤ − π ). ) ( ) 1 ( ) 1 ( 2

limP Vn n z z

n ⎟⎟⎠=Φ

(30)

18 Untuk menaksir Vn, didefinisikan untuk k = 1, . . . , n-1, r(k) = 0 jika ∈k=∈k+1 dan r(k) = 1 jika ∈k≠∈k+1. Maka =

=1 +

1 ( ) 1

n k

n r k

V .

Didapat P-value adalah

⎟⎟ ⎠ ⎞ ⎜⎜

⎝ ⎛

− − −

) 1 ( 2 2

) 1 ( 2 ) (

π π

π π n

n obs V

erfc n ……….(3)

Jika nilai dari Vn besar mengindikasikan bahwa proses osilasi pada

(31)

19

BAB III

PENGUMPULAN DAN PENGOLAHAN DATA

3.1 Kerandoman (Randomnes)

Sebuah barisan binari random dengan panjang k akan menghasilkan sebuah barisan binari dengan panjang l >> k yang merupakan barisan yang random pula. Barisan input yang dibangkitkan disebut dengan bibit sedangkan outputnya disebut dengan barisan pseudorandom bit. Sebuah mekanisme pokok untuk menghasilkan data yang benar-benar random disebut dengan Random Number Generator (RNG).

Barisan random binari merupakan sebuah barisan bit dimana untuk setiap bit “ 0 ” atau “ 1 ” memiliki probabilitas ½ dan nilai untuk setiap bit adalah saling bebas antara bit yang satu dengan bit-bit yang lain dalam sebuah barisan dengan kata lain bahwa untuk setiap bitnya tidak dapat diprediksikan[5].

3.2 Pengambilan Data

(32)

20

3.3 Pengolahan Data

3.3.1 Uji Frekuensi (Monobit)

Tujuaan dari uji frequensi (monobit) adalah menentukan apakah barisan bilangan jumlah antara binari 0 dan 1 sama atau benar-benar merupakan deretan yang random.

Frequensi(n), di mana:

n : adalah panjang bit string.

ε : adalah barisan bit-bit yang telah dibangkitkan oleh uji RNG atau PRNG, ε =ε12,Κ,εn

Sobs : Jumlah nilai absolut pada Xi (dimana Xi = 2 i -1 = ± 1) dalam

suatu barisan dibagi dengan akar dari panjang suatu barisan.

Langkah-langkah pengujian

a. Ubah ke ± 1: 0 dan 1 pada input barisan (ε) diubah ke nilai -1 dan +1 dan keduanya dijumlahkan bersama sehingga menghasilkan Sn = X1 + X2 + …+ Xn, dimana Xi = 2εi – 1

Contoh: Jika = 1011010101, maka n = 10

Sn = 1 + (-1) + 1 + 1 + (-1) + 1 + (-1) + 1 + (-1) + 1 = 2

b. Menghitung uji statistik Sobs = |Sn| / n.

Sobs =

10 | 2 |

(33)

21 c. Menghitung P-value = erfc

⎠ ⎞ ⎜ ⎝ ⎛

2 obs S

, dimana erfc adalah

fungsi error yang melengkapi.

P-value = erfc

⎠ ⎞ ⎜

⎝ ⎛

2 632455532 .

0

= 0.527089

d. Kaidah keputusan (pada level 1%), jika P-value yang dihitung kurang dari 0.01 maka disimpulkan bahwa barisan tersebut tidak random. Sebaliknya, disimpulkan bahwa barisan itu random[5].

Kesimpulan: karena P-value ≥ 0.01 yaitu 0.527089 ≥ 0.01, maka disimpulkan bahwa barisan tersebut adalah random.

3.3.2 Uji Frekuensi dalam Sebuah Blok

Tujuan dari pengujian ini adalah untuk menentukan apakah frekuensi 1 dalam sebuah M-bit blok adalah kira-kira M/2, yang diharapkan dibawah sebuah asumsi kerandoman.

Blok frequensi (M,n), di mana:

M : adalah merupakan panjang sebuah blok.

n : adalah panjang bit string.

(34)

22

2

χ : sebuah ukuran bagaimana satu bagian diobservasi dengan baik dengan diberikan M-bit blok pada bagian yang diharapkan (1/2).

Distribusi yang digunakan pada uji ini adalah distribusi

2

χ

Langkah-langkah pengujian:

a. Partisi barisan input menjadi N = [n / M] blok-blok yang tidak overlapping, buang bit yang tidak terpakai.

Contoh: jika n = 10, M = 3 dan = 0110011010

N = 3

3 10 = ⎥⎦ ⎤ ⎢⎣ ⎡ = ⎥⎦ ⎤ ⎢⎣ ⎡ M n

, dimana 3 bloknya ( N = 3) adalah

011, 001, 101, dan sisa bit terakhir pada barisan dihilangkan.

b. Tentukan proporsi πi pada setiap M-bit blok menggunakan persamaan: N i untuk M j M i M j

i ≤ ≤

+ − =

= 1 , ) 1 ( 1 ε π 3 3 (1 1)3

1 1 1 2 3

1

0 1 1 2

3 3 3 3 3

j j j j ε ε ε ε ε π =

= − + =

= = + + = + + = 3 3

(2 1)3 3

1 1 4 5 6

2

0 0 1 1

3 3 3 3 3

j j

j j

ε ε

ε ε ε

(35)

23

3 3

(3 1)3 6

1 1 7 8 9

3

1 0 1 2

3 3 3 3 3

j j

j j

ε ε

ε ε ε

π =

= − + =

= + = + + = + + =

Hitung statistikχ2: χ2(obs) = 4M

= − N t i 1 2 2 1 )

(

) (

) (

)

(

)

1

3 4 )

( 23 12 2

2 2 1 3 1 2 2 1 3 2

2 = × × − + − + − =

obs χ

c. Hitung P-value =igamc(N/2,χ2(obs)/2), dimana igamc

adalah fungsi gamma tidak lengkap untuk Q(a, x). P-value = igamc

( )

,21 0.801252

2

3 =

d. Kaidah keputusan (pada level 1%), jika P-value yang dihitung < 0.01 maka disimpulkan bahwa barisan tersebut tidak random. Sebaliknya , disimpulkan bahwa barisan itu random.

Karena P-value ≥0.01, yaitu 0.801252 ≥ 0.01, maka disimpulkan bahwa barisan tersebut adalah random.

3.3.3 Uji Runs

(36)

24 menentukan apakah panjang dari variasi satu dan nol pada bilangan runs merupakan barisan yang random.

Runs(n), di mana:

n : panjang bit string

ε

: adalah barisan bit-bit yang telah dibangkitkan oleh uji RNG atau PRNG, ini ada sebagai struktur global pada waktu pemanggilan fungsi; ε =ε12,Λ ,εn.

Vn(obs) : total bilangan runs (yaitu total bilangan nol runs

ditambah dengan total bilangan satu-runs) jarak lintasan semua n bit-bit.

Uji statistik pada uji ini menggunakan distribusi χ2

Langkah-langkah pengujian

a. Hitung pre-tes bagian π satu dalam barisan input:

n j j

= ε

π

Contoh: jika ε = 1001101011, maka n= 10

n j j

= ε

π

1 2 3 4 5 6 7 8 9 10

1 0 0 1 1 0 1 0 1 1 6 3

10 10 5

n

ε ε ε ε ε ε ε ε ε ε

π = + + + + + + + + +

+ + + + + + + + +

= = =

(37)

25 b. Tentukan jika prasyarat uji frequensi telah dilalui: jika dapat ditunjukan |π – 1/2| ≥τ, maka uji runs tidak dapat dilakukan (yaitu uji harus tidak run). Jika uji tidak aplikabel, maka P-value adalah hinpunan 0.0000, di mana = 2 / n.

63246 . 0 10 2 =

τ , maka |π-1/2| = |3/5 –1/2| =

0.1, karena 0.1< , dan uji adalah tidak run.

c. Hitung uji statistik =

=1 +

1 ( ) 1

) ( n

k n obs r k

V , di mana

r(k) = 0 jika εkk+1 dan r(k) = 1 jika sebaliknya. Karena ε = 1001101011, maka

V10(obs ) = (1+0+1+0+1+1+1+1+0)+1=7

d. Hitung P-value = erfc

⎠ ⎞ ⎜ ⎜ ⎝ ⎛ − − − ) 1 ( 2 2 ) 1 ( 2 ) ( π π π π n n obs Vn

P-Value =erfc

(

(

)

)

(

)

⎟⎟ ⎠ ⎞ ⎜ ⎜ ⎝ ⎛ − • • • • − • • − 5 3 5 3 5 3 5 3 1 10 2 2 1 10 2 7 = 0.147232

e. Kaidah keputusan (pada level 1%), jika P-value < 0,01 maka barisan adalah tidak random, dan sebaliknya.

(38)

26

BAB IV

UJI KERANDOMAN BIT PADA DES

Pada bab ini akan dijelaskan analisis data yang dihasilkan setelah proses enkripsi. Analisis ini dilakukan untuk mengetahui kerandoman dari suatu barisan bit pada barisan input dan output pada DES. Barisan bit yang digunakan terdiri dari beberapa kata, satu kalimat, dan satu paragraf dengan jumlah bilangan binar yang berbeda akan tetapi menggunakan kunci yang sama. Pengujian pertama yang dilakukan adalah uji monobit, kemudian uji frequensi within a block, uji run, dan uji cumulative sum (cumsum).

4.1 Analisis Hasil

Untuk mengetahui kerandoman bit pada input dan output proses enkripsi algoritma DES, plainteks maupun chiperteks ditransformasikan ke dalam bentuk hexadesimal kemudian ditransformasikan kembali ke dalam bentuk bilangan binari.

Plainteks yang akan digunakan untuk proses enkripsi diberikan pada lampiran 1.

(39)

27

4.1.1 Uji kerandoman Bit dengan Uji Statistik Monobit

Nilai Probabilitas (P-value) pada uji statistik kerandoman bit dengan menggunakan uji monobit dapat dilihat pada lamp. 4.

Dalam pengambilan keputusan kriteria yang digunakan adalah sebagai berikut:

Jika P-value < α (0.01), maka Ho ditolak Jika P-value ≥α(0.01), maka Ho diterima

Berdasarkan tabel P-value pada uji monobit untuk data input (plainteks) 81.67% barisan binarinya merupakan barisan yang random. Sedangkan untuk data output (chiperteks) 98.33% barisan binarinya merupakan barisan yang random.

Dari data hasil yang didapat bahwa rata-rata untuk barisan binari pada data input (plainteks) dan output (chiperteks) yang merupakan hasil enkripsi pada DES dengan panjang barisan bit 64 memiliki P-value yang cukup besar dan mendekati 1. Hal ini menunjukkan bahwa tingkat kesamaan antara barisan binari 1 dan 0 cukup besar. Sedangkan untuk data dengan input satu kalimat dan satu paragraf sebagian besar juga memiliki tingkat kesamaan antara binari 1 dan 0-nya dan sebagian memiliki tingkat kesamaan yang kecil antara binari 1 dan 0-nya.

(40)

28 pada barisan binari dengan P-value 0.0002 yang menandakan bahwa terjadinya perbedaan yang cukup besar antara jumlah barisan binari 1 dan 0, hal ini memungkinkan terjadinya lebih besarnya jumlah binari 1 daripada 0 dalam suatu barisan bit ataupun sebaliknya.

Untuk barisan bit yang merupakan hasil output proses enkripsi pada DES terlihat bahwa tingkat kesamaan tertinggi terjadi pada barisan bit dengan P-value 0.8700. Pada hasil output enkripsi tingkat kesamaan terkecil antara barisan binari 1 dan 0 terjadi pada P-value 0.0016, hal ini menunjukkan bahwa pada chiperteks hasil enkripsi pada DES terdapat ketidaksamaan pada barisan binari antara binari 1 dan binari 0. Pada hasil output enkripsi tidak terjadi perbedaan jumlah antara binari 1 dan 0 yang cukup besar.

4.1.2 Uji Kerandoman Bit dengan Frekuensi dengan Sebuah Blok

Nilai Probabilitas (P-value) pada uji statistik kerandoman bit dengan uji frekuensi within a block dapat dilihat pada lamp. 4.

Dalam pengambilan keputusan kriteria yang digunakan adalah sebagai berikut:

(41)

29 Berdasarkan tabel P-value pada uji frekuensi dengan sebuah blok untuk data input (plainteks) maupun data output (chiperteks) 100% barisan binarinya merupakan barisan yang random.

Dari data hasil yang didapat pada lampiran 4 untuk data input (plainteks) P-value terbesar adalah 0.9988 dengan nilai uji statistik 210. tingkat P-value terkecil adalah 0.0173 dengan nilai uji statistik adalah 30.

Untuk hasil output enkripsi (chiperteks) DES didapat nilai terbesar value adalah 0.9876 dengan nilai uji statistik terkecil adalah 8. Nilai

P-value terkecil adalah 0.0110 dengan nilai statistik 167.

4.1.3 UJi Kerandoman Bit dengan Uji Statistik Run

Nilai Probabilitas (P-value) pada uji statistik kerandoman bit dengan uji run dapat dilihat pada lamp. 4.

Dalam pengambilan keputusan kriteria yang digunakan adalah sebagai berikut:

Jika P-value < α (0.01), maka Ho ditolak Jika P-value ≥α(0.01), maka Ho diterima

(42)

30 Berdasarkan data hail yang didapat pada lamp. 4 diketahui bahwa untuk data input (plainteks) terdapat ketidak randoman yang terbesar terjadi pada data input (plainteks) satu paragraf dengan nilai uji statistik 636 dan 612 dan P-value 0.0003.

Untuk data hasil output (chiperteks) proses enkripsi DES berdasarkan nilai P-value untuk barisan binari yang diujikan adalah random. Kerandoman terbesar terjadi pada P-value 0.9750 dengan nilai uji statistik 32 dengan jumlah data 64.

(43)

31

BAB V

KESIMPULAN DAN SARAN

5.1 Kesimpulan

Analisis kerandoman yang dilakukan pada barisan binari input (plainteks) dan output (chiperteks) pada proses enkripsi kriptografi dengan menggunakan algoritma DES (Data Encryption Standard) . Dapat disimpulkan bahwa nilai p-value untuk uji monobit pada barisan binari pada input (plainteks) merupakan

barisan yang random. Untuk output hasil enkripsi pada algoritma DES berdasarkan nilai p-value didapat bahwa barisan binari yang dihasilkan merupakan barisan yang random, dengan tingkat kesamaan antara binari 1 dan 0 lebih besar dari barisan binari pada data input .

Pada uji frekuensi within a block didapat bahwa barisan binari input (plainteks) dan output yang diujikan merupakan barisan yang random. Dimana, pada barisan binari output frekuensi binari 1 lebih sedikit dibandingkan dengan frekuensi 1 pada barisan binari input.

(44)

32

5.2 Saran

(45)

33

REFERENSI

[1] Ariyus, Dony. Kriptografi Keamanan Data dan Komunikasi. Graha Ilmu: September 2005.

[2] Hogg, Robert V. and Allen T. Craig. Introduction to Mathematical Statistics. New Jersey: Prentice-Hall, inc. 1995.

[3] Komputer, Wahana. Memahami Model Enkripsi dan Security Data. Yogyakarta: ANDI OFFSET. 2003.

[4] Munir, Rinaldi. Kriptografi. Bandung: Penerbit Informatika.2005.

[5] NIST. A Statistical Test Suite for Random and Pseudorandom Number Generators for Cryptographic Application. United State of America: 2001.

[6] Raharjo, Budi. Keamanan Sistem Informasi Berbasis Internet. Jakarta-Bandung: PT.INDOCISC-PT. Insan Infonesia. 1998-2002.

[7] Wagstaff, Samuel S. Crytanalysis of Number Theoretic Chiper. New York: Champman & Hall/CRC. 2003.

[8]

[11/03/07 01:14:35 AM]

[9]

(46)

34

(47)

35 Lampiran 1 Plainteks dan Chiperteks dengan Menggunakan Kunci yang Sama

Kunci (Teks)

Browser

Kunci (Heksadesimal)

42726F77736572

Plainteks Delapan Huruf dalam Bentuk Teks

1. resolusi

2. Marcella

3. dilansir

4. memasang

5. berpesan

Plainteks Satu Kalimat dalam Bentuk Teks

1. Puluhan aset milik Pemprov DkI Jakarta terancam lepas. 2. Manfaat ASI sangat luar biasa.

3. Manusia tak boleh dikotak-kotakkan.

4. Penetapan perolehan kursi dilkukan antara 19-20 Mei.

5. Pemerintah Bekasi Alokasikan Rp 3 miliar untuk pasien gakin.

Plainteks Satu Paragrap dalam Bentuk Teks

(48)

36 2. Dalam rangka memperingati Hari Kartini pada 21 April 2009, polisi wanita (polwan) yang bertugas di Samsat Kota Depok mengenakan kebaya. Para polwan tersebut ditempatkan dipintu masuk kantor Samsat Kota Depok. 3. Menurut Maswadi, SBY akan lebih nyaman jika berkoalisi dengan Partai

Golkar. Jika Partai Golkar dan Demokrat berkoalisi maka akan berat bagi capres lain.

4. Persijap Jepara mengklaim menderita kerugian Rp 600 juta. Jumlah ini muncul akibat siaran lamgsung televisi dari tiga pertandingan home terarikhir.

5. Toyota F1 membuat keputusan mengejutkan. Tim bermarkas di cologne, Jerman, itu menyatakan mundur dari ajang balap jet darat tahun depan.

Plainteks Delapan Huruf yang Dikonfirmasi ke dalam Bentuk

Heksadesimal

1. 7265736F6C757369 2. 4D617263656C6C61 3. 64696C616E736972 4. 6D656D6173616E67 5. 626572706573616E

Plainteks Satu Kalimat yang Dikonfirmasi ke dalam Bentuk Heksadesimal

(49)

37 2. 4D616E757369610074616B07626F6C65680864696B6F74616B2D6B6F74

616B6B616E2E

3. 50656E65746170616E007065726F6C6568616E076B757273690864696C61 6B756B616E0A616E746172610D31392D3230204D65692E

4. 50656D6572696E7461680042656B61736907616C6F6B73696B616E08527 00A330D6D696C69617220756E74756B0070617369656E0767616B696E2 E

5. 496E766573746F72006D61736968076D656E616E74696B616E0870656E6 7756D756D616E0A5468650D46656420736F616C0073756B750762756E6 7612E

Plainteks Satu Paragraf yang Dikonfirmasi ke dalam Bentuk Heksadesimal

1. 50617369656E0067616B696E0774696E6767616C086D6173756B2E0A426 96179610D72756D61682073616B69746E796100646974616E67677566E67 0741425042442E08536174750A6F72616E670D70617369656E206D656E6 461706174007375627369646907527008340A6A7574612E

(50)

38 076D6173756B084B616E746F720A53616D7361740D4B6F746120446570 6F6B2E

3. 4D656E757274004D6173776164692C0753425908616B616E0A6C6562696 80D6E79616D616E206A696B61006265726B6F616C6973690764656E676 16E085061727461690A476F6C6B61722E0D4A696B612050617274616900 44656D6F6B7261740764616E085061727461690A476F6C6B61720D62657 26B6F616C697369206D616B6100616B616E07626572617408626167690A 6361707265730D6C61696E2E

4. 50657273696A6170004A6570617261076D656E676B6C61696D086D656E 6465726974610A6B6572756769616E0D527020363030006A7574612E074 A756D6C616808696E690A6D756E63756C0D616B6962617420736961726 16E006C616E6773756E670774656C657669736908646172690A746967610 D70657274616E64696E67616E20686F6D6500746572616B6869722E

5. 546F796F7461004631076D656D62756174086B657075747573616E0A6D6 56E67656A75746B616E2E0D54696D206265726D61726B6173006469074 36F6C6F676E652C084A65726D616E2C0A6974750D6D656E796174616B 616E206D756E647572006461726907616A616E670862616C61700A6A657 40D646172617420746168756E00646570616E2E

Chiperteks Delapan Huruf dalam Bentuk Heksadesimal

(51)

39 4. 41007C4E13F43FAC

5. D0E6A963CFE8E7AE

Chiperteks Satu Kalimat dalam Bentuk Heksadesimal

1. 9A3112F8B5148A58F077679402C55320544AB5D4CCA81755387452A56 5D996E5D5E0ABAB2F8FDDFA335B81B0780A02187BBBD9C724285E6 8

2. 16A0162DDE5D164E88FAA32F52364627D71C279A6E67C20B88650BD 70763FB0C

3. 733C580CE6B3ECC48B34B1CDB3E53990E04E49FC80F34B96E529F850 5E7B03F5

4. 084BD7CFD7F23C09CFF80EB3CF7912A996A7639CBF06052D41FE983 EC0DBEE75F10C29B124BC390F6ACA9E951EE2DB0229A3D09D8E62 A857

5. A053258314DFD28AFCF364F9B2577C0C98BA8DA41203EC00E65008D 16B3EF62F4FB27914FD30EA5F37B2B46BF2CA6143833F0120DB25DD 6C01BC5E9EEDB0

Ciperteks Satu Paragraf dalam Bentuk Heksadesimal

(52)

40 257BCCEC27D895061CC288D7C62A2A67209A421DC8D42AED1BAE0 2E3D3E5FC

2. 45F14E17E27732F95E32381AEA6447257319F78CAB30B078CC7F78C0F C5FBB0190D2DD26438A7A553159D58C1524C0DD57DE00236E002E91 EFCB58CFFA8F1877F822BB6AEF1A13242C899EA9630801100E049B01 1BC5CF70C9DE855936C4036914EE2DB9675D8F7178D5B309ED00C91 66370C47A1861D19C2110D97E5D888989B032CAD06803F72024E0B9E 99BE231C9D296392F9BC2EEB15BF87C1C06B92A5252B54A70E2F6080 03E8A4FDDCE3A5D7B229F93A7A94DC73417C13AD6D95B1E13F1A0 B0FD25F0A8DDA4702AC8721F4F66140E1E5421BAB23CB

3. F75D0AF9047D669182631E02A6793B0A9E0CC2843D1B9AE8A807E0A AAB0C5F432A6B0C67C76D0C84A714339CEC2B68D3B7217A9FFC617 1710E7667394C92BBD57F7DF271A1082C421E2F88EE5A223CA1C3CF0 7BE370C397994E83F630716F7C000A0D1B099584DC47F7DF271A1082 C4222AC476049E54F500A5F0E9A368FEDDB406DF1EF4045741F85217 0211B177E08C7F853EF3C78FC722E7965ACF4CA568A

(53)

41 5. 7B529DBD4D7EF7BB0DD2E8E044FA6B99CD12B4BADD0EAB7229ED

(54)

42

Lampiran 2 Program Enkripsi dan Dekripsi Algoritma DES

/********************************************** *********************************************** DES Encrypt 0.0.2

by Sean Kane - http://celtickane.com

Coder's note: the concept and general instructions to construct this program were taken from http://www.aci.net/kalliste/des.htm. All the DES encryption used is based off this website.

Additionally, the general coding design of des_round was modeled after the a DES Javascript example (http://www.cs.eku.edu/faculty/styer/460/Encrypt/JS-DES.html) **********************************************

*********************************************/

//todo: check goto's on interface

#define debug_mode 0 #define super_debug 0 #define TRUE 1 #define FALSE 0

//Header file includes #include <stdio.h> #include <iostream.h> #include <stdlib.h> //exit() #include <string.h> //strlen() #include <conio.h> //getch() #include <math.h> //pow()

//Primary function prototypes (directly relate to DES)

void des_encrypt (int bufMsgBin[ ],int bufKeyBin[ ],char do_encrypt,int buffer_out[ ] );

void des_round(int bufferL[ ], int prev_bufferL[ ], int bufferR[ ], int prev_bufferR[ ], int bufferK[ ], int round); void permutate(int buffer[ ], int pt_list[ ], int pt_list_count, int outbits, int buffer_out[ ]);

void leftshift(int buffer[ ], int num_shifts, int buffer_out[ ]);

//Supplementary function prototypes void verifylength(char buffer[ ], int length); void chr2bin(char buffer_ascii[ ], int buffer_bin[ ]); void hex2bin(char buffer_hex[ ], int buffer_bin[ ]);

void print_binary(char title[ ], int buffer[ ], int size, int spacing, char sameline);

//Permutation tables int pt_pc1[ ] =

{57,49,41,33,25,17,9,1,58,50,42,34,26,18,10,2,59,51,43,35,27,19,11,3,60,52,44,36,63,55,47,39,31,23,15,7,62,54,4 6,38,30,22,14,6,61,53,45,37,29,21,13,5,28,20,12,4};

#define pt_pc1_count 56 int pt_pc2[ ] =

{14,17,11,24,1,5,3,28,15,6,21,10,23,19,12,4,26,8,16,7,27,20,13,2,41,52,31,37,47,55,30,40,51,45,33,48,44,49,39,56 ,34,53,46,42,50,36,29,32};

(55)

43

int pt_ip[ ] =

{58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8,57,49,41,33,25,17, 9,1,59,51,43,35,27,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,23,15,7};

#define pt_ip_count 64 int pt_ebit[ ] =

{32,1,2,3,4,5,4,5,6,7,8,9,8,9,10,11,12,13,12,13,14,15,16,17,16,17,18,19,20,21,20,21,22,23,24,25,24,25,26,27,28,29 ,28,29,30,31,32,1};

#define pt_ebit_count 48

int pt_p[ ] = {16,7,20,21,29,12,28,17,1,15,23,26,5,18,31,10,2,8,24,14,32,27,3,9,19,13,30,6,22,11,4,25}; #define pt_p_count 32

int pt_ip_1[ ] =

{40,8,48,16,56,24,64,32,39,7,47,15,55,23,63,31,38,6,46,14,54,22,62,30,37,5,45,13,53,21,61,29,36,4,44,12,52,20,6 0,28,35,3,43,11,51,19,59,27,34,2,42,10,50,18,58,26,33,1,41,9,49,17,57,25};

#define pt_ip_1_count 64

(56)

44 //S8 13,2,8,4,6,15,11,1,10,9,3,14,5,0,12,7, 1,15,13,8,10,3,7,4,12,5,6,11,0,14,9,2, 7,11,4,1,9,12,14,2,0,6,10,13,15,3,5,8, 2,1,14,7,4,10,8,13,15,12,9,0,3,5,6,11 }; int main() {

char bufMsgHex[16], bufMsgAscii[8]; //Message variables int bufMsgBin[64], bufKeyBin[64]; //Binary variables

char bufKeyHex[16], bufKeyAscii[8]; //Key variables int bufOutputBin[64], bufOutputHex[16], bufOutputAscii[8]; char chrPrompt, chrSecPrompt;

int i,j;

//The first thing we're concerned about is getting the user input //All the main() function does is process the initial input, parse it //into the data that we want, then call a function that will encrypt for(;;) {

printf("(E)ncrypt, (D)ecrypt, (Q)uit: "); chrPrompt = getchar();

switch( chrPrompt ) {

//********************************************** //Interface for encryption

//********************************************** case 'e': case 'E':

//Get the message from the user

fflush(stdin); //clear the garbage out of the input buffer printf("Is the message in (H)exidecimal or (A)scii? ");

gReevalEMsg: //If they didn't type in H or A...make them do it again chrSecPrompt = getchar();

switch( chrSecPrompt ) { case 'h': case 'H':

gEReenterMsgHex:

printf("Enter 16-digit hexidecimal message: "); scanf("%16s", bufMsgHex);

verifylength(bufMsgHex,16);

//Let's verify all the digits are hexidecimal... for(i=0;i<16;i++)

{

if( !(((bufMsgHex[i]>47) && (bufMsgHex[i]<58)) || ((bufMsgHex[i]>64) && (bufMsgHex[i]<71)) || ((bufMsgHex[i]>96) && (bufMsgHex[i]<103)))) {

printf("Hexidecimal numbers may only contain numbers 0-9 and letters A-F\n");

goto gReenterKeyHex;

}

}

hex2bin(bufKeyHex,bufKeyBin);

break;

case 'a': case 'A':

(57)

45

verifylength(bufKeyAscii,8); chr2bin(bufMsgAscii,bufMsgBin);

break;

default:

printf("Please type H or A:"); fflush(stdin); goto gReevalEMsg;

break;

}

if(debug_mode) { print_binary("Message binary: ",bufMsgBin,64,8, FALSE); }

//Get the key from the user

fflush(stdin); //clear the garbage out of the input buffer printf("Is the key in (H)exidecimal or (A)scii? ");

gReevalEKey: //If they didn't type in H or A...make them do it again chrSecPrompt = getchar();

switch( chrSecPrompt ) { case 'h': case 'H':

gReenterKeyHex:

printf("Enter 16-digit hexidecimal key: "); scanf("%16s", bufKeyHex); verifylength(bufKeyHex,16);

//Let's verify all the digits are hexidecimal... for(i=0;i<16;i++)

{

if( !(((bufKeyHex[i]>47) && (bufKeyHex[i]<58)) || ((bufKeyHex[i]>64) && (bufKeyHex[i]<71)) || ((bufKeyHex[i]>96) && (bufKeyHex[i]<103)))) {

printf("Hexidecimal numbers may only contain numbers 0-9 and letters A-F\n");

goto gReenterKeyHex;

}

}

hex2bin(bufKeyHex,bufKeyBin);

break;

case 'a': case 'A':

printf("Enter 8-digit ascii key: "); scanf("%8s", bufKeyAscii); verifylength(bufKeyAscii,8); chr2bin(bufKeyAscii,bufKeyBin);

break;

default:

printf("Please type H or A:"); fflush(stdin); goto gReevalEKey;

break;

}

if(debug_mode) { print_binary("Key binary: ",bufKeyBin,64,8, FALSE); } des_encrypt(bufMsgBin,bufKeyBin,TRUE,bufOutputBin); //Convert bufEncrypted to hex and ascii

printf("Hexidecimal output: "); for(i=0;i<16;i++) {

j = bufOutputBin[i*4] * 8 + bufOutputBin[i*4+1] * 4 + bufOutputBin[i*4+2] * 2 + bufOutputBin[i*4+3];

bufOutputHex[i] = j;

printf("%x",bufOutputHex[i]);

(58)

46

printf("\n"); break;

//********************************************** //Interface for decryption

//********************************************** case 'd': case 'D':

//Get the message from the user

fflush(stdin); //clear the garbage out of the input buffer printf("Is the ciphertext in (H)exidecimal or (A)scii? ");

gReevalDMsg: //If they didn't type in H or A...make them do it again chrSecPrompt = getchar();

switch( chrSecPrompt ) { case 'h': case 'H':

gDReenterMsgHex:

printf("Enter 16-digit hexidecimal ciphertext: "); scanf("%16s", bufMsgHex);

verifylength(bufMsgHex,16);

//Let's verify all the digits are hexidecimal... for(i=0;i<16;i++)

{

if( !(((bufMsgHex[i]>47) && (bufMsgHex[i]<58)) || ((bufMsgHex[i]>64) && (bufMsgHex[i]<71)) || ((bufMsgHex[i]>96) && (bufMsgHex[i]<103)))) {

printf("Hexidecimal numbers may only contain numbers 0-9 and letters A-F\n");

goto gDReenterMsgHex;

}

}

hex2bin(bufMsgHex,bufMsgBin);

break;

case 'a': case 'A':

printf("Enter 8-digit ascii ciphertext: "); scanf("%8s", bufMsgAscii);

verifylength(bufMsgAscii,8); chr2bin(bufMsgAscii,bufMsgBin);

break;

default:

printf("Please type H or A:"); fflush(stdin); goto gReevalDMsg;

break;

}

if(debug_mode) { print_binary("Ciphertext binary: ",bufMsgBin,64,8, FALSE); }

//Get the key from the user

fflush(stdin); //clear the garbage out of the input buffer printf("Is the key in (H)exidecimal or (A)scii? ");

gReevalDKey: //If they didn't type in H or A...make them do it again chrSecPrompt = getchar();

switch( chrSecPrompt ) { case 'h': case 'H':

gDReenterKeyHex:

printf("Enter 16-digit hexidecimal key: "); scanf("%16s", bufKeyHex); verifylength(bufKeyHex,16);

(59)

47

for(i=0;i<16;i++)

{

if( !(((bufKeyHex[i]>47) && (bufKeyHex[i]<58)) || ((bufKeyHex[i]>64) && (bufKeyHex[i]<71)) || ((bufKeyHex[i]>96) && (bufKeyHex[i]<103)))) {

printf("Hexidecimal numbers may only contain numbers 0-9 and letters A-F\n");

goto gDReenterKeyHex;

}

}

hex2bin(bufKeyHex,bufKeyBin);

break;

case 'a': case 'A':

printf("Enter 8-digit ascii key: "); scanf("%8s", bufKeyAscii); verifylength(bufKeyAscii,8); chr2bin(bufKeyAscii,bufKeyBin);

break;

default:

printf("Please type H or A:"); fflush(stdin); goto gReevalDKey;

break;

}

if(debug_mode) { print_binary("Key binary: ",bufKeyBin,64,8, FALSE); } des_encrypt(bufMsgBin,bufKeyBin,FALSE,bufOutputBin); //Output as hex and ascii

printf("Hexidecimal output: "); for(i=0;i<16;i++) {

j = bufOutputBin[i*4] * 8 + bufOutputBin[i*4+1] * 4 + bufOutputBin[i*4+2] * 2 + bufOutputBin[i*4+3];

bufOutputHex[i] = j;

printf("%x",bufOutputHex[i]);

}

printf("\nAscii output: "); for(i=0;i<8;i++) {

j = bufOutputBin[i*8] * 128 + bufOutputBin[i*8+1] * 64 +

bufOutputBin[i*8+2] * 32 + bufOutputBin[i*8+3] * 16 + bufOutputBin[i*8+4] * 8 + bufOutputBin[i*8+5] * 4 + bufOutputBin[i*8+6] * 2 + bufOutputBin[i*8+7];

bufOutputAscii[i] = j;

printf("%c",bufOutputAscii[i]);

}

printf("\n"); break; case 'q': case 'Q':

exit(1); break; default:

fflush(stdin); //clear the garbage out of the input buffer printf("Please type E, D, or Q\n");

break; } //end select

fflush(stdin); } //end for

(60)

48

//********************************************** //Primary functions -- directly relate to DES encryption //**********************************************

void des_encrypt(int bufMsgBin, int bufKeyBin, char do_encrypt, int buffer_out) { //buffer_out will contain the encrypted phrase

int bufKeyBin56[56], bufKeyC16[17][28], bufKeyD16[17][28], bufKeyCD56[17][56], bufKeyCD48[17][48]; //Key variables

int bufMsgBinIP[64], bufMsgBinL[17][32], bufMsgBinR[17][32], bufMsgBinRL[17][64]; int i,j;

//********************************************** //Step 1: Encode the 64-bit key

//********************************************** //***********************

//Step 1.1: permutate the 64-bit key into a 56-bit key using table pc_1 [verified] //***********************

permutate(bufKeyBin,pt_pc1,pt_pc1_count,56,bufKeyBin56);

if(debug_mode) { print_binary("After permutating the key with table pc_1: ",bufKeyBin56,56,7, FALSE); }

//***********************

//Step 1.2: split the 64-bit key into 2, 28-bit keys //***********************

for(i=0;i<28;i++) {

bufKeyC16[0][i] = bufKeyBin56[i]; }

for(i=28;i<56;i++) {

bufKeyD16[0][i-28] = bufKeyBin56[i]; }

if(debug_mode) {

printf("After splitting the key from 56-bit to 2, 28-bits:\n"); print_binary("C[0]: ",bufKeyC16[0],28,7,FALSE); print_binary("D[0]: ",bufKeyD16[0],28,7,FALSE); }

//***********************

//Step 1.3: make 16 CD subkeys, each left shift 1 or 2, then concatenate CD //***********************

if(debug_mode) { printf("\nAfter left-shifting the key and concatenation: \n"); } for(i=0;i<=16;i++) {

if ( i==0 ) { //don't do stuff to it...

for(j=0;j<28;j++) { //Concatenate half of it

bufKeyCD56[i][j] = bufKeyC16[i][j];

}

for(j=0;j<28;j++) { //Concatenate the other half

bufKeyCD56[i][j+28] = bufKeyD16[i][j];

}

goto skipshifts;

}

if( (i==1) || (i==2) || (i==9) || (i==16) ) {

leftshift(bufKeyC16[i-1],1,bufKeyC16[i]); for(j=0;j<28;j++) { //Concatenate half of it

bufKeyCD56[i][j] = bufKeyC16[i][j];

}

leftshift(bufKeyD16[i-1],1,bufKeyD16[i]); for(j=0;j<28;j++) { //Concatenate the other half

(61)

49

}

}

else {

leftshift(bufKeyC16[i-1],2,bufKeyC16[i]); for(j=0;j<28;j++) { //Concatenate half of it

bufKeyCD56[i][j] = bufKeyC16[i][j];

}

leftshift(bufKeyD16[i-1],2,bufKeyD16[i]); for(j=0;j<28;j++) { //Concatenate the other half

bufKeyCD56[i][j+28] = bufKeyD16[i][j];

}

}

skipshifts: if(debug_mode) {

printf("CD[%2d] - ",i); for(j=0;j<56;j++) {

printf("%d",bufKeyCD56[i][j]); if(((j+1) % 7) == 0) { printf(" "); }

}

printf("\n");

}

}

//***********************

//Step 1.4: permutate CD[1-16] using table pc_2 //***********************

if(debug_mode) { printf("\nAfter permutating the key with table pc_2: \n"); } for(i=1;i<=16;i++) {

permutate(bufKeyCD56[i],pt_pc2,pt_pc2_count,48,bufKeyCD48[i]); if(debug_mode) {

printf("CD[%2d] - ",i); for(j=0;j<48;j++) {

printf("%d",bufKeyCD48[i][j]); if(((j+1) % 6) == 0) { printf(" "); }

}

printf("\n");

}

}

//*********************** //End of Step 1

//We've completed all the changes to the key that we need to. //In step 2, we'll deal with the plaintext message

//***********************

//********************************************** //Step 2: Encode the 64-bit plaintext data

//********************************************** //***********************

//Step 2.1: permutate the 64-bit plaintext message into //an encrypted 64-bit data message using table IP //***********************

permutate(bufMsgBin,pt_ip,pt_ip_count,64,bufMsgBinIP);

if(debug_mode) { print_binary("After permutating the message with table IP: ",bufMsgBinIP,64,8,FALSE);}

//***********************

(62)

50

//*********************** for(i=0;i<32;i++) {

(do_encrypt) ? bufMsgBinL[0][i] = bufMsgBinIP[i] : bufMsgBinL[17][i] = bufMsgBinIP[i]; //We do 17 for decryption

}

for(i=32;i<64;i++) {

(do_encrypt) ? bufMsgBinR[0][i-32] = bufMsgBinIP[i] : bufMsgBinR[17][i-32] = bufMsgBinIP[i]; //Decryption

}

if(debug_mode) {

printf("After splitting the message into L and R: \n"); print_binary("L[0]",bufMsgBinL[0],32,8,FALSE); print_binary("R[0]",bufMsgBinR[0],32,8,FALSE); }

//*********************** //Step 2.4: Run through 16 des rounds

//Note: This is the ONLY place where decryption is different than encryption //***********************

//Encrypting or decrypting? if (do_encrypt) {

//Encrypting... for(i=1;i<=16;i++) {

des_round(bufMsgBinL[i],bufMsgBinL[i-1],bufMsgBinR[i],bufMsgBinR[i-1],bufKeyCD48[i],i);

}

}

else { //Decrypting...just do the reverse of encrypting for(i=16;i>=1;i--) {

des_round(bufMsgBinL[i],bufMsgBinL[i+1],bufMsgBinR[i],bufMsgBinR[i+1],bufKeyCD48[i],(17-i));

}

}

//***********************

//Step 2.5: Concatenate L and R...but reverse the order, so it's RL instead of LR //***********************

for(i=0;i<17;i++) { for(j=0;j<32;j++) {

bufMsgBinRL[i][j] = bufMsgBinR[i][j];

}

for(j=0;j<32;j++) {

bufMsgBinRL[i][j+32] = bufMsgBinL[i][j];

}

}

if(debug_mode) {

printf("After concatenation of L and R in reverse order: \n"); print_binary("RL[16]",bufMsgBinRL[16],64,8,FALSE); }

//*********************** //Step 2.6: permutate RL[16] using table ip_1 //***********************

(do_encrypt) ? permutate(bufMsgBinRL[16],pt_ip_1,pt_ip_1_count,64,buffer_out) : permutate(bufMsgBinRL[1],pt_ip_1,pt_ip_1_count,64,buffer_out);

(63)

51

print_binary("Final output",buffer_out,64,8,FALSE); }

//The function that called this function should use buffer_out and parse it itself... //The output (buffer_out) is a 64-bit, binary variable

}

void des_round(int bufferL, int prev_bufferL, int bufferR, int prev_bufferR, int bufferK, int round) { //We should be accepting L[i], R[i-1], and key[i] -- if we're decrypting, we'll taken R[i+1]

int bufferR48[48], bufferXOR48[48], bufferS32[32], bufferP32[32]; int intRows, intCols, tempDec; //Variables for the s-tables

int i;

//*********************** //Step 3.1: L[i] = R[i-1]

//*********************** for(i=0;i<32;i++) {

bufferL[i] = prev_bufferR[i]; }

//***********************

//Step 3.2: permutate R from 32-bits to 48-bits (matches key) using table ebit //***********************

permutate(prev_bufferR,pt_ebit,pt_ebit_count,48,bufferR48);

//*********************** //Step 3.3: XOR bufferR48 and the key //*********************** for(i=0;i<48;i++) {

bufferXOR48[i] = bufferR48[i] ^ bufferK[i]; }

if(super_debug) {

printf("After permutating R with ebit and XORing it with the key:"); print_binary("R[*]",bufferR48,48,6,FALSE);

print_binary("K[*]",bufferK,48,6,FALSE);

print_binary("R XOR K",bufferXOR48,48,6,FALSE); printf("\n");

}

//************

//Substep 3.4 - Split the current 48-bit message into 6-bits, which uses tables S1 through S8 to convert into 8, 4-bit message

//************

//Grab the first and sixth bits, convert them to decimal, then add them -- this equals our rows for(i=0;i<8;i++)

{

//Figure out the row and column of the s-box we'll use intRows = (bufferXOR48[6*i] *2) + bufferXOR48[6*i+5];

intCols = (bufferXOR48[6*i+1]*8) + (bufferXOR48[6*i+2]*4) + (bufferXOR48[6*i+3]*2) + (bufferXOR48[6*i+4]*1);

//Find the new values and place them into tempDec, mess with them, then put them into bufMsgS32 tempDec = pt_s[i][intRows][intCols];

//Convert tempDec into binary and place it into bufMsgS32, four bits at a time //1st bit

(64)

52

else { bufferS32[4*i] = 1; tempDec = tempDec-8; } //2nd bit

if (tempDec < 4) { (bufferS32[4*i+1] = 0); }

else { bufferS32[4*i+1] = 1; tempDec = tempDec-4; } //3rd bit

if (tempDec < 2) { (bufferS32[4*i+2] = 0); }

else { bufferS32[4*i+2] = 1; tempDec = tempDec-2; } //4th bit

if (tempDec == 1) { (bufferS32[4*i+3] = 1); } else { bufferS32[4*i+3] = 0;}

}

if(super_debug) {

printf("After permutating with X boxes into 32-bits:"); print_binary("R[32-bit]",bufferS32,32,4,FALSE); printf("\n");

}

//************

//Substep 3.5 - Permutate the 32-bit message using table P //************

permutate(bufferS32,pt_p,pt_p_count,32,bufferP32); if(super_debug) {

printf("After permutating with table P:"); print_binary("R=",bufferP32,32,8,TRUE); printf("\n");

}

//************

//Substep 3.6 - XOR bufferP32 with prev_bufferL to return the bufferR value //************

for(i=0;i<32;i++) {

bufferR[i] = prev_bufferL[i] ^ bufferP32[i]; }

if(super_debug) {

printf("After XORing bufferP32 with bufferL[i-1]"); print_binary("R=",bufferR,32,8,TRUE); printf("\n");

}

if(debug_mode) {

printf("\nRound %d Summary",round); print_binary("L[i] = ",bufferL,32,8,TRUE); print_binary("R[i] = ",bufferR,32,8,TRUE); }

}

void permutate(int buffer, int pt_list, int pt_list_count, int outbits, int buffer_out) {

int i, newpos;

//reset all bits of buffer_out to 0's for(i=0;i<outbits;i++) {

buffer_out[i] = 0; }

//permutate

(65)

53

newpos = pt_list[i] -1; buffer_out[i] = buffer[newpos]; }

}

void leftshift(int buffer, int num_shifts, int buffer_out) {

int i, j; j = num_shifts; //shift buffer for(i=0;i<28;i++) {

buffer_out[i] = buffer[j]; j++;

if(j == 28) {

j=0;

}

(66)

54

//********************************************** //Supplementary functions -- not essential to DES, but used //********************************************** void verifylength(char buffer, int length)

{ //If a string is too short, buffer it with 0's int i;

if( strlen(buffer) != length) {

for(i=(strlen(buffer));i<length;i++) { buffer[i] = '0';

}

buffer[length] = '\0'; //terminating character }

}

void hex2bin(char buffer_hex, int buffer_bin) {

int j, digit, curarray=0;

for(j=0;j<16;j++) { //cycle through buffer_hex

digit = buffer_hex[j]; //We'll work on one 'digit' at a time //Now, if it's a number, it will be between 48 and 57 (0 to 9 respectively)

if( (digit>47) && (digit<58) ) { //it's a number...convert it to 0-9 rather than 48-57 (ascii) digit = digit - 48;

}

//Turn A-F into 10-15

switch ( digit) { case 'A': case 'a': digit = 10; break; case 'B': case 'b': digit = 11; break; case 'C': case 'c': digit = 12; break; case 'D': case 'd': digit = 13; break; case 'E': case 'e': digit = 14; break; case 'F': case 'f': digit = 15; break;

}

//All that's left is to convert the hex numbers into binary digits (4 binary per 1 hex) //First bit

if (digit >= 8) {

buffer_bin[curarray] = 1; digit = digit -8;

}

else { buffer_bin[curarray] = 0; } curarray++;

//Second bit if (digit >= 4) {

buffer_bin[curarray] = 1; digit = digit -4;

}

else { buffer_bin[curarray] = 0; } curarray++;

//Third bit if (digit >= 2) {

buffer_bin[curarray] = 1; digit = digit -2;

}

else { buffer_bin[curarray] = 0; } curarray++;

//Fourth bit

(67)

55

else { buffer_bin[curarray] = 0; } curarray++;

} //next j }

void chr2bin(char buffer_ascii, int buffer_bin) {

int i, j, k, temp[8], highpower, leading0, curarray=0; char letter;

for(j=0;j<8;j++) { //cycle through buffer_ascii k=0;

letter = buffer_ascii[j]; //we'll work on 'letter' for a while //find the highest possible power

for(i=0;;i++) {

if(pow(2,i) > letter) {

highpower = i; break;

}

}

for(i=highpower;i!=-1;i--) { if(letter>=pow(2,i)) {

letter = letter - pow(2,i); temp[k] = 1;

}

else {

temp[k] = 0;

}

k++;

}

leading0 = 8 - k;

//Put on the number of leading zeros we need to... for(k=0;k<leading0;k++) {

buffer_bin[curarray] = 0; curarray++;

}

//Add in the read of the array to buffer_bin for(k=0;k<(8-leading0);k++) {

buffer_bin[curarray] = temp[k]; curarray++;

}

} //next j }

void print_binary(char title[ ], int buffer, int size, int spacing, char sameline) {

int i;

printf("\n%s",title);

if(sameline != TRUE) { printf("\n"); } for(i=0;i<size;i++) {

printf("%d",buffer[i]);

if (((i+1)%spacing)==0) { printf(" "); } }

(68)

56

Lampiran 3. Tabel ASCII (American Standard Code for Information Interchange)

TABEL ASCII

Desimal Karakter Binary Heksadesimal

000 00000000 00

001 00000001 01

002 00000010 02

003 00000011 03

004 00000100 04

005 ♣ 00000101 0

Gambar

Tabel  P-value Input (Plainteks) dan Output (Chiperteks) Uji Monobit
Tabel    P-value Input (Plainteks) dan Output (Chiperteks) Uji Frequency Within a Block
Tabel   P-value Input (Plainteks)  dan Output (Chiperteks) Uji Run

Referensi

Dokumen terkait

Berdasarkan hasil analisis data serta pembahasan maka dapat ditarik kesimpulan bahwa persepsi siswa mengenai keterampilan guru dalam menciptakan iklim kelas kolaboratif

Pada penelitian ini dibahas tentang instrumen pencatat pasang surut air laut otomatis dengan menggunakan model pengamat Palem yang disusun dari sensor water

Manajemen mutu terpadu merupakan suatu sistem manajemenyang mengangkat kualitas sebagai strategi usaha dan berorientasi padakepuasan pelanggan dengan melibatkan seluruh

Cadangan Kerugian Penurunan Nilai (CKPN) aset keuangan terhadap. aset produktif

Penulisan laporan Tugas Akhir ini merupakan Persyaratan Guna Meraih Gelar Sarjana Strata 1 Teknik Informatika Universitas Muhammadiyah Malang serta sebagai

setelah mendapat penjelasan dari peneliti dan setelah saya memahami maksud serta tujuan penelitian, dengan ini menyatakan bersedia ikut berpartisipasi menjadi salah satu

Dalam hal aset keuangan dan liabilitas keuangan tidak diukur pada nilai wajar melalui laporan laba rugi, nilai wajar tersebut ditambah biaya transaksi yang dapat diatribusikan

diajukan untuk memenuhi sebagian dari syarat untuk memperoleh gelar Sarjana Pendidikan Program Studi Pendidikan Guru Sekolah