Kamis, 09 Oktober 2014

IMPLEMENTASI DASAR-DASAR KRIPTOGRAFI

DEFINISI KRIPTOGRAFI

          Kriptografi berasal dari bahasa Yunani yaitu cryptós yang artinya “secret” (yang tersembunyi) dan gráphein  yang artinya “writting” (tulisan). Jadi, kriptografi berarti ” secret writting” (tulisan rahasia). Definisi yang dikemukakan oleh Bruce Schneier (1996), kriptografi adalah ilmu dan seni untuk menjaga keamanan pesan (Cryptography is the art and science of keeping messages secure).
          Kriptografi, secara umum adalah ilmu dan seni untuk menjaga kerahasiaan berita. Selain pengertian tersebut terdapat pula pengertian ilmu yang mempelajari teknik-teknik matematika yang berhubungan dengan aspek keamanan informasi seperti kerahasiaan data, keabsahan data, integritas data, serta autentikasi data [A. Menezes, P. van Oorschot and S. Vanstone - Handbook of Applied Cryptography]. Tidak semua aspek keamanan informasi ditangani oleh kriptografi.
jadi dapat disimpulkan definisi kriptografi adalah suatu ilmu yang mempelajari bagaimana cara menjaga agar data atau pesan tetap aman saat dikirimkan, dari pengirim ke penerima tanpa mengalami gangguan dari pihak ketiga.


Ada empat tujuan mendasar dari ilmu kriptografi ini yang juga merupakan aspek keamanan informasi yaitu :
  1. Kerahasiaan, adalah layanan yang digunakan untuk menjaga isi dari informasi dari siapapun kecuali yang memiliki otoritas atau kunci rahasia untuk membuka/mengupas informasi yang telah disandi.
  2. Integritas data, adalah berhubungan dengan penjagaan dari perubahan data secara tidak sah. Untuk menjaga integritas data, sistem harus memiliki kemampuan untuk mendeteksi manipulasi data oleh pihak-pihak yang tidak berhak, antara lain penyisipan, penghapusan, dan pensubsitusian data lain kedalam data yang sebenarnya.
  3. Autentikasi, adalah berhubungan dengan identifikasi/pengenalan, baik secara kesatuan sistem maupun informasi itu sendiri. Dua pihak yang saling berkomunikasi harus saling memperkenalkan diri. Informasi yang dikirimkan melalui kanal harus diautentikasi keaslian, isi datanya, waktu pengiriman, dan lain-lain.
  4. Non-repudiasi., atau nirpenyangkalan adalah usaha untuk mencegah terjadinya penyangkalan terhadap pengiriman/terciptanya suatu informasi oleh yang mengirimkan/membuat.


