Code java ví dụ mã hóa – giải mã với AES.
AES là gì?
Advanced Encryption Standard (AES) là một thuật toán mã hóa, được dùng làm tiêu chuẩn mã hóa.
Đặc điểm:
- Kích thước khối dữ liệu của AES là 128 bít
- Kích thước khóa có thể là 128, 192, hoặc 256 bit (là bội của 32 và lớn nhất là 256 bít)
DES là loại mã hóa đối xứng, sử dụng một khóa bí mật duy nhất cho cả quá trình mã hóa và giải mã
(Ở bài này mình tập trung vào cài đặt ví dụ mã hóa và giải mã AES, còn chi tiết về AES thì nó khá dài, mình sẽ viết riêng một bài khác, hoặc các bạn có thể tham khảo chi tiết tại:
https://en.wikipedia.org/wiki/Advanced_Encryption_Standard
http://tryingshare123.blogspot.com/2014/09/java-security-phan-2-secret-key.html)
Ví dụ mã hóa, giải mã với AES
1. Tạo key (tạo khóa mã hóa/giải mã)
String SECRET_KEY = "stackjava.com.if"; SecretKeySpec skeySpec = new SecretKeySpec(SECRET_KEY.getBytes(), "AES");
2. Cipher Info
Tạo một đối tượng Cipher (đối tượng này dùng để mã hóa, giải mã) và chỉ rõ các thông tin:
- Tên thuật toán
- Mode (tùy chọn)
- Padding scheme (tùy chọn)
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING");
Note: AES = Advanced Encryption Standard. ECB = Electronic Codebook mode. PKCS5Padding = PKCS #5-style padding.
3. Mã hóa
String original = "stackjava.com"; Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] byteEncrypted = cipher.doFinal(original.getBytes()); String encrypted = Base64.getEncoder().encodeToString(byteEncrypted);
Khi thực hiện mã hóa hay giải mã nó sẽ thực hiện trên byte[]
(ở đây mình ví dụ mã hóa text nên chuyển text sang byte, các bạn có thể mã hóa tương tự với file)
Ở đây mình chuyển byte sang dạng base64 để hiển thị.
4. Giải mã
cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] byteDecrypted = cipher.doFinal(byteEncrypted); String decrypted = new String(byteDecrypted);
5. Demo
package stackjava.com.demoaes.main; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.Base64; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.SecretKeySpec; public class DemoAES { public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { String SECRET_KEY = "stackjava.com.if"; SecretKeySpec skeySpec = new SecretKeySpec(SECRET_KEY.getBytes(), "AES"); String original = "stackjava.com"; Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5PADDING"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] byteEncrypted = cipher.doFinal(original.getBytes()); String encrypted = Base64.getEncoder().encodeToString(byteEncrypted); cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] byteDecrypted = cipher.doFinal(byteEncrypted); String decrypted = new String(byteDecrypted); System.out.println("original text: " + original); System.out.println("encrypted text: " + encrypted); System.out.println("decrypted text: " + decrypted); } }
Kết quả:
original text: stackjava.com encrypted text: kIw91555KOb0SAeYmoEdWA== decrypted text: stackjava.com
Okay, Done!
Download code ví dụ trên tại đây
Code java ví dụ mã hóa – giải mã với AES
Lưu ý, AES chỉ chấp nhận các key có độ dài là 128, 192, hoặc 256 bits
Ví dụ mình dùng key là “stackjava.com.ifdf
” có độ dài là 18bytes, nó sẽ báo lỗi: