Translate

Saturday, July 16, 2016

Blowfish Encryption modes CBC

 Blowfish Encryption modes CBC


.::Introduction  about  blowfish ……
Metoda Enkripsi Blowfish
Blowfish merupakan metoda enkripsi yang mirip dengan DES (DES-like cipher) dan diciptakan oleh Bruce Schneier yang ditujukan untuk mikroposesor besar (32 bit ke atas dengan cache data yang besar). Blowfish dikembangkan untuk memenuhi kriteria disain sebagai berikut:
  • Cepat, pada implementasi yang optimal Blowfish dapat mencapai kecepatan 26 clock cycle per byte.
  • Kompak, Blowfish dapat berjalan pada memori kurang dari 5 KB.
  • Sederhana, Blowfish hanya menggunakan operasi yang simple :  penambahan (addition), XOR, dan penelusuran tabel (table lookup) pada operand 32 bit. Desainnya mudah untuk dianalisa yang membuatnya resisten terhadap kesalahan implementasi.
  • Keamanan yang variabel, panjang kunci Blowfish dapat bervariasi dan dapat mencapai 448 bit (56 byte).
     Blowfish dioptimasikan untuk aplikasi dimana kunci tidak sering berubah, seperti jalur komunikasi atau enkripsi file otomatis. Blowfish jauh lebih cepat dari DES bila diimplementasikan pada 32 bit mikroprosesor dengan cache data yang besar, seperti Pentium dan Power PC, Blowfish tidak cocok untuk aplikasi seperti packet switching, dengan perubahan kunci yang sering, atau sebagai fungsi hash satu arah. Kebutuhan memorinya yang besar tidak memungkinkan untuk aplikasi kartu pintar (smart card).

.:More about blowfish and the algorithm
Deskripsi dari Blowfish
Blowfish merupakan blok cipher 64-bit dengan panjang kunci variabel. Algoritma ini terdiri dari dua bagian: key expansion dan enkripsi data.
Key expansion merubah kunci yang dapat mencapai 448 bit menjadi beberapa array subkunci (subkey) dengan total 4168 byte.
Enkripsi data terdiri dari iterasi fungsi sederhana sebanyak 16 kali. Setiap putaran terdiri dari permutasi kunci-dependent dan substitusi kunci- dan data-dependent. Semua operasi adalah penambahan dan XOR pada variable 32-bit. Tambahan operasi lainnya hanyalah empat penelusuran tabel (table lookup) array berindeks untuk setiap putaran.
Blowfish menggunakan subkunci yang besar. Kunci ini harus dihitung sebelum enkripsi atau dekripsi data.
Array P terdiri dari delapan belas 32-bit subkunci:
P1,P2, . . . ,P18

Empat 32-bit S-box masing-masing mempunyai 256 entri:
S1,0, S1,1, . . . , S1,255
S2,0, S2,1, . . . , S2,255
S3,0, S3,1, . . . , S3,255
S4,0, S4,1, . . . , S4,255
Metoda selengkapnya untuk menghitung subkunci ini akan dijelaskan pada bagian bawah.
Blowfish merupakan algoritma yang menerapkan jaringan Feistel (Feistel network) yang terdiri dari 16 putaran. Input merupakan elemen 64 bit, X.
Untuk mengenkrip:
Bagi X menjadi dua 32-bit:  XL,  XR
untuk i = 1 sampai 16
XL = XL xor Pi
XR = F(XL) xor XR
Tukar XL dan XR
Tukar XL dan X(batalkan penukaran terakhir)
XR = XR xor P17
XL = XL xor P18
Kombinasikan kembali XL dan XR
Fungsi F adalah sebagai berikut:
Bagi XL, menjadi empat bagian 8-bit: a, b, c dan d
F(XL) = ((S1,a + S2,b mod 232) xor S3,c) + S4,c mod 232
Dekripsi sama persis dengan enkripsi, kecuali P1, P2, . . . , P18 digunakan pada urutan yang terbalik.
Subkunci dihitung menggunakan algoritma Blowfish, metodanya adalah sebagai berikut:
  1. Pertama-tama inisialisasi P-array dan kemudian empat S-box secara berurutan dengan string yang tetap. String ini terdiri digit hexadesimal dari pi.
  2. XOR P1 dengan 32 bit pertama kunci, XOR P2 dengan 32 bit kedua dari kunci dan seterusnya untuk setiap bit dari kunci (sampai P18). Ulangi terhadap bit kunci  sampai seluruh P-array di XOR dengan bit kunci.
  3. Enkrip semua string nol dengan algoritma Blowfish dengan menggunakan subkunci seperti dijelaskan pada langkah (1) dan (2).
  4. Ganti P1 dan P2 dengan keluaran dari langkah (3)
  5. Enkrip keluaran dari langkah (3) dengan algoritma Blowfish dengan subkunci yang sudah dimodifikasi.
  6. Ganti P3 dan P4 dengan keluaran dari langkah (5).
  7. Lanjutkan proses tersebut, ganti seluruh elemen dari P-array, dan kemudian seluruh keempat S-box berurutan, dengan keluaran yang berubah secara kontinyu dari algoritma Blowfish.