PERBEDAAN KRIPTOGRAFI KLASIK DAN MODERN
         Algoritma kriptografi klasik adalah teknik kriptografer menggunakan algoritma yang sederhana, yang memungkinkan cipherteks dapat dipecahkan dengan mudah (melalui penggunaan statistik, terkaan, intuisi, dan sebagainya. Kriptografi clasik ini melakukan pengacakan huruf atau plaintext. Kriptografi ini hanya melakukan pengacakan pada huruf A - Z sehingga cepat untuk dipecahkan.
         Algoritma kriptografi modern adalah teknik kriptografi yang beroperasi menggunakan dalam mode bit daripada mode karakter (seperti yang dilakukan pada cipher substitusi atau cipher transposisi dari algoritma kriptografi klasik). Algoritma kriptografi modern dibuat sedemikian kompleks sedemikian  sehingga kriptanalis sangat sulit memecahkan cipherteks tanpa mengetahui kunci. Operasi dalam mode bit berarti semua data dan informasi (baik kunci, plainteks, maupun cipherteks) dinyatakan dalam rangkaian (string) bit biner, 0 dan 1. Algoritma enkripsi dan dekripsi memproses semua data dan informasi dalam bentuk rangkaian bit. Rangkaian  bit yang menyatakan plainteks dienkripsi menjadi cipherteks dalam bentuk rangkaian bit, demikian sebaliknya.
Perkembangan algoritma kriptografi modern berbasis bit didorong oleh penggunaan komputer digital yang merepresentasikan data dalam bentuk biner.



MACAM-MACAM DAN JENIS KRIPTOGRAFI
1.    DATA ENCYPTION STANDART
          Data Encryption Standard ( DES ) adalah sebelumnya dominan algoritma untuk enkripsi data elektronik. Ini sangat berpengaruh dalam kemajuan modern kriptografi di dunia akademis. Dikembangkan pada awal tahun 1970 di IBM dan didasarkan pada desain sebelumnya oleh Horst Feistel , algoritma telah disampaikan kepada Badan Standar Nasional (NBS) mengikuti undangan badan untuk mengusulkan calon untuk perlindungan sensitif, unclassified data pemerintah elektronik.
DES sekarang dianggap tidak aman untuk banyak aplikasi. Hal ini terutama disebabkan oleh 56-bit ukuran kunci yang terlalu kecil, pada bulan Januari 1999, distributed.net dan Electronic Frontier Foundation berkolaborasi untuk publik memecahkan kunci DES dalam 22 jam dan 15 menit Ada juga beberapa hasil analisis yang menunjukkan kelemahan teoritis dalam cipher, meskipun mereka tidak layak untuk me-mount dalam praktek. Algoritma diyakini praktis aman dalam bentuk Triple DES , meskipun ada serangan teoritis. Dalam beberapa tahun terakhir, cipher telah digantikan oleh Advanced Encryption Standard (AES).
DES merupakan salah satu algoritma kriptografi cipher block dengan ukuran blok 64 bit dan ukuran kuncinya 56 bit. Algoritma DES dibuat di IBM, dan merupakan modifikasi daripada algoritma terdahulu yang bernama Lucifer. Lucifer merupakan algoritma cipher block yang beroperasi pada blok masukan 64 bit dan kuncinya berukuran 128 bit.

2.    ADVANCE ENCRYPTION STANDART
          Advance Encryption Standard ( AES ) merupakan pengganti dari DES setelah DES ditarik sebagai standar oleh Institut Nasional Standar dan Teknologi (sebelumnya National Bureau of Standards).
AES adalah sebuah spesifikasi untuk enkripsi data elektronik yang ditetapkan oleh US National Institute of Standar dan Teknologi (NIST) pada tahun 2001. [ 4 ] .  AES termasuk dalam standar ISO / IEC 18033-3. AES tersedia dalam berbagai paket enkripsi yang berbeda, dan merupakan yang pertama diakses publik dan terbuka cipher disetujui oleh National Security Agency (NSA) untuk rahasia informasi bila digunakan dalam NSA disetujui modul kriptografi (lihat Keamanan AES , di bawah).
Advanced Encryption Standard (AES) merupakan algoritma cryptographic yang dapat digunkan untuk mengamakan data. Algoritma AES adalah blokchipertext simetrik yang dapat mengenkripsi (encipher) dan dekripsi (decipher) infoermasi.
Salah satu aplikasi VoIP adalah salah satu yang memanfaatkan metode enkripsi Advanced Ecryption Standard seperti  Skype. Skype adalah [software] aplikasi komunikasi suara berbasis IP melalui internet antara sesama pengguna Skype.

3.    DIGITAL SERTIFICATE SERVER
          Digital Certificate Server adalah file yang terproteksi password yang berisi berbagai macam info berita: nama dan alamat email pemegang sertifikat, kunci enkripsi yang dapat digunakan untuk memverifikasi tanda tangan digital pemegang, nama perusahaan yang mengeluarkan sertifikat, dan periode validitas sertifikat.
Digital Certificate Server melakukan verifikasi untuk digital signature, autentikasi user, menggunakan public dan private key, contoh : Netscape Certificate Server.
Digital Certificate memungkinkan anda untuk menyampaikan informasi mengenai perusahaan anda ketika melakukan transaksi dengan pengguna situs anda. Dengan demikian akan membuktikan identitas perusahaan anda. Digital Certificate “mengikat” Identitas anda dengan sepasang key yang dapat digunakan untuk melakukan enkripsi dan menandatangani informasi.
Digital Certificate biasanya terdiri dari Public Key Pemilik, Nama Pemilik, Tanggal Berlaku Public Key, Serial Number Digital Certificate, Digital Signature dari CA (Issuer).

4.    IP SECURITY (IPSEC)
          Internet Protocol Security (IPsec) adalah protokol untuk mengamankan Internet Protocol (IP) komunikasi dengan otentikasi dan enkripsi setiap paket IP dari sebuah sesi komunikasi. IPsec juga mencakup protokol untuk mendirikan otentikasi bersama antara agen pada awal sesi dan negosiasi kunci kriptografi yang akan digunakan selama sesi. Contoh penggunaan IPSEC adalah aplikasi VPN
IPsec suite adalah sebuah standar terbuka . IPsec menggunakan berikut protokol untuk melakukan berbagai fungsi:
  • Otentikasi Header (AH) menyediakan connectionless integritas dan data asal otentikasi untuk IP datagram dan memberikan perlindungan terhadap serangan replay .
  • Payloads Keamanan encapsulating (ESP) menyediakan kerahasiaan , data asal otentikasi , connectionless integritas , layanan anti-ulangan (suatu bentuk dari integritas urutan parsial), dan kerahasiaan arus lalu lintas terbatas.
  • Asosiasi keamanan (SA) memberikan bundel algoritma dan data yang memberikan parameter yang diperlukan untuk mengoperasikan AH dan / atau operasi ESP.

Secara Umum Layanan yang di berikan IPSEC adalah :
  • Data Confidentiality, pengirim data dapat menngenkripsi paket data sebelum dilakukan ransmisi data
  • Data intelrity, penerima dapat mengotentikasi paket yang dikirimkan oleh pengirim
  • Data Origin Authentication, penerima dapat mengotentikasi asal dari paket IPSECyang dikirimkan
  • Anti replay, penerima dapat mendeteksi dan menolak paket yang telah dibajak

5.    KEBERUS
          Kerberos merupakan layanan autentikasi yang dikembangkan oleh MIT (Massachusetts Institute of Technology) Amerika Serikat, dengan bantuan dari Proyek Athena. Tujuannya adalah untuk memungkinkan pengguna (user) dan layanan (service) untuk saling mengautentikasi satu dengan yang lainnya. Dengan kata lain, saling menunjukkan identitasnya.
Kerberos dibuat untuk menangani masalah otentikasi.kerberos memungkinkan server dan cliet saling melakukan otentikasi sebelum membuat suatu koneksi. Kerberos dalam keamanan computer adalah merujuk kepada sebuah protocol autentikasi yang dikembangkan oleh Massachusetts Institute Technology (MIT). Protokol Kerberos memiliki tiga subprotokol agar dapat melakukan aksinya yakni Authentication Service (AS) Exchange, Ticket-Granting Service (TGS) Exchange, Client/Server(CS)Exchang.

6.    POINT TO POINT TUNNELING PROTOCOL (PPTP)
          PPTP merupakan protokol jaringan yang memungkinkan pengamanan transfer data dari remote client (client yang berada jauh dari server) ke server pribadi perusahaan dengan membuat sebuah VPN melalui TCP/IP (Snader, 2005). Protokol ini dikembangkan oleh Microsoft dan Cisco.
Teknologi jaringan PPTP merupakan pengembangan dari remote access Point-to-Point protocol yang dikeluarkan oleh Internet Engineering Task Force (IETF).
Fasilitas utama dari penggunaan PPTP adalah dapat digunakannya public-switched telephone network (PSTN) untuk membangun VPN. Pembangunan PPTP yang mudah dan berbiaya murah untuk digunakan secara luas menjadi solusi untuk remote user dan mobile user, karena PPTP memberikan keamanan dan enkripsi komunikasi melalui PSTN ataupun internet.

7.    LAYER TWO TUNNELING PROTOCOL (L2TP)
          L2TP adalah protokol tunneling yang memadukan dua buah protokol tunneling, yaitu L2F (Layer 2 Forwarding) milik Cisco dan PPTP milik Microsoft (Gupta, 2003).
L2TP biasanya digunakan dalam membuat Virtual Private Dial Network (VPDN) yang dapat bekerja membawa semua jenis protokol komunikasi di dalamnya. L2TP memungkinkan penggunanya untuk tetap dapat terkoneksi dengan jaringan lokal milik mereka dengan policy keamanan yang sama dan dari manapun mereka berada, melalui koneksi VPN atau VPDN. Koneksi ini sering kali dianggap sebagai sarana memperpanjang jaringan lokal milik penggunanya, namun melalui media publik.
Namun, teknologi tunneling ini tidak memiliki mekanisme untuk menyediakan fasilitas enkripsi karena memang benar-benar murni hanya membentuk jaringan tunnel. Fasilitas enkripsi disediakan oleh protokol enkripsi yang lewat di dalam tunnel. Selain itu, apa yang lalu-lalang di dalam tunnel ini dapat ditangkap dan dimonitor dengan menggunakan protocol analizer.

8.    REMOTE ACCESS DIAL-IN USER SERVICE (RADIUS)
          Remote Access (pada sebagian literatur Authentication) Dial-In User Service, yang sering disingkat menjadi RADIUS, adalah sebuah protokol keamanan komputer yang digunakan untuk melakukan autentikasi, otorisasi, dan pendaftaran akun pengguna secara terpusat untuk mengakses jaringan.
RADIUS kini telah diimplementasikan untuk melakukan autentikasi terhadap akses jaringan secara jarak jauh dengan menggunakan koneksi selain dial-up, seperti halnya Virtual Private Networking (VPN), access point nirkabel, switch Ethernet, dan perangkat lainnya.

9.    RSA ENCRYPTION
          Semenjak Algoritma RSA dipublikasikan sebagai aplikasi paten, regulasi di sebagian besar negara-negara lain tidak memungkinkan penggunaan paten. Hal ini menyebabkan hasil temuan Clifford Cocks di kenal secara umum, paten di Amerika Serikat tidak dapat mematenkannya.
Fungsi RSA dapat juga digunakan untuk mengesahkan sebuah pesan. Misalkan Alice ingin mengirim pesan kepada Bob. Alice membuat sebuah hash value dari pesan tersebut, di pangkatkan dengan bilangan d dibagi N (seperti halnya pada deskripsi pesan), dan melampirkannya sebagai “tanda tangan” pada pesan tersebut. Saat Bob menerima pesan yang telah “ditandatangani”, Bob memangkatkan “tanda tangan” tersebut dengan bilangan e dibagi N (seperti halnya pada enkripsi pesan), dan membandingkannya dengan nilai hasil dari hash value dengan hash value pada pesan tersebut. Jika kedua cocok, maka Bob dapat mengetahui bahwa pemilik dari pesan tersebut adalah Alice, dan pesan pun tidak pernah diubah sepanjang pengiriman.
Harap dicatat bahwa padding scheme merupakan hal yang esensial untuk mengamankan pengesahan pesan seperti halnya pada enkripsi pesan, oleh karena itu kunci yang sama tidak digunakan pada proses enkripsi dan pengesahan.

10.    SECURE HASH ALGORITHMS (SHA)
          SHA adalah fungsi hash satu-arah yang dibuat oleh NIST dan digunakan bersama DSS (Digital Signature Standard). Oleh NSA, SHA dinyatakan sebagai standard fungsi hash satu-arah. SHA didasarkan pada MD4 yang dibuat oleh Ronald L. Rivest dari MIT.
SHA disebut aman (secure) karena ia dirancang sedemikian sehingga secara komputasi tidak mungkin menemukan pesan yang berkoresponden dengan message digest yang diberikan.
Algoritma SHA menerima masukan berupa pesan dengan ukuran maksimum 2, 64 bit (2.147.483.648 gigabyte) dan menghasilkan message digest yang panjangnya 160 bit, lebih panjang dari message digest yang dihasilkan oleh MD5

11.    MD5
          MD5 adalah salah satu dari serangkaian algortima message digest yang didesain oleh Profesor Ronald Rivest dari MIT (Rivest, 1994). Saat kerja analitik menunjukkan bahwa pendahulu MD5 — MD4 — mulai tidak aman, MD5 kemudian didesain pada tahun1991 sebagai pengganti dari MD4 (kelemahan MD4 ditemukan oleh Hans Dobbertin).
Dikarenakan MD5 hanya menggunakan satu langkah pada data, jika dua buah awalan dengan hash yang sama dapat dibangun, sebuah akhiran yang umum dapat ditambahkan pada keduanya untuk membuat kerusakan lebih masuk akal. Dan dikarenakan teknik penemuan kerusakan mengijinkan pendahuluan kondisi hash menjadi arbitari tertentu, sebuah kerusakan dapat ditemukan dengan awalan apapun. Proses tersebut memerlukan pembangkitan dua buah berkas perusak sebagai berkas templat, dengan menggunakan blok 128-byte dari tatanan data pada 64-byte batasan, berkas-berkas tersebut dapat mengubah dengan bebas dengan menggunakan algoritma penemuan kerusakan.

12.    SECURE SHELL(SSH)
          Secure Shell atau SSH adalah protokol jaringan yang memungkinkan pertukaran data melalui saluran aman antara dua perangkat jaringan. Terutama banyak digunakan pada sistem berbasis Linux danUnix untuk mengakses akun shell, SSH dirancang sebagai pengganti Telnet dan shell remote tak aman lainnya, yang mengirim informasi, terutama kata sandi, dalam bentuk teks sederhana yang membuatnya mudah untuk dicegat. Enkripsi yang digunakan oleh SSH menyediakan kerahasiaan dan integritas data melalui jaringan yang tidak aman seperti Internet.
SSH menggunakan kriptografi kunci publik untuk mengotentikasi komputer remote dan biarkan komputer remote untuk mengotentikasi pengguna, jika perlu. SSH biasanya digunakan untuk login ke mesin remote dan mengeksekusi berbagai perintah, tetapi juga mendukung tunneling, forwarding TCP port dan X11 connections.

13.    SECURE SOCKET LAYER (SSL)
          SSL atau Secure Sockets Layer adalah sebuah protokol keamanan data yang digunakan untuk menjaga pengiriman data web server dan pengguna situs web tersebut.
Protokol SSL mengotentikasi server kepada client menggunakan kriptografi kunci publik dan sertifikat digital. Protokol ini juga menyediakan otentikasi client ke server. Algoritma kunci publik yang digunakan adalah RSA, dan untuk algoritma kunci rahasia yang digunakan adalah IDEA, DES, dan 3DES, dan algoritma fungsi hash menggunakan MD5. Verifikasi kunci publik dapat menggunakan sertifikat yang berstandar X.509.
Sertifikat SSL memastikan data transaksi yang terjadi secara online di enkripsi/acak sehingga tidak dapat dibaca oleh pihak lain. Kegunaan utamanya adalah untuk menjaga keamanan dan kerahasiaan data ketika melakukan transaksi.
Sertifikat SSL memberikan jaminan keamanan pada pemilik dan pengunjung situs atas data yang dikirim lewat web. Sertifikat SSL yang sering digunakan dapat dilihat pada situs perbankan untuk melakukan transaksi e-banking.




APLIKASI KRIPTOGRAFI
          Caesar Cipher adalah metode yang menggunakan putaran abjad. cara mencari enkripsinya adalah dengan cara memajukan nilai putaran dari abjad yang dimasukkan.berikut contoh aplikasinya.
setelah aplikasi dijalankan ketikkan "IIS DAHLIA" dengan bergeser sebanyak key "3", pilih Action "Encrypt" kemudian Klik Encrypt Message.
Untuk memastikan kembali copy hasil enkripsi kemudian pilih key "3" dan klik Decrypt maka akan keluar tulisan "IIS DAHLIA".


untuk source codenya bisa dilihat dibawah :
/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CipherIis;

/**
 *
 * @author IisDahlia
 */
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class caesarcipher extends JFrame implements ActionListener {

    private static JLabel msgLabel = new JLabel("Message: ");
    private static JLabel keyLabel = new JLabel("Key: ");
    private static JLabel actionLabel = new JLabel("Action: ");
    private static JLabel resultLabel = new JLabel("Result: ");
    private static JTextField msgTextField = new JTextField(20);
    private static JTextField resultTextField = new JTextField(20);
    private static JSpinner keySpinner = new JSpinner( new SpinnerNumberModel(3, 1, 25, 1) );
    private static JRadioButton encryptRadio = new JRadioButton("Encrypt");
    private static JRadioButton decryptRadio = new JRadioButton("Decrypt");
    private static JButton actionButton = new JButton("Encrypt Message");
    private static JPanel panel = new JPanel();
    private static ButtonGroup group = new ButtonGroup();

    public static void main(String[] args) {
        new caesarcipher();
    }

    public caesarcipher() {
        this.setSize(310, 192);
        this.setTitle("Caesar Cipher");
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setResizable(false);

        panel.setLayout(new GridBagLayout());

        addComponent(panel, msgLabel, 0, 0, 1, 1, GridBagConstraints.LINE_START);
        addComponent(panel, msgTextField, 1, 0, 2, 1, GridBagConstraints.LINE_START);

        addComponent(panel, keyLabel, 0, 1, 1, 1, GridBagConstraints.LINE_START);
        addComponent(panel, keySpinner, 1, 1, 1, 1, GridBagConstraints.LINE_START);

        addComponent(panel, actionLabel, 0, 2, 1, 1, GridBagConstraints.LINE_START);
        group.add(encryptRadio);
        group.add(decryptRadio);
        addComponent(panel, encryptRadio, 1, 2, 1, 1, GridBagConstraints.LINE_START);
        addComponent(panel, decryptRadio, 2, 2, 1, 1, GridBagConstraints.LINE_START);
        encryptRadio.setSelected(true);
        encryptRadio.addActionListener(this);
        decryptRadio.addActionListener(this);

        addComponent(panel, resultLabel, 0, 3, 1, 1, GridBagConstraints.LINE_START);
        addComponent(panel, resultTextField, 1, 3, 2, 1, GridBagConstraints.LINE_START);
        resultTextField.setEditable(false);

        addComponent(panel, actionButton, 1, 4, 1, 1, GridBagConstraints.CENTER);
        actionButton.addActionListener(this);

        this.add(panel);
        this.setVisible(true);
        }

    private void addComponent(JPanel p, JComponent c, int x, int y, int width, int height, int align) {
        GridBagConstraints gc = new GridBagConstraints();
        gc.gridx = x;
        gc.gridy = y;
        gc.gridwidth = width;
        gc.gridheight = height;
        gc.weightx = 100.0;
        gc.weighty = 100.0;
        gc.insets = new Insets(5, 5, 5, 5);
        gc.anchor = align;
        gc.fill = GridBagConstraints.NONE;
        p.add(c, gc);
        }

    private void encryptMessage(String msg, int k) {
        String result = "";
        resultTextField.setText("");
        for (int i = 0; i < msg.length(); i++)
        result += encryptChar(msg.charAt(i), k);
        resultTextField.setText(result);
        }

    private char encryptChar(char c, int k) {
        if (Character.isLetter(c))
        return (char) ('A' + (c - 'A' + k) % 26);
        else
        return c;
        }

    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == encryptRadio)
        actionButton.setText("Encrypt Message");

        if (e.getSource() == decryptRadio)
        actionButton.setText("Decrypt Message");

        if (e.getSource() == actionButton) {
        String str = msgTextField.getText();
        int k = (Integer) keySpinner.getValue();
        int key = 0;
        String message = "";

        if (str.equals("")) {
        JOptionPane.showMessageDialog(null, "Please enter a message!", "Error!", JOptionPane.ERROR_MESSAGE);
        msgTextField.requestFocus();
        return;
        }                                                                                                                                                                                                                                                                                                                                                                                                                         

    message = str.toUpperCase();
    if (encryptRadio.isSelected())
    key = k;
    else
    key = 26 - k;

    encryptMessage(message, key);
    }
}
}


          Vigenere chiper merupakan salah satu algoritma kriptografi klasik untuk menyandikan suatu plaintext dengan menggunakan teknik substitusi. Berikut contoh aplikasinya :
