Standar Enkripsi Lanjutan (AES), juga dikenal sebagai metode enkripsi Rijndael dalam kriptografi, adalah standar enkripsi blok yang diadopsi oleh pemerintah federal AS. Standar ini digunakan untuk menggantikan DES asli, dan telah dianalisis oleh banyak pihak dan banyak digunakan di seluruh dunia.
Sebagian besar perhitungan AES dilakukan dalam domain terbatas tertentu.
Proses enkripsi AES beroperasi pada matriks 4 × 4 byte, juga dikenal sebagai "status", dan nilai awalnya adalah blok plaintext (ukuran elemen dalam matriks adalah byte di blok plaintext). (Metode enkripsi Rijndael mendukung blok yang lebih besar, dan jumlah baris matriksnya dapat ditingkatkan sesuai kebutuhan) selama enkripsi, setiap putaran loop enkripsi AES (kecuali putaran terakhir) berisi 4 langkah:
Langkah MixColumns dihilangkan dalam loop enkripsi terakhir, dan digantikan oleh addroundkey lainnya.
Implementasi Java Dasar:
paket com.stone.security; impor java.util.arrays; impor javax.crypto.cipher; impor javax.crypto.keygenerator; impor javax.crypto.secretkey; impor javax.crypto.spec.ivparameterspec; / *** AES Algoritma Enkripsi simetris, standar enkripsi canggih dalam kriptografi menjadi standar yang efektif pada tahun 2005*/ kelas publik AES {cipher cipher statis; string final statis key_algorithm = "aes"; string final statis cipher_algorithm_ecb = "aes/ecb/pkcs5padding"; string final statis cipher_algorithm_cbc = "aes/cbc/pkcs5padding"; /** * AES/CBC/NOPADDING PERSYARATAN * Kunci harus 16-bit; Vektor inisialisasi (iv) harus 16-bit * Panjang konten yang akan dienkripsi harus kelipatan 16. Jika bukan kelipatan 16, pengecualian berikut akan muncul: * javax.crypto.illegalblocksizeException Anda: Panjang input tidak ada dalam 16 byte * sejak jumlah bit ditetapkan, ungkapan * Panjang data asli adalah n kali bilangan bulat 16, jika panjang data asli sama dengan 16*N, panjang data terenkripsi sama dengan 16*N saat menggunakan nopadding,*dalam kasus lain, panjang data terenkripsi sama dengan 16*n. Dalam kasus kurang dari 16 kelipatan integer, jika panjang data asli sama dengan 16*n+m [di mana m kurang dari 16],*dengan cara apa pun kecuali nopadding padding, panjang data terenkripsi sama dengan 16*(n+1). */string final statis cipher_algorithm_cbc_nopadding = "aes/cbc/nopadding"; Secretkey Secretkey statis; public static void main (string [] args) melempar pengecualian {method1 ("a*jal) k32j8czx negara adalah National Wide"); Method2 ("A*Jal) K32J8CZX Negara adalah National Wide"); method3 ("a*jal) k32j8czx adalah sanitasi negara"); Method4 ("123456781234 adalah sanitasi negara"); // length = 16 method4 ("12345678AbcDefgh"); // length = 16}/** * Gunakan algoritma AES untuk enkripsi, AES/ECB */static void Method1 (string strip strip) {default Metode {cinger = ecb */static void Method1 (string strip str) strip = cing = cangkir (string string str) {cingeon {cing/ecb */static void Method1 (string str) Cipher.getInstance (key_algorithm); // KeyGenerator menghasilkan algoritma AES Secretkey Key = keygenerator.getInstance (key_algorithm) .generateKey (); System.out.println ("Panjang kunci adalah:" + Secretkey.getencoded (). Panjang); cipher.init (cipher.encrypt_mode, Secretkey); // menginisialisasi tombol menggunakan mode enkripsi byte [] encrypt = cipher.dofinal (str.getbytes ()); // mengenkripsi atau mendekripsi data sesuai dengan operasi bagian tunggal, atau mengakhiri operasi multi-bagian. System.out.println ("Method1-diedipkan:" + arrays.tostring (enkripsi)); cipher.init (cipher.decrypt_mode, Secretkey); // menginisialisasi kunci menggunakan byte mode dekripsi [] decrypt = cipher.dofinal (enkripsi); System.out.println ("Method1-Decrypted:" + New String (Decrypt)); }/** * Dienkripsi menggunakan algoritma AES, mode default AES/ECB/PKCS5PADDING */static void method2 (String str) melempar Exception {cipher = cipher.getInstance (cipher_algorithm_ecb); // KeyGenerator menghasilkan algoritma AES Secretkey Key = keygenerator.getInstance (key_algorithm) .generateKey (); System.out.println ("Panjang kunci adalah:" + Secretkey.getencoded (). Panjang); cipher.init (cipher.encrypt_mode, Secretkey); // inisialisasi tombol menggunakan byte mode enkripsi [] encrypt = cipher.dofinal (str.getbytes ()); // mengenkripsi atau mendekripsi data sesuai dengan operasi bagian tunggal, atau mengakhiri operasi multi-bagian. System.out.println ("Method2-etripsi:" + arrays.tostring (enkripsi)); cipher.init (cipher.decrypt_mode, Secretkey); // menginisialisasi kunci menggunakan byte mode dekripsi [] decrypt = cipher.dofinal (enkripsi); System.out.println ("Method2-Decrypted:" + New String (Decrypt)); } static byte [] getiv () {string iv = "1234567812345678"; // Panjang IV: Harus 16 byte Return IV.getbytes (); }/** * Gunakan algoritma AES untuk mengenkripsi, mode default AES/CBC/PKCS5PADDING */statis void method3 (string str) melempar pengecualian {cipher = cipher.getInstance (cipher_algorithm_cbc); // KeyGenerator menghasilkan algoritma AES Secretkey Key = keygenerator.getInstance (key_algorithm) .generateKey (); System.out.println ("Panjang kunci adalah:" + Secretkey.getencoded (). Panjang); cipher.init (cipher.encrypt_mode, Secretkey, ivparameterspec baru (getiv ())); // menginisialisasi kunci menggunakan byte mode enkripsi [] encrypt = cipher.dofinal (str.getbytes ()); // mengenkripsi atau mendekripsi data sesuai dengan operasi bagian tunggal, atau mengakhiri operasi multi-bagian. System.out.println ("Method3-diedipkan:" + arrays.tostring (enkripsi)); cipher.init (cipher.decrypt_mode, secretkey, ivparameterspec baru (getiv ())); // inisialisasi kunci menggunakan byte mode dekripsi [] decrypt = cipher.dofinal (enkripsi); System.out.println ("Method3-Decrypted:" + New String (Decrypt)); }/*** Dienkripsi menggunakan algoritma AES, mode default AES/CBC/NOPADDING Lihat di atas untuk batasan data untuk mode ini*/statis void Method4 (String str) melempar Exception {cipher = cipher.getInstance (cipher_algorithm_cbc_nopadding); // KeyGenerator menghasilkan algoritma AES Secretkey Key = keygenerator.getInstance (key_algorithm) .generateKey (); System.out.println ("Panjang kunci adalah:" + Secretkey.getencoded (). Panjang); cipher.init (cipher.encrypt_mode, Secretkey, ivparameterspec baru (getiv ())); // menginisialisasi kunci menggunakan byte mode enkripsi [] enkripsi = cipher.dofinal (str.getbytes (), 0, str.length ()); // mengenkripsi atau mendekripsi data sesuai dengan operasi bagian tunggal, atau mengakhiri operasi multi-bagian. System.out.println ("Method4-Encrypt:" + Arrays.tostring (Encrypt)); cipher.init (cipher.decrypt_mode, secretkey, ivparameterspec baru (getiv ())); // inisialisasi kunci menggunakan byte mode dekripsi [] decrypt = cipher.dofinal (enkripsi); System.out.println ("Method4-Decrypted:" + New String (Decrypt)); }}