-
Makalah IF3058 Kriptografi – Sem. II Tahun 2011/2012
Implementasi Proteksi Ganda Dengan Menggabungkan Algoritma El
Gamal dan Vigenere Cipher
Ignatius Ronaldo Galman Kurniawan - 13509074 Program Studi
Teknik Informatika
Sekolah Teknik Elektro dan Informatika Institut Teknologi
Bandung, Jl. Ganesha 10 Bandung 40132, Indonesia
[email protected]
Abstrak— Algoritma El Gamal adalah algoritma
kunci asimetrik yang digunakan untuk kriptografi
kunci publik yang telah dikembangkan sedemikian
rupa dengan berbasiskan pertukaran kunci Diffie-
Hellman sehingga dapat digunakan untuk melakukan
enkripsi dan dekripsi pesan. Algoritma ini memiliki
keamanan yang relatif tinggi dikarenakan
memecahkan masalah logaritma diskrit bukanlah
perkara mudah bahkan dengan menggunakan kemampuan k omputasi
dewasa ini yang notabene
sudah sangat maju dan berkembang dengan pesat. Demikian pula
dengan Vigenere Cipher yang
merupak an sebuah algoritma Kriptografi klasik yang
cukup populer. Oleh karena itu menarik untuk
diimplementasikan bagaimana penggabungan
algoritma kriptografi modern dan klasik dan tentunya
ada kelebihan maupun kekurangan yang ada dari
hasil penggabungan algoritma El Gamal dan Vigenere
Cipher ini .
Kata Kunci—Diffie-Hellman, El Gamal , Vigenere Cipher.
I. PENDAHULUAN
Kriptogtafi merupakan seni dan ilmu yang digunakan
untuk menyembunyikan pesan yang memiliki beberapa
terminologi dasar[1]. Terminologi dasar yang penting
diantaranya adalah pengirim pesan, penerima pesan,
pesan, plainteks, cipherteks, enkripsi, dekripsi dan kunci.
Sejatinya Algoritma El Gamal adalah algoritma
kriptografi modern yang digunakan pada mulanya untuk
digital signature atau tanda tangan digital dengan
berdasarkan pada prinsip pertukaran kunci Diffie-
Hellman yang merupakan algoritma kunci publik. Namun
demikian, El Gamal mengalami modifikasi sehingga
dimungkinkan melakukan enkripsi dan dekripsi pesan
dengan menggunakan algoritma in i.
Vigenere Cipher merupakan sebuah Algoritma
Kriptografi klasik yang memiliki 8 elemen tersebut.
Disebut algoritma klasik karena algoritma in i tergolong
algoritma dasar karena menggunakan algoritma berbasis
karakter dan dapat dipecahkan tanpa menggunakan
komputer. Akan tetapi algoritma ini tentunya bisa
diimplementasikan ke dalam program komputer.
Dalam makalah ini akan dibahas implementasi proteksi
ganda dengan menggabungkan Algoritma Modern El
Gamal dengan Algoritma Klasik Vigenere Cipher.
II. DASAR TEORI
Algoritma El Gamal[1][2]
Algoritma El Gamal adalah algoritma ekripsi/dekripsi
dengan kunci asimetris untuk kriptografi kunci publik
yang berdasarkan pada Algoritma Pertukaran kunci
Diffie-Hellman[3]. Adalah seorang Mesir-Amerika Taher
El Gamal memperkenalkannya ke publik pada tahun
1984. Pertama kali dikemukakan di dalam makalah
berjudul "A public key cryptosystem and a signature
scheme based on discrete logarithms”.
Keamanan algoritma in i adalah bahwa perkara sulit untuk
menghitung logaritma diskrit.
Komponen dari enkripsi El Gamal adalah : key generator,
algoritma enkripsi, dan algoritma dekripsi.
Properti dari A lgoritma in i adalah:
Properti Keterangan
Bilangan Prima p Tidak rahasia
Bilangan acak g (g < p) Tidak rahasia
Bilangan acak x (x < p) Rahasia, Kunci Privat
y = gx mod p Tidak rahasia, Kunci Publik
Plaiteks m Rahasia
Cipherteks a dan b Tidak rahasia
Generate Key
Melakukan generalisasi kunci adalah sebagai berikut:
- Pilih sembarang bilangan prima p ( p dapat di-share di antara
anggota kelompok)
- Pilih dua buah bilangan acak, g dan x, dengan
syarat g < p dan 1 x p – 2
- Hitung y = gx mod p.
Hasil dari algoritma ini:
- Kunci Publik : triple(y, g, p) - Kunci Privat : pair(x, p)
Enkripsi
- Susun plainteks menjadi blok-blok m1, m2,...,
(nilai setiap blok di dalam selang [0, p – 1].
- Pilih bilangan acak k , yang dalam hal ini
1 k p – 2.
- Setiap blok m dienkripsi dengan rumus
a = gk mod p
b = ykm mod p
Pasangan a dan b adalah cipherteks untuk blok pesan m.
Jadi, ukuran cipherteks dua kali ukuran plainteksnya.
-
Makalah IF3058 Kriptografi – Sem. II Tahun 2011/2012
Dekripsi
- Gunakan kunci p rivat x untuk menghitung
(ax)– 1
= ap – 1 – x
mod p
- Hitung plainteks m dengan persamaan:
m = b/ax mod p = b(a
x)– 1
mod p
Vigenere Cipher[1][5]
Vigenere Cipher adalah metode enkripsi teks alfabet
dengan menggunakan deretan Caesar Cipher berdasarkan
huruf - huruf pada kunci. Vigenere Cipher ditemukan oleh
Blaise de Vigenere dari Prancis pada tahun 1586.
Walaupun metode ini sudah ditemukan sebelum
Vigenere, yaitu oleh Giovan Bat ista Belaso pada tahun
1553, akan tetapi Vigenere lah yang menyempurnakan
metode ini sehingga Vigenere leb ih dihormati dan
algoritma ini dinamai Vigenere Cipher. Metode ini sangat
terkenal karena kemudahan untuk digunakan bagi semua
orang dan sulit untuk dipecahkan bagi pemula pada
zamannya.
Metode ini baru bisa dipecahkan pada abad ke-19 o leh
Charles Babbage, seorang matematikawan dari Inggris .
Dan Friedrich Kasiski mempublikasikan cara
memecahkan Vigenere Cipher, sehingga metode ini
dinamakan tes Kasiski.
Penggunaan Vigenere Cipher adalah oleh Tentara
Konfederasi pada saat Perang Sipil Amerika. Perang ini
meletus setelah Vigenere Cipher berhasil dipecahkan.
Cara Kerja Vigenere Cipher adalah menggunakan tabel
Vigenere untuk melakukan enkripsi. Kolom paling kiri
menyatakan kunci, sedangkan bagian atas menyatakan
plainteks.
Setiap baris dari bu jur sangkar menyatakan cipherteks
yang diperoleh dengan Caesar Cipher, yang pergeseran
huruf ditentukan nilai desimal o leh huruf kunci. (a=0,
b=1, ..., y = 24, z = 25).
Tabel Vigenere digunakan untuk memperoleh cipherteks
dengan menggunakan kunci yang sudah tetap dengan
panjang tertentu. Jika panjang kunci kurang dari
plainteks, maka penggunaan kunci akan dilakukan secara
periodik.
Contoh:
Plainteks : saya ganteng
Kunci : asda sdasdas
Perhatikan bahwa kunci asd diulang sampai sejauh
plainteks. Setiap huruf d i plainteks akan dienkripsi
dengan kunci di bawahnya.
Cara enkripsi adalah dengan menarik garis vertikal huruf
plainteks ke bawah dan menarik garis horizontal huruf
kunci ke kanan. Dengan demikian perpotongan kedua
garis ini akan menghasilkan sebuah huruf yang
merupakan sebuah cipherteks.
Misalkan plainteks huruf G dengan Kunci S, maka
dengan tabel Vigenere akan dihasilkan perpotongan huruf
G dan S yaitu huruf Y.
Ilustrasi seperti gambar di bawah:
Gambar 1 Ilustrasi Penggunaan Tabel Vigenere
Dan Cipherteks dari “saya ganteng” dengan kunci “asd”
adalah:
Plainteks : saya ganteng
Kunci : asda sdasdas
Cipherteks : ssba ydnlhny
Rumus Matematis dari Vigenere Cipher adalah sebagai
berikut:
Rumus Enkripsi:
Ci = (Pi + Ki) mod 26 Pi+Ki < 26
Ci = ((Pi + Ki) – 26) mod
26
Pi+Ki > 26
Rumus Dekripsi:
Pi = (Ci-Ki) mod 26 Ci–Ki > 0
Pi = ((Ci-Ki) + 26) mod 26 Ci-Ki < 0
Dengan :
Pi : nilai desimal karakter plainteks ke-i
Ci : nilai desimal karakter cipherteks ke-i
Ki : n ilai desimal karakter kunci ke-i
Nilai desimal karakter adalah :
A = 0, B = 1, C = 2, D = 3, . . . , Z = 25.
-
Makalah IF3058 Kriptografi – Sem. II Tahun 2011/2012
III. IMPLEMENTASI DALAM PROGRAM KOMPUTER DAN ANALISIS
Implementasi program in i memiliki ide sebagai berikut:
Suatu pesan/file/plainteks P mula-mula akan dienkripsi
dengan menggunakan Algoritma El Gamal dan
menghasilkan cipherteks C.
Kemudian C akan menjadi plainteks untuk enkripsi kedua
menjadi P’. P’ d ienkripsi lagi dengan Vigenere Cipher
menjadi C’.
Untuk melakukan dekripsi maka C’ akan didekripsi
dengan Vigenere Cipher menjadi P’, dan P’ akan
didekripsi dengan El Gamal untuk mendapatkan kembali
plainteks P.
Fungsi – fungsi utama dalam program adalah sebagai
berikut:
Fungsi untuk generate key
Fungsi untuk mengelompokkan dalam b lok sebelum dienkripsi
secara El Gamal
Fungsi untuk melakukan enkripsi secara El
Gamal
Fungsi untuk melakukan enkripsi secara Vigenere
Fungsi untuk menyimpan cipherteks ke dalam file
Fungsi untuk memuat cipherteks
Fungsi untuk melakukan dekripsi secara Vigenere
Fungsi untuk melakukan dekripsi secara El
Gamal
Generate Key
Melakukan generate terhadap p, g, x, y secara random.
Program menyediakan fitur berupa dapat memilih
panjang bit bilangan yang ingin digeneralisasi.
public void generateKey(int numberBit)
{
p = BigInteger.probablePrime(numberBit - 1, new
Random());
while ((g = new BigInteger(numberBit - 1, new
Random())).compareTo(p) >= 0);
while ((x = new BigInteger(numberBit - 1, new
Random())).compareTo(p) >= 0);
y = g.modPow(x, p);
}
Enkripsi Pertama (El Gamal)
Enkripsi pertama d ilakukan dengan cara El Gamal dengan
mengikuti rumus – rumus yang sudah dijabarkan pada
bagian dasar teori dimana hasil enkripsi in i akan
menghasilkan rangkaian dari heksadesimal yang
panjangnya dua kali dan berukuran dua kali pula dari
panjang dan ukuran plainteksnya.
Melakukan Pengelompokkan Blok
Sesuai dengan rumus El Gamal bahwa sebelum dienkripsi
rangkaian plainteks harus dipecah-pecah dan dipisah ke
dalam kelompok tertentu.
Enkripsi Kedua (Vigenere)
Menggunakan Rumus Enkripsi Vigenere Cipher 256
karakter: private byte encryptVigenere(byte input, char
key){
return (byte)(((int)(input &0xff) +
(int)key)%256);
}
Dekripsi Pertama (Vigenere)
Menggunakan Rumus Dekripsi Vigenere Cipher 256
karakter: private byte decryptVigenere(byte input, char
key){
return (byte)(((int)(input &0xff) -
(int)key)%256);
}
Dekripsi Kedua (El Gamal)
Dekripsi El Gamal in i juga dilakukan dengan
menggunakan rumus El Gamal yang sudah dibahas dalam
dasar teori. Dekripsi ini
Ujicoba program:
Skenario Ujicoba Program adalah sebagai berikut :
Melakukan Load terhadap file teks Test.txt Melakukan Generate
Key dengan panjang bit
kunci 1000 bits
Memasukkan kata kunci “VigenereCipher” untuk enkripsi kedua
Menyimpan file cipherteks yang sudah dienkripsi dua kali dengan
nama Cipher.txt
Melakukan load file cipherteks yang dimaksud
dan melakukan dekripsi.
Plainteks kembali seperti semula .
Input:
Berkas teks
Teks Sebenarnya
Aku ingin begini .
Aku ingin begitu .
Ingin in i , ingin itu banyak sekali . .
Semua, semua, semua
Dapat dikabulkan
dapat dikabulkan dengan kantong ajaib
Aku ingin terbang bebas di angkasa
"Hey! Baling-baling Bambu!!"
La,la,la
Aku sayang sekali...
Doaremon...
La,la,la aku sayang sekali
Doraemon...
Dalam Heksadesimal
416B7520696E67696E20626567696E69202E0D0A416B7520
-
Makalah IF3058 Kriptografi – Sem. II Tahun 2011/2012
696E67696E20626567697475202E0D0A496E67696E20696E
69202C20696E67696E206974752062616E79616B2073656B
616C69202E202E0D0A0D0A53656D75612C2073656D75612C
2073656D75610D0A44617061742064696B6162756C6B616E
0D0A64617061742064696B6162756C6B616E2064656E6761
6E206B616E746F6E6720616A6169620D0A0D0A416B752069
6E67696E2074657262616E6720626562617320646920616E
676B6173610D0A22486579212042616C696E672D62616C69
6E672042616D62752121220D0A0D0A4C612C6C612C6C610D
0A416B7520736179616E672073656B616C692E2E2E0D0A44
6F6172656D6F6E2E2E2E0D0A0D0A4C612C6C612C6C612061
6B7520736179616E672073656B616C690D0A446F7261656D
6F6E2E2E2E
Nilai p:
5269806298302442448805339068623952727515309781
4183557526223766612701895460177278682611321423
8628120209300577071158656494933298558077201651
9836479765222431183906154932502872885795007128
4499322704413330304467406875513633682660272253
3326107534502140668508724135368903325860245399
6279029411601314689650811
Nilai g:
2494546075204825813692230069242909497667566923
9574728639785617101816563075268699560575313597
1557511785597358942415629727135869775074880523
0535275448167025623029897914743042821003823963
9290406312757642230928495477229734752632778313
5318418501512724794861818721429683579591070914
7330067029141203837333960
Nilai x:
9572702698229201597791768999288049670256114352
6355202002435429778823256470736407314295261539
5166817670630957919577124101252125157474144760
1772859105309760907935881920010492958500001114
8660904981609394635750031651452848694613701833
5249983777632600224316922992432852013744722152
064724254623503130903969
Nilai y:
4863913975640194054239130951813900075870166106
1760769848904388844680852706566125828218318110
9791010572662646551320962710146911389671153369
4384585043880707251698145684346983649182930172
5447401998904756671083806042518378246806597982
6867723081624989537965472503741530962214459304
7425362372833870211823232
Output:
Cipherteks 1 (El Gamal)
Dalam heksadesimal
3B725DAFFEA1CB09238F10FDE8297CDFF63A5BE718A90DA9
7754290C8611CFC6F5C70EEF7463F30521A354E113633324
8F755790B80D24AEF232765D3B737E42A18C81B99FD6B910
4D2A3BC53371F25F7733C7D17D020F554699B39DD62EB231
CD600D8F5F9D58EEA85ECB7AF01A93CDFAFCB09DB7F69A42
D8FEFC1AFC380EBDB8F1B83059CB4E35DC9E56C2E1939F1B
8EF1C8CB16F2470464316A779592B4867F2DCF2D123FD733
8F5907E8BBAEDAB94B8A09B4FC06BF2D09517F00D061F978
F1F683B344EBFC86643F3ACF95C704EBD85832EA59B6621A
FED2A1D52E600899A47A56DF4BEB52F2E3D549A5551CFD2B
D9CF13F6987622B75D2B502CDFB3268D40053499352F1E90
1F8EBC0C88230357256F6933DD68B71806E2A080ED4E8314
B6A5168AB44302A86DE3745D962BFC241EF3C395AA795F86
2DDD31846CF07303B5053B9192F620B3D16FF2E5B36B42EC
58FF373058F006FC1D58DE7D8AAC0AC78B27CBF8056A8A12
86A64167D007BD6C60558016A468212E5767207AA0D3BC63
5A399A21587EB9AA04D53B2523523AB1153177319AF73391
D478B39E3D60DBBDB1CDC93EA66515ED8DEA600C5BE6BE13
9409C04B966FCFE77C48652870D1CB534D38711E1631B812
E01FD4FF7F91D12948955EF69A5B0D697A6FCA9AF5A1CD44
321D2324907B680752330A2E4DFA1355023EBA63061725BC
2CBCE79006DACC15B6B6E3781E883A167B74FB56FB324F46
3716C7A062DBAAEC0911B3759A540994A07F525865B8C4D8
BD2AFA0F884F4318BD6237BE6C1F48AC0A732DE6F9D9E2B9
112F939394665C72D6D48CB319C8992F3264223E11FF218D
64DD47950FFDAB51BCA1B00B931761E7AB331612567CF12D
DE4E07A7CE3073A0D4DE51EBF46D25BBC350D8DA7881AD12
AD5BE133061DE5ADFEBD1F886A2A99EAA0AC34B2D3F566F2
A7D9202691BDDAB8251CD2422D4986C33924987B9C0A1D4F
2FA85C1A466FB5627B65BF15A09CAF609B674ED05B18246F
9B505D0422CB4695868D8B426B286A31EF49263D175177EF
1600246DFC1A
Teks sebenarnya
㜀爻꽝ꇾ 輣رض⧨㫶 ⧨⧨呷⧨ᆆ웏쟵 捴 ꌡ׳ 挓⧨疏遗
ම긤㋲嵶猻䉾財릁횟Ⴙ⧨씻焳忲⧨퇇ɽ唏饆鶳⻖ㆲ惍輍鵟
庨立⧨춓يغ鶰 䊚 㣼봎⧨ق ジ쭙㕎黜쉖鏡 쯈 ㅤ
睪銕蚴⧨⧨㼒㏗妏 꺻맚詋됉ۼ⧨儉•懐磹 뎃 蛼㽤켺
잕 壘 뙙⧨틾햡怮餈窤 헣⧨⧨⧨쿙 皘뜢⧨⧨돟账Հ
餴⧨逞踟 ⎈圃漥㍩棝⧨ 肠仭ᒃ⧨訖䎴⧨ 嵴⧨⓼ 闃禪號萱⧨⧨ 鄻 댠濑 殳 x〷 ➋堝緞겊윊حب 樅ኊ⧨杁
⧨沽啠⧨梤⧨杗稠펠掼㥚↚繘⧨프┻刣넺ㄕㅷ 鄳磔麳
怽뷛춱㻉斦 ౠ Ꮎঔ䯀澖 䡼⧨텰友㡍ṱㄖኸῠᅯ酿⧨镈 定植潺髊ꇵ䓍ᴲ␣箐ݨ㍒⧨祉唓㸂掺⧨밥밬郧ᗌ뚶磣
蠞ᘺ瑻囻㋻䙏ᘷꃇ ᄉ疳咚鐉羠塒롥⧨⧨侈ᡃ抽븷Ὤ걈猊
맢⧨鎓暔牜퓖뎌젙⧨搲㸢1贡镇رص冫ꆼரន ㎫ሖ籖⧨仞⧨ノꁳ 淴묥僃腸ክ宭㏡ᴆ귥뷾蠟 겠눴 ☠붑룚⧨䋒
䤭쎆⧨箘જ伝⧨⧨潆抵敻ᖿ鲠悯枛큎ᡛ漤傛ѝ쬢镆趆䊋⧨ㅪ䧯㴦儗 洤⧨
Cipherteks 2 (El Gamal + Vigenere)
Dalam heksadesimal
7B5B74144D23336A0A89858196F2CF28EC97A067621BBF5A
24718AAF31810AFC94AB97EE4C82A3A8A95C2AF9E8977ABF
0221F5DE695A5A4C1870978EDCE8261CF28EBCEE9436FF3B
AE7CC6BCCAC07F32ADA014A238FA1CB45B55BF731D505F87
BB695B1002E18EFF62A3B4E203C0BA45006E6B2CFE8FAC02
D7D50F661F180A53EA4512BCF182D11509CF7B3883826A87
D2B1531DDE98C10D18F6E0E9E45BA5BAE8ACF08E6559BE62
BFAAA1CF8C15B1B72F1717E18C0838CCAF23740E6843131E
C5BC038476F8642822D0545E0DE353706B2FAE7E4607849B
8557679E52D7213D65936FD889D9EEDEF97A352A8A602A3C
9F40780393B9512C3F8B67AD7A7437B3F694AD2A256FBA10
2420D8553C9A5D1989336B7F6386D2E43C144F66C21A7193
173949B11A70EE0594E99A57BCA22ADE8F995D36C60C494B
2711EA1FA4219E1DC875980B6A8E7C399842941D83C7F7C3
2850628BF76AA567E6A14A60694E9F0438EED4008B6E5892
5F1CAEC27689F27F44E8096B47BC800C188D13D3568BB238
57F07CA4BFFBF04BEA456C650E7DF699A3D99921B0EA9B13
B0F72812C6E30ED75A573C3CE9098D9C183062CBE5A6E3A7
-
Makalah IF3058 Kriptografi – Sem. II Tahun 2011/2012
D746896F0AFE2A4F89BA752D3D51DAAD519DDA8845B051CC
03B95C4731DF7AE4285DC20A8A3E4EE377AC6BCA2F9A9DA0
E999F5E1E73D579D5B4D50EEE798390EF1CF3DF972A0CEFA
A8AC54320D226FE93E132F38D5203BB1F0CEC11E494D5458
2086280DFDEF353B6E3B7AB51C460BFAAE4C17FD00AA3FDE
9BD503CBE5783533A57A0B5C379B12EE08A39BD26D61A413
865F7819049D7CD88A0ADAB4AB381B87A6964A9D021D6AA4
B834D9F9D775B71188C7FDCE9F6D4807A5F21A6076F70F85
F21894010A0356FAF5FE38971FB4D487971CC09615AA7C24
053AF583FE995BB33DF75C0EC4D6E40085B1E79FB34110A8
09E57A0970AD7FF2AD55DAD316F53629A486D6C9C22F35F2
DBD2DDDD210DACE05724D821BD01313366448A4CAF02ED06
F8BC5C5126757BB58E330D015F526E7937E4DD67B9201923
DEED39EB6E55
Teks sebenarnya
ꁖ샢秢袿퍶 寬贶يي찒蒥숯 ⧨ 慸⧨埚 ⧨엿庑حي⓬詅
䙥쳎떰핿 䵎蕩 怡⧨ꁦ ℸ⤍髯ሒ୪徟⧨뫍뢍龍툑痂䙰搀ಥ䨤㉨긐퍧釙 毯㵇腵롱 絁䅮ꇑ ᙄ蚖N缦彮乇
쁒⧨ᔫ 쯊쬔༦㐏竾⧨羟卼燢㆟蠝珦겫蚃 川跒㖔잗䭽
飁 沴ö새 䦷 㷝㻻䜱 鲚짠ꆑ⧨棪⋖铁ىمت⧨ᢥ泌鏰
힕舟襺먿ᆰ经鳌 䴨禣쮽缴جضꆇ⎮橕丂밌⧨䚚௴龳焭낷皙蠭褔較烿 黮⧨蔄㧨⧨떏 콩탨⧨튯랿椆厦敆⧨⧨
軄⬄ ⧨푌Ⓑ绥 㡺 鴤妚೬洤둆⧨쫚 䄓鏾匆砂尞
瞚䰉㽾즿⧨湐ǻ閊㒥๕⧨꼭퓰捸뒜⏌闥쎢ᘰ ᖷ㖔ⅳ링䢇
䧡슖漴⧨䮾Ờ㏁ヨԋ﹛䨸⧨ 뚱厷جمت玫㠴憭⧨挤ᄏ韂蝿劲
箮⧨褫⧨㍞茳뚌샄 百呤ꂣꃠẽ꺌汰딄找⧨䎱㻞㍳ 鲋셹
©坕⧨䐀쫃砋쓴绪ه䃬糯ᴰ鴒 蕲⧨鴎幀瘩ニ㙭炞圌얈ڍ⧨
峨 聢珹池徽捣مح 軼6 觪齷 ◀悓珃㬲敖⧨ݗ댘ᅦ
䩰滨ዢ寂봝䔿幬躝 ⧨項媥䑀䘳犈䔚觉訛椭⧨궼뇱朝歟
┻만 飵晻럑 䲧褏袀剌傫뺱
Screenshot program:
Gambar 2 Screenshot Ujicoba Program
IV. KESIMPULAN
Menggabungkan algoritma enkripsi El Gamal dan
Vigenere Cipher adalah menggabungkan seni enkripsi
modern dan klasik. Dan dengan menggunakan teknik in i,
ketangguhan algoritma El Gamal yang terkenal akan
semakin bertambah dengan adanya perlindungan ganda
dengan menggunakan Vigenere Cipher. Keunggulan dari
algoritma ini tentunya adalah semakin menyulitkan
penyadap yang tidak berhak yang ingin membaca pesan.
Karena selain dengan El Gamal stand alone pun sudah
sulit dipecahkan, apalagi dengan teknik in i, penyadap
harus menemukan kunci Vigenere terlebih dahulu baru
kemudian memecahkan El Gamal. Kekurangan dari
teknik ini adalah kepraktisannya menjadi berkurang,
karena Vigenere yang merupakan algoritma kunci
simetrik, maka dalam mengirimkan kunci untuk Vigenere
harus melalui saluran yang aman.
.
REFERENSI
[1] Munir, Rinaldi. 2006. Kriptografi. Bandung: Informatika. [2]
http://agcrypt.wordpress.com/2008/02/25/elgamal-
algorithm/http://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange
[3] http://www.rsa.com/rsalabs/node.asp?id=2248 [4]
http://malware.cbronline.com/news/father-of-ssl-says-the-bad-
guys-are-winning [5]
http://www.braingle.com/brainteasers/codes/vigenere.php
PERNYATAAN
Dengan ini saya menyatakan bahwa makalah yang saya
tulis ini adalah tulisan saya sendiri, bukan saduran, atau
terjemahan dari makalah orang lain, dan bukan plagiasi.
Bandung, 11 Mei 2012
ttd
Ignatius Ronaldo Galman Kurn iawan – 13509074
http://agcrypt.wordpress.com/2008/02/25/elgamal-algorithm/http://agcrypt.wordpress.com/2008/02/25/elgamal-algorithm/http://agcrypt.wordpress.com/2008/02/25/elgamal-algorithm/http://www.rsa.com/rsalabs/node.asp?id=2248http://malware.cbronline.com/news/father-of-ssl-says-the-bad-guys-are-winninghttp://malware.cbronline.com/news/father-of-ssl-says-the-bad-guys-are-winninghttp://www.braingle.com/brainteasers/codes/vigenere.php
-
Makalah IF3058 Kriptografi – Sem. II Tahun 2011/2012
Lampiran
Kode Sumber
Fungsi Pengelompokkan Blok
Private LinkedList
createBlockCollection(byte[] buffer) throws
NullPointerException, IOException
{
int length = (int)
Math.ceil(((double)p.bitLength() + 1)/8) - 1;
LinkedList result = new
LinkedList();
int i = 0;
int j = 0;
while (i < buffer.length)
{
byte[] temp = null;
BigInteger tempBig = null;
temp = new byte[length];
if (i + length >= buffer.length)
{
System.arraycopy(buffer, i, temp, length -
buffer.length + i, buffer.length - i);
padding = (short)(length - buffer.length + i);
}
else System.arraycopy(buffer, i, temp, 0,
temp.length);
tempBig = new BigInteger(1,temp);
result.add(tempBig);
i += temp.length;
}
return result;
}
Fungsi Enkripsi Vigenere saat Save File
public long saveData(File fileout,
LinkedList input, boolean raw, String
key) throws IOException
{
FileOutputStream fos = new
FileOutputStream(fileout);
int j = 0;
if (!raw) {
byte[] temp1 = shortToByteArray(padding);
for (int i = 0; i < temp1.length; i++){
temp1[i] = encryptVigenere(temp1[i],
key.charAt((j++)%key.length()));
}
fos.write(temp1);
for (int i = 0; i < input.size(); i++)
{
byte[] temp = input.get(i);
for (int k = 0; k < temp.length; k++){
temp[k] = encryptVigenere(temp[k],
key.charAt((j++)%key.length()));
}
fos.write(temp);
}
} else {
for (int i = 0; i < input.size(); i++)
fos.write(input.get(i));
}
fos.close();
return fileout.length();
}
Fungsi Dekripsi Vigenere saat Load File
public LinkedList loadCipherTeks(File
filein, String key) throws IOException,
NullPointerException
{
int length = (int)
Math.ceil(((double)p.bitLength() + 1)/8) * 2;
LinkedList result = new
LinkedList();
FileInputStream fis = new
FileInputStream(filein);
byte[] bytePadding = new byte[2];
fis.read(bytePadding);
int j = 0;
bytePadding[0] = decryptVigenere(bytePadding[0],
key.charAt((j++)%key.length()));
bytePadding[1] = decryptVigenere(bytePadding[1],
key.charAt((j++)%key.length()));
padding = byteArrayToShort(bytePadding);
while (fis.available() != 0)
{
byte[] buffer = new byte[length];
fis.read(buffer);
for (int k = 0; k < buffer.length; k++){
buffer[k] = decryptVigenere(buffer[k],
key.charAt((j++)%key.length()));
}
result.add(buffer);
}
fis.close();
return result;
}
protected static String byteArrayToString(byte[]
input)
{
StringBuilder result = new StringBuilder();
for (int i = 0; i < input.length; i++)
{
result.append(HexStringTable[input[i] & 0xff]);
}
return result.toString();
}
Fungsi Enkripsi El Gamal
public LinkedList encryptData(byte[]
data) throws NullPointerException, IOException
{
int length = (int)
Math.ceil(((double)p.bitLength() + 1)/8);
LinkedList blockCollection =
createBlockCollection(data);
LinkedList result = new
LinkedList();
for (int i = 0; i < blockCollection.size(); i++)
{
BigInteger k = null;
BigInteger a = null;
BigInteger b = null;
byte[] cipher = new byte[2 * length];
while ((k = new BigInteger(p.bitCount() - 2, new
Random())).compareTo(p.subtract(new
BigInteger("2"))) > 0 || k.compareTo(new
BigInteger("1")) < 0);
a = g.modPow(k, p);
b = y.modPow(k,
p).multiply(blockCollection.get(i)).mod(p);
int sizeA = a.toByteArray().length;
int sizeB = b.toByteArray().length;
System.arraycopy(a.toByteArray(), 0, cipher,
length - sizeA, sizeA);
-
Makalah IF3058 Kriptografi – Sem. II Tahun 2011/2012
System.arraycopy(b.toByteArray(), 0, cipher,
cipher.length - sizeB, sizeB);
result.add(cipher);
}
return result;
}
Fungsi Dekripsi El Gamal
public LinkedList
decryptData(LinkedList cipherCollection)
{
int length = (int)
Math.ceil(((double)p.bitLength() + 1)/8);
int blockLength = (int)
Math.ceil(((double)p.bitLength() + 1)/8) - 1;
LinkedList result = new
LinkedList();
for (int i = 0; i < cipherCollection.size();
i++)
{
byte[] tempA = new byte[length];
byte[] tempB = new byte[length];
byte[] cipher = cipherCollection.get(i);
byte[] plain = null;
BigInteger a = null;
BigInteger b = null;
System.arraycopy(cipher, 0, tempA, 0, length);
System.arraycopy(cipher, length, tempB, 0,
length);
a = new BigInteger(1,tempA);
b = new BigInteger(1,tempB);
BigInteger tempKey =
a.modPow(p.subtract(x).subtract(new
BigInteger("1")), p);
plain =
b.multiply(tempKey).mod(p).toByteArray();
if (plain.length < blockLength)
{
byte[] tempPlain = null;
if (i == cipherCollection.size() - 1) tempPlain
= new byte[blockLength - padding];
else tempPlain = new byte[blockLength];
System.arraycopy(plain, 0, tempPlain,
tempPlain.length - plain.length, plain.length);
plain = tempPlain;
} else if (plain.length > blockLength)
{
byte[] tempPlain = new byte[blockLength];
System.arraycopy(plain, 1, tempPlain, 0,
tempPlain.length);
plain = tempPlain;
}
// System.out.println(i + " " + new
BigInteger(1,plain));
result.add(plain);
}
return result;
}