Ketikkan sesuai gambar dibawah.



untuk source codenya adalah sebagai berikut :
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package CipherIis;

/**
 *
 * @author IisDahlia
 */
public class vigenerecipher extends javax.swing.JFrame {

    /**
     * Creates new form vigenere
     */
    public vigenerecipher() {
        setLocationRelativeTo(null);
        initComponents();
    }
   
    private String inputText_="";
   
    private String outputText_="";
   
    private String key_;
   
    public void inputKey() /* inputs key for encryption / decryption */ {
        key_ = Tf_Kunci.getText();
        if (Tf_Kunci.getText().equals("")) {
            System.out.print("\n> Only alphabet is allowed or key cannot be empty. Try again.\n");
        }
    }
   
    public String getRepeatKey() /* returns repeated key with length equals plaintext's length */ {
        String output = "";
        int i = 0;
        inputText_=Ta_plaintext.getText();
        while (output.length() != Ta_plaintext.getText().length()) {
            output += Character.toUpperCase(key_.charAt(i));
            i++;
            if (i == (key_).length()) {
                i = 0;
            }
        }
        return output;
    }

        public String getRepeatKeyD() /* returns repeated key with length equals plaintext's length */ {
        String output = "";
        int i = 0;
        inputText_=Tf_vigenere.getText();
        while (output.length() != Tf_vigenere.getText().length()) {
            output += Character.toUpperCase(key_.charAt(i));
            i++;
            if (i == (key_).length()) {
                i = 0;
            }
        }
        return output;
    }
   
