2013-04-10 37 views
5

Đây là triển khai thực hiện của tôi về một mã hóa AES 256 và giải mã, phát triển với các thư viện nguồn gốc của JDK 5:AES mã hóa/giải mã với nhà cung cấp Bouncy Castle

public static String encrypt(String key, String toEncrypt) throws Exception { 
    Key skeySpec = generateKeySpec(key); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
    byte[] encrypted = cipher.doFinal(toEncrypt.getBytes()); 
    byte[] encryptedValue = Base64.encodeBase64(encrypted); 
    return new String(encryptedValue); 
} 

public static String decrypt(String key, String encrypted) throws Exception { 
    Key skeySpec = generateKeySpec(key); 
    Cipher cipher = Cipher.getInstance("AES"); 
    cipher.init(Cipher.DECRYPT_MODE, skeySpec); 
    byte[] decodedBytes = Base64.decodeBase64(encrypted.getBytes()); 
    byte[] original = cipher.doFinal(decodedBytes); 
    return new String(original); 
} 

Tôi muốn thực hiện các phương pháp tương tự với Castle Boucy API (Java): Tôi đã tìm kiếm rất nhiều, thử nghiệm rất nhiều, không có kết quả ... ai đó có thể giúp tôi không?

Cảm ơn

+1

Bạn nhận ra rằng bạn sẽ sử dụng cùng một API, nhưng chỉ là một nhà cung cấp khác phải không? Anyways, đọc [ở đây] (http://stackoverflow.com/questions/2435338/java-bouncy-castle-cryptography-encrypt-with-aes). – Perception

+1

Lưu ý rằng AES256 bị tắt mặc định trong tất cả các phiên bản Java từ Oracle. Bạn phải cài đặt các tệp chính sách quyền hạn tài nguyên không giới hạn Java JCE (Java Cryptography Extension) cho Java 5. BTW: Java 5 đã lỗi thời và không an toàn. Không sử dụng nó nữa. – Robert

+0

Tôi biết rằng Robert, cảm ơn. Nhận thức, tôi muốn sử dụng Lâu đài Boucny bởi vì nó dễ sử dụng hơn so với Java bản địa (chỉ từ JDK 6+) – fikouRaf

Trả lời

19

Bạn có thể sẽ sử dụng

Security.addProvider(new BouncyCastleProvider()); 
Cipher cipher = Cipher.getInstance("AES", "BC"); 

hoặc khác

Cipher cipher = Cipher.getInstance("AES", new BouncyCastleProvider()); 

Điều đó nói rằng, Cipher.getInstance("AES") sử dụng Electronic Codebook, đó là không an toàn. Bạn có thể muốn chế độ Chấm khối mã hóa (Cipher.getInstance("AES/CBC/PKCS5Padding")) hoặc Bộ đếm (Cipher.getInstance("AES/CTR/NoPadding")); cả hai đều an toàn, sự khác biệt chính là CBC yêu cầu đệm trong khi CTR thì không.

Các vấn đề liên quan