Blogger Widgets

Sabtu, 07 Desember 2013

IMPLEMENTASI KRIPTOGRAFI JAVA

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. Tidak semua aspek keamanan informasi ditangani oleh kriptografi.
Ada empat tujuan mendasar dari ilmu kriptografi ini yang juga merupakan aspek keamanan informasi yaitu :
  • 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.
  • 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.
  • 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.
  • Non-repudiasi., atau nirpenyangkalan adalah usaha untuk mencegah terjadinya penyangkalan terhadap pengiriman/terciptanya suatu informasi oleh yang mengirimkan/membuat.
Keamanan Password dan Enkripsi
Salah satu feature keamanan yang penting yang digunakan saat ini adalah password. Penting bagi anda dan seluruh pemakai anda untuk memiliki password yang aman dan tidak dapat diterka. Kebanyakan distribusi Linux terbaru menyertakan program ‘passwd’ yang tidak membolehkan anda menset password yang mudah diterka. Pastikan program passwd anda terbaru dan memiliki feature ini.
Diskusi mendalam tentang enkripsi adalah di luar lingkup dokumen ini, tetapi pendahuluannya tidak. Enkripsi sangat berguna, mungkin sangat perlu di saat ini. Terdapat berbagai metode enkripsi data, yang memiliki karateristiknya sendiri.
Kebanyakan unicies (dan Linux bukanlah perkecualian) utamanya menggunakan algoritma enkripsi satu arah (one-way), disebut DES (Data Encryption Standard) untuk mengenkripsi password anda. Password terenkripsi ini kemudian disimpan (umumnya) di /etc/passwd (atau kurang umum) di /etc/shadow. Ketika anda berusaha login, apapun yang anda ketikkan dienkripsi dibandingkan dengan masukan dalam file yang menyimpan password anda. Jika cocok, pastilah passwordnya sama, dan anda dibolehkan mengakses. Meskipun DES merupakan algoritma enkripsi dua arah (anda dapat menkode dan mendekode pesan, dengan memberi kunci yang tepat), varian yang digunakan kebanyakan unicies adalah satu arah. Artinya tidak mungkin membalik enkripsi untuk memperoleh password dari isi /etc/passwd (atau /etc/shadow).
Serangan brute force, seperti “Crack” atau “John the Ripper” (lihat di bawah) sering dapat digunakan untuk menerka password meski password anda cukup acak. Modul PAM (lihat di bawah) memungkinkan anda menggunakan rutin enkripsi yang berbeda dengan password anda (MD5 atau sejenisnya).

Cipher Class

Class Cipher menyediakan fungsi cipher kriptografi yang digunakan untuk enkripsi dan dekripsi. Enkripsi adalah proses mengambil data (disebut cleartext) dan kunci, dan menghasilkan data (ciphertext) berarti kepada pihak ketiga yang tidak tahu kuncinya. Dekripsi adalah proses terbalik: yang mengambil ciphertext dan cleartext kunci dan memproduksi. Ada dua jenis utama dari cipher: blok dan streaming. Cipher blok memproses seluruh blok pada suatu waktu, biasanya banyak byte panjangnya. Jika tidak ada cukup data untuk membuat blok input yang lengkap, data harus empuk: yaitu, sebelum enkripsi, dummy byte harus ditambahkan untuk membuat kelipatan dari ukuran blok cipher ini. Byte ini kemudian menanggalkan selama fase dekripsi. Padding dapat dilakukan oleh aplikasi, atau dengan menginisialisasi cipher menggunakan jenis bantalan seperti “PKCS5PADDING”. Sebaliknya, cipher aliran memproses data yang masuk satu unit kecil (biasanya byte atau bahkan sedikit) pada suatu waktu. Hal ini memungkinkan untuk cipher untuk memproses sewenang-wenang sejumlah data tanpa bantalan.
Ada dua jenis utama dari enkripsi: simetris (juga dikenal sebagai kunci rahasia), dan asimetris (atau kriptografi kunci publik). Dalam kriptografi simetris, kunci rahasia yang sama untuk kedua mengenkripsi dan mendekripsi data. Menjaga swasta kunci sangat penting untuk menjaga data rahasia. Di sisi lain, kriptografi asimetris menggunakan sepasang kunci publik / privat untuk menyandikan data. Data dienkripsi dengan salah satu kunci didekripsi dengan yang lain. Seorang pengguna pertama menghasilkan sepasang kunci publik / privat, dan kemudian menerbitkan kunci publik dalam database dipercaya bahwa setiap orang dapat mengakses. Seorang pengguna yang ingin berkomunikasi secara aman dengan pengguna yang mengenkripsi data menggunakan kunci publik diambil. Hanya pemegang kunci pribadi akan dapat mendekripsi. Menjaga kunci pribadi rahasia sangat penting untuk skema ini.
Algoritma asimetris (seperti RSA) umumnya jauh lebih lambat daripada yang simetris. Algoritma ini tidak dirancang untuk secara efisien melindungi data dalam jumlah besar. Dalam prakteknya, algoritma asimetris digunakan untuk bertukar kunci rahasia kecil yang digunakan untuk menginisialisasi algoritma simetris.



