FjRAR Official Blog!

Kamis, 29 Januari 2015

Pengertian Algortima Advanced Encryption Standard

18.04 Posted by Unknown No comments

Algoritma kriptografi bernama Rijndael yang didesain oleh  oleh Vincent Rijmen dan John Daemen asal Belgia keluar sebagai pemenang kontes algoritma kriptografi pengganti DES yang diadakan oleh NIST (National Institutes of  Standards and Technology) milik pemerintah Amerika Serikat pada 26 November 2001. Algoritma Rijndael inilah yang kemudian dikenal dengan Advanced Encryption Standard (AES). Setelah mengalami beberapa proses standardisasi oleh NIST, Rijndael kemudian diadopsi menjadi standard algoritma kriptografi secara resmi pada 22 Mei 2002. Pada 2006, AES merupakan salah satu algoritma terpopuler yang digunakan dalam kriptografi kunci simetrik.
Dalam kriptografiAdvanced Encryption Standard (AES) merupakan standar enkripsi dengan kunci-simetris yang diadopsi oleh pemerintah Amerika Serikat. Standar ini terdiri atas 3 blok cipher, yaitu AES-128AES-192 and AES-256, yang diadopsi dari koleksi yang lebih besar yang awalnya diterbitkan sebagaiRijndael. Masing-masing cipher memiliki ukuran 128-bit, dengan ukuran kunci masing-masing 128, 192, dan 256 bit. AES telah dianalisis secara luas dan sekarang digunakan di seluruh dunia, seperti halnya dengan pendahulunya, Data Encryption Standard (DES).

AES diumumkan oleh Institut Nasional Standar dan Teknologi (NIST) sebagaiStandar Pemrosesan Informasi Federal (FIPS) publikasi 197 (FIPS 197) pada tanggal26 November 2001 setelah proses standarisasi selama 5 tahun, di mana ada 15 desain enkripsi yang disajikan dan dievaluasi, sebelum Rijndael terpilih sebagai yang paling cocok. AES efektif menjadi standar pemerintah Federal pada tanggal 26 Mei 2002setelah persetujuan dari Menteri Perdagangan. AES tersedia dalam berbagai paket enkripsi yang berbeda. AES merupakan standar yang pertama yang dapat diakses publik dan sandi-terbuka yang disetujui oleh NSA untuk informasi rahasia. Salah satu alasan mengapa AES encryption bekerja dengan baik adalah metode enkripsi ini bekerja pada beberapa network layer pada saat yang sama. Walaupun AES dan Rijndael digunakan secara bergantian, terdapat beberapa perbedaan yang dapat dengan mudah diketahui. Sementara AES menggunakan blok cipher fix 128-bit, Rijndael dapat menggunakan blok cipher apa saja dan kunci 32-bit. Ukuran kunci dan blok cipher yang digunakan memiliki berkisar antara 128-bit sampai 256-bit. AES ini merupakan algoritma block cipher dengan menggunakan sistem permutasi dan substitusi (P-Box dan S-Box) bukan dengan jaringan Feistel sebagaiman block cipher pada umumnya. Tidak seperti DES yang berorientasi bit, Rijndael beroperasi dalam orientasi byte. Setiap putaran mengunakan kunci internal yang berbeda (disebut round key). Enciphering melibatkan operasi substitusi dan permutasi. Jenis AES terbagi 3, yaitu : 
1.      AES-128
2.      AES-192
3.      AES-256 
Pengelompokkan jenis AES ini adalah berdasarkan panjang kunci yang digunakan. Angka-angka di belakang kata AES menggambarkan panjang kunci yang digunakan pada tipa-tiap AES. Selain itu, hal yang membedakan dari masing-masing AES ini adalah banyaknya round yang dipakai. AES-128 menggunakan 10 round, AES-192 sebanyak 12 round, dan AES-256 sebanyak 14 round.
Berikut merupakan tabel diagramnya:

AES memiliki ukuran block yang tetap sepanjang 128 bit dan ukuran kunci sepanjang 128, 192, atau 256 bit. Tidak seperti Rijndael yang  block dan kuncinya dapat berukuran kelipatan 32 bit dengan ukuran minimum 128 bit dan maksimum 256 bit. Berdasarkan ukuran block yang tetap, AES bekerja pada matriks berukuran 4x4 di mana tiap-tiap sel matriks terdiri atas 1 byte (8 bit). Sedangkan Rijndael sendiri dapat mempunyai ukuran matriks yang lebih dari itu dengan menambahkan kolom sebanyak yang diperlukan.
·         Garis besar Algoritma Rijndael yang beroperasi pada blok  128-bit dengan kunci 128-bit adalah sebagai berikut (di luar proses pembangkitan round key):
§  AddRoundKey: melakukan XOR antara state awal (plainteks) dengan cipher key. Tahap ini disebut juga initial round.
§  Putaran sebanyak Nr – 1 kali. Proses yang dilakukan pada setiap putaran adalah:
o   SubBytes: substitusi byte dengan menggunakan tabel substitusi (S-box).
o   ShiftRows: pergeseran baris-baris array state secara wrapping.
o   MixColumns: mengacak data di masing-masing kolom array state.
o   AddRoundKey: melakukan XOR antara state sekarang round key.
§  Final round: proses untuk putaran terakhir:
o   SubBytes
o   ShiftRows
o   AddRoundKey

GAMBAR DIAGRAM AES
 
·         Selama kalkulasi plainteks menjadi cipherteks, status sekarang dari data disimpan di dalam array of bytes dua dimensi, state, yang berukuran NROWS ´ NCOLS.
·         Untuk blok data 128-bit, ukuran state adalah 4 ´ 4.
·         Elemen array state diacu sebagai S[r,c], 0 £ r < 4 dan 0 £ c < Nb (Nb adalah panjang blok dibagi 32.
·         Pada AES-128, Nb = 128/32 = 4)


Contoh gambarannya



  Contoh: (elemen state dan kunci dalam notasi HEX)



---------------------------------------------------------------------------------------------------

import java.security.Security;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

public class Main {
  public static void main(String[] args) throws Exception {
    Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
    byte[] input = "tes".getBytes();
    byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09,
        0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f };

    SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");

    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");

    System.out.println(new String(input));

    // encryption pass
    cipher.init(Cipher.ENCRYPT_MODE, key);

    byte[] cipherText = new byte[cipher.getOutputSize(input.length)];
    int ctLength = cipher.update(input, 0, input.length, cipherText, 0);
    ctLength += cipher.doFinal(cipherText, ctLength);
    System.out.println(new String(cipherText));
    System.out.println(ctLength);

    // decryption pass
    cipher.init(Cipher.DECRYPT_MODE, key);
    byte[] plainText = new byte[cipher.getOutputSize(ctLength)];
    int ptLength = cipher.update(cipherText, 0, ctLength, plainText, 0);
    ptLength += cipher.doFinal(plainText, ptLength);
    System.out.println(new String(plainText));
    System.out.println(ptLength);
  }
}

0 komentar:

Posting Komentar