Total diperlukan 521 iterasi untuk menghasilkan semua subkunci yang dibutuhkan. Aplikasi kemudian dapat menyimpan subkunci ini dan tidak dibutuhkan langkah-langkah proses penurunan ini berulang kali, kecuali kunci yang digunakan berubah.

Keamanan dari Blowfish
Tidak ada kelemahan yang berarti dari algoritma Blowfish yang dapat ditemukan sampai saat ini, kecuali adanya weak key, dimana dua entri dari S-box mempunyai nilai yang sama. Tidak ada cara untuk mencek weak key sebelum melakukan key expansion. Bila dikuatirkan hal ini dapat mengurangi keamanannya maka dapat dibuat rutin untuk mengecek entri S-box, walaupun hal ini tidak perlu.
Sampai saat ini tidak ada cryptanalysis yang berhasil tehadap Blowfish, untuk amannya jangan menggunakan Blowfish dengan kurang dari 16 putaran (round).
 .: What is CBC ….

Cipher-block chaining (CBC)

 


 Dalam mode cipher-block chaining (CBC),masing-masing dari plaintext adalah di XOR dengan blok ciphertext sebelumnya sebelum dienkripsi.Cara ini ,masing-masing blok ciphertext adalah tergantung pada semua blok plaintext ke point tersebut.Juga,untuk membuat masing-masing message unique sebuah initialization vector digunakan.



CBC adalah mode operasi yang paling sering digunakanis.Kekurangannya adalah bahwa operasinya secara sequensial dan tidak bias diparalel(solusi yang mungkin adalah menggunakan mode counter).
.: the SOURCE ………….
Penjelasan Program. 

Meng-generate key

  Untuk demo ini kita menggunakan key 128 bit.Key-nya disimpan sebagai sebuah character array dalam program.Kita juga menggenerate sebuah inisialisasi vector 64 bit (IV). Untuk programnya menggunakan mode Cipher Block Chaining (CBC). Juga kita tidak akan mengguanakan fungsi blowfish secara langsung akan tetapi menggunakannya melalui sebuah interface high level.
Sebuah initialization vector adalah sebuah bit dari informasi random yang digunakan sebagai sebuah input dalam rantai algoritma enkripsi,yaitu,saat masing-masing tingkat dari enkripsi sebuah blok dari input data menyediakan beberapa input untuk enkripsi dari blok berikutnya. (blowfish menggunakan  blok 64-bit untuk enkripsi). IV menyediakan bit pertama dari input untuk enkripsi pada data blok pertama,yang kemudian menyediakan input untuk blok berikutnya dan begitu seterusnya.Bit left over pada akhirnya di discard/di buang.
Bit random digenerate dari karakter special dari file /dev/random  menyediakan sebuah source bagus untuk angka random.




Fungsi Enkripsi

Fungsi enkripsi menerima dua parameter,yakni file descriptor dari file input dan file output yang digunakan untuk menyimpan data terenkripsi. Ide bagus bila kita me-zero-kan –isi buffer menggunakan dengan perintah memset atau bzero commands sebelum menggunakan buffer dengan data.Hal ini menjadi penting jika kita berencana untuk menggunakan kembali buffernya.Dalam program berikut ini ,input data dienkripsi dalam blok masing-masing 1 K.
Langkah-langkah untuk enkripsi adalah sebagai berikut ini :
  1. Buat sebuah cipher context
  2. Inisialisasi cipher context dengan nilai dari Key dan IV
  3. Panggil EVP_EncryptUpdate untuk mengenkripsi berturut-turut blok dari masing-masing 1 K
  4. Panggil EVP_EncryptFinal untuk mengenkripsi data "leftover" data
  5. Akhirnya panggil EVP_CIPHER_CTX_membersihkan untuk membuang semua informasi sensitive dari memory.










                                                             
   Sekarang apa itu data "leftover"? Seperti disebutkan sebelumnya, Blowfish mengenkripsi dalam masing-masing blok dari 64 bit.Kadang-kadang kita mungkin tidak akan memiliki 64 bit untuk membuat sebuah blok.Hal ini bias terjadi jika ukuran buffer dalam program berikut ini atau ukuran data file/input bukanlah sebuah multiple integraldari 8 bytes(64-bits).Jadi, sesuai dengan itu data diblok dan kemudian blok parsial dienkripsi menggunakan EVP_EncryptFinal.Panjang dari blok data terencode disimpan dalam variable tlen dan menambahkan ke final length.


Fungsi decryption


Fungsi decryption pada dasarnya mengikuti langkah yang sama dengan fungsi encryption.Kode berikut ini menunjukkan bagaimana decryption dilakukan.



       


Bagaimana cara penggunaannya :

Perintah untuk meng-compile programnya adalah :
# gcc -o x5102100068.o x5102100068.c -lcrypto

 

Program ini membutuhkan 3 file dari command line :
  1. File yang akan dienkripsi [dalam hal ini adalah dienkripsi.txt]
  2. File untuk menyimpan data terenkripsi [dalam hal ini adalah terenkripsi.txt]
  3. File untuk menyimpan data yang ter-dekripsi.[dalam hal ini adalah terdekripsi.txt]
Bagaimana meng-eksekusi-nya :




    



                                 
à melakukan enkripsi








à melakukan dekripsi



No comments:

Post a Comment

silahkan membaca dan berkomentar