Mode Operasi
Bila menggunakan enkripsi block cipher sederhana, dua blok identik plaintext akan selalu menghasilkan blok identik cipher teks. Kriptoanalis mencoba mendobrak ciphertext akan memiliki pekerjaan lebih mudah jika mereka mencatat blok mengulangi teks. Dalam rangka untuk menambah kompleksitas teks, umpan balik modus menggunakan blok sebelumnya output untuk mengubah blok masukan sebelum menerapkan algoritma enkripsi. Blok pertama akan memerlukan nilai awal, dan nilai ini disebut vektor inisialisasi (IV). Sejak IV hanya mengubah data sebelum enkripsi apapun, IV harus acak tetapi tidak selalu perlu dirahasiakan. Ada berbagai modus, seperti CBC (Cipher Block Chaining), CFB (Cipher Feedback mode), dan OFB (Feedback mode Output). ECB (Modus Cookbook Elektronik) adalah modus tanpa umpan balik.
Beberapa algoritma seperti AES dan RSA memungkinkan untuk kunci dengan panjang yang berbeda, tetapi yang lain tetap, seperti DES dan 3DES. Enkripsi menggunakan kunci lagi umumnya menyiratkan perlawanan kuat untuk pemulihan pesan. Seperti biasa, ada trade off antara keamanan dan waktu, sehingga memilih panjang kunci tepat.
Kebanyakan algoritma menggunakan kunci biner. Kebanyakan manusia tidak memiliki kemampuan untuk mengingat urutan panjang bilangan biner, bahkan ketika diwakili dalam heksadesimal. Karakter password jauh lebih mudah untuk mengingat. Karena karakter password umumnya dipilih dari sejumlah kecil karakter (misalnya, [a-zA-Z0-9]), protokol seperti “Password Berbasis Enkripsi” (PBE) telah didefinisikan yang mengambil karakter password dan menghasilkan biner yang kuat kunci. Dalam rangka untuk membuat tugas mendapatkan dari password untuk kunci yang sangat memakan waktu bagi penyerang (melalui apa yang disebut “serangan kamus” di mana pemetaan kamus kata-> nilai umum Precomputed), implementasi yang paling PBE akan bercampur dalam nomor acak, dikenal sebagai garam, untuk meningkatkan keacakan kunci.
Baru mode cipher seperti dikonfirmasi Enkripsi dengan Data Associated (AEAD) (misalnya, Galois / Kontra Mode (GCM)) Data mengenkripsi dan mengotentikasi pesan yang dihasilkan secara bersamaan. Data yang Associated Tambahan (AAD) dapat digunakan selama calulation yang dihasilkan AEAD tag (Mac), namun data ini AAD tidak output ciphertext. (Sebagai contoh, beberapa data mungkin tidak perlu dirahasiakan, tetapi harus mencari ke perhitungan tag untuk mendeteksi modifikasi.) Metode Cipher.updateAAD () dapat digunakan untuk memasukkan AAD dalam perhitungan tag.
Membuat Objek Chiper
Objek Cipher diperoleh dengan menggunakan salah satu Cipher getInstance () metode pabrik statis. Di sini, nama algoritma sedikit berbeda dibandingkan dengan kelas mesin lainnya, dalam hal ini bukan hanya menentukan nama algoritma, tapi “transformasi”. Transformasi adalah sebuah string yang menggambarkan operasi (atau seperangkat operasi) yang akan dilakukan pada masukan yang diberikan untuk menghasilkan beberapa output. Sebuah transformasi selalu mencantumkan nama algoritma kriptografi (misalnya, DES), dan dapat diikuti oleh skema modus dan padding.
Transformasi adalah dalam bentuk:
“algorithm/mode/padding” atau  “algorithm”
Sebagai contoh, berikut ini adalah transformasi yang valid:
“DES/CBC/PKCS5Padding”
“DES”
Jika hanya nama transformasi yang ditentukan, sistem akan menentukan apakah ada implementasi yang diminta transformasi tersedia di lingkungan, dan jika ada lebih dari satu, kembali ada satu pilihan.
Jika kedua nama transformasi dan penyedia paket yang ditentukan, sistem akan menentukan apakah ada implementasi transformasi yang diminta dalam paket yang diminta, dan melempar perkecualian jika tidak ada.
Jika tidak ada modus atau padding ditentukan, nilai default penyedia khusus untuk skema modus dan padding yang digunakan. Sebagai contoh, penyedia SunJCE menggunakan ECB sebagai modus standar, dan PKCS5Padding sebagai skema bantalan default untuk DES, DES-EDE dan Blowfish cipher. Ini berarti bahwa dalam kasus penyedia SunJCE:
    Cipher c1 = Cipher.getInstance (“DES/ECB/PKCS5Padding”);