    public String getAllUpperCase(String _value) /* returns String with all upper-case */ {
        String output = "";
        int i = 0;
       
        while (output.length() != _value.length()) {
            if (Character.isLetter(_value.charAt(i))) {
                output += Character.toUpperCase(_value.charAt(i));
            } else {
                output += _value.charAt(i);
            }
            i++;
        }
       
        return output;
    }
   
    public void encryptKey() /* encrypts plaintext using key_ */ {
        Tf_vigenere.setText("");
        outputText_="";
        String keyRepeated = getRepeatKey();
        String tempInput = getAllUpperCase(Ta_plaintext.getText());
       
        for (int i = 0; i < tempInput.length(); i++) {
            if (Character.isLetter(tempInput.charAt(i))) {
                outputText_ += (char) ((tempInput.charAt(i) - (int) 'A' + keyRepeated.charAt(i) - (int) 'A') % 26 + (int) 'A');
            } else {
                outputText_ += tempInput.charAt(i);
            }
        }
        Tf_vigenere.setText(outputText_);
    }
   
    public void decryptKey() /* decrypts ciphertext using key_ */ {
        Ta_plaintext.setText("");
        outputText_="";
        String keyRepeatedD = getRepeatKeyD();
        String tempInput = getAllUpperCase(Tf_vigenere.getText());
        char tempOutput = ' ';
       
        for (int i = 0; i < tempInput.length(); i++) {
            if (Character.isLetter(tempInput.charAt(i))) {
                tempOutput = (char) ((tempInput.charAt(i) - (int) 'A' - keyRepeatedD.charAt(i) - (int) 'A') % 26 + (int) 'A');
                if (!(Character.isLetter(tempOutput))) {
                    tempOutput = (char) ((int) tempOutput + 26);
                }
            } else {
                tempOutput = tempInput.charAt(i);
            }
            outputText_ += tempOutput;
            Ta_plaintext.setText(outputText_);
            tempOutput = ' ';
        }
       
    }