atau
Cipher c1 = Cipher.getInstance (“DES”);
Menggunakan mode seperti CFB dan OFB, cipher blok dapat mengenkripsi data dalam unit yang lebih kecil dari ukuran blok cipher yang sebenarnya. Ketika meminta modus seperti itu, Anda mungkin opsional menentukan jumlah bit untuk diproses pada suatu waktu dengan menambahkan nomor ini dengan nama modus seperti yang ditunjukkan dalam “DES/CFB8/NoPadding” dan “DES/OFB32/PKCS5Padding” transformasi. Jika tidak ada nomor seperti yang ditentukan, default penyedia khusus digunakan. (Sebagai contoh, penyedia SunJCE menggunakan default 64 bit untuk DES.) Demikian, cipher blok dapat berubah menjadi cipher aliran byte berorientasi dengan menggunakan mode 8 bit seperti CFB8 atau OFB8.
Menginisialisasi sebuah Obyek Cipher
Sebuah objek Cipher diperoleh melalui getInstance harus diinisialisasi untuk salah satu dari empat mode, yang didefinisikan sebagai konstanta bilangan bulat akhir di kelas Cipher. Modus dapat direferensikan oleh nama simbolik mereka, yang terlihat di bawah bersama dengan deskripsi tentang tujuan setiap mode:
ENCRYPT_MODE
Enkripsi data.
DECRYPT_MODE
Dekripsi data.
WRAP_MODE
Wrapping java.security.Key ke dalam byte sehingga kunci dapat diangkut dengan aman.
UNWRAP_MODE
Membuka package dari kunci sebelumnya dipackage menjadi objek java.security.Key.
Masing-masing metode inisialisasi Cipher mengambil sebuah parameter modus operasional (opmode), dan menginisialisasi objek Cipher untuk mode tersebut. Parameter lainnya termasuk kunci (key) atau sertifikat yang berisi kunci (sertifikat), parameter algoritma (params), dan sumber keacakan (acak).
Untuk menginisialisasi objek Cipher, coba metode init berikut:
public void init(int opmode, Key key);

Jika objek Cipher yang memerlukan parameter (misalnya, vektor inisialisasi) diinisialisasi untuk enkripsi, dan tidak ada parameter yang diberikan dengan metode init, implementasi cipher mendasari seharusnya memasok parameter yang diperlukan itu sendiri, baik dengan menghasilkan parameter acak atau dengan menggunakan default, set penyedia-parameter tertentu.
Namun, jika objek Cipher yang memerlukan parameter diinisialisasi untuk dekripsi, dan tidak ada parameter yang diberikan dengan metode init, sebuah InvalidKeyException atau InvalidAlgorithmParameterException Eksepsi akan dimunculkan, tergantung pada metode init yang telah digunakan.
Encrypting Dan Decrypting Data
Data dapat dienkripsi atau didekripsi dalam satu langkah (operasi-bagian tunggal) atau dalam beberapa langkah (operasi multi-bagian). Sebuah operasi multi-bagian yang berguna jika Anda tidak tahu sebelumnya berapa lama data akan menjadi, atau jika data terlalu panjang untuk disimpan dalam memori sekaligus.
Untuk mengenkripsi atau mendekripsi data dalam satu langkah, coba metode doFinal:
  public byte[] doFinal(byte[] input);
Untuk mengenkripsi atau mendekripsi data dalam beberapa langkah, coba update:
public byte[] update(byte[] input);
Sebuah operasi multi-part harus diakhiri oleh salah satu metode doFinal atas (jika masih ada beberapa data masukan tersisa untuk langkah terakhir), atau dengan salah satu metode berikut doFinal (jika tidak ada input data tersisa untuk langkah terakhir ):
public byte[] doFinal();
public int doFinal(byte[] output, int outputOffset);
Semua metode doFinal mengurus segala padding yang diperlukan (atau unpadding), jika bantalan (atau unpadding) telah diminta sebagai bagian dari transformasi yang ditentukan.
Panggilan untuk doFinal ulang objek Cipher ke negara itu ketika diinisialisasi melalui panggilan untuk init. Artinya, objek Cipher direset dan tersedia untuk mengenkripsi atau mendekripsi (tergantung pada mode operasi yang ditentukan dalam panggilan untuk init) lebih banyak data.

Output Program Kriptografi Pada Java