    // CONSTRUCTOR
    // ACCESSOR GET
    // PREDICATE
    public boolean isKeyValid() /* returns whether key_ input is valid */ {
        int i = 0;
        boolean output = true;
       
        if (key_.length() == 0) {
            output = false;
        }
       
        while ((i != key_.length()) && (output == true)) {
            if (!(Character.isLetter(key_.charAt(i)))) {
                output = false;
            }
            i++;
        }
        return output;
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                         
    private void initComponents() {

        jPanel1 = new javax.swing.JPanel();
        jLabel1 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        Ta_plaintext = new javax.swing.JTextArea();
        jLabel2 = new javax.swing.JLabel();
        Tf_Kunci = new javax.swing.JTextField();
        jLabel3 = new javax.swing.JLabel();
        jScrollPane2 = new javax.swing.JScrollPane();
        Tf_vigenere = new javax.swing.JTextArea();
        btn_enkrip = new javax.swing.JButton();
        btn_decrip = new javax.swing.JButton();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("PLAINTEXT");

        Ta_plaintext.setColumns(20);
        Ta_plaintext.setRows(5);
        jScrollPane1.setViewportView(Ta_plaintext);

        jLabel2.setText("KUNCI");

        Tf_Kunci.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                Tf_KunciActionPerformed(evt);
            }
        });

        jLabel3.setText("VIGENERE TEXT");

        Tf_vigenere.setColumns(20);
        Tf_vigenere.setRows(5);
        jScrollPane2.setViewportView(Tf_vigenere);

        btn_enkrip.setText("ENKRIP");
        btn_enkrip.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_enkripActionPerformed(evt);
            }
        });

        btn_decrip.setText("DEKRIP");
        btn_decrip.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                btn_decripActionPerformed(evt);
            }
        });

        jButton1.setText("Clear");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jLabel1)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(btn_enkrip)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 77, Short.MAX_VALUE)
                        .addComponent(jButton1))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanel1Layout.createSequentialGroup()
                                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(jLabel3))
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                .addComponent(btn_decrip))
                            .addComponent(Tf_Kunci, javax.swing.GroupLayout.PREFERRED_SIZE, 166, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel2))
                        .addGap(0, 134, Short.MAX_VALUE)))
                .addContainerGap())
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addComponent(jLabel1)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(btn_enkrip)))
                    .addComponent(jButton1))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 16, Short.MAX_VALUE)
                .addComponent(jLabel2)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(Tf_Kunci, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(btn_decrip))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel1, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

        pack();
    }// </editor-fold>                       

    private void Tf_KunciActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
    }                                       

    private void btn_decripActionPerformed(java.awt.event.ActionEvent evt) {                                          
        Ta_plaintext.setText("");
        inputKey();
        decryptKey();
    }                                         

    private void btn_enkripActionPerformed(java.awt.event.ActionEvent evt) {                                          
inputKey();
Tf_vigenere.setText("");
encryptKey();
    }                                         

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                        
Tf_Kunci.setText("");
Ta_plaintext.setText("");
Tf_vigenere.setText("");
    }                                       

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(vigenerecipher.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(vigenerecipher.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(vigenerecipher.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(vigenerecipher.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new vigenerecipher().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                    
    private javax.swing.JTextArea Ta_plaintext;
    private javax.swing.JTextField Tf_Kunci;
    private javax.swing.JTextArea Tf_vigenere;
    private javax.swing.JButton btn_decrip;
    private javax.swing.JButton btn_enkrip;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    // End of variables declaration                  
}



Referensi :
http://id.wikipedia.org/wiki/Kriptografi
https://lavioletasundari.wordpress.com/2014/01/17/macam-macam-kriptografi/
http://wellcometobalun.blogspot.com/2013/11/tugas-kriptografi.html

Tidak ada komentar:

Posting Komentar