2013-04-10 15 views
5

Qui è la mia implementazione di un AES 256 cifrare e decifrare, sviluppata con la libreria nativa di JDK 5:AES cifrare/decifrare con il fornitore 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); 
} 

Voglio realizzare gli stessi metodi con il Castello boucy API (Java): ho cercato molto, testato molto, senza risultati ... qualcuno può aiutarmi?

Grazie

+1

Ti rendi conto che utilizzerai la stessa API, ma solo un fornitore diverso? Ad ogni modo, leggi [qui] (http://stackoverflow.com/questions/2435338/java-bouncy-castle-cryptography-encrypt-with-aes). – Perception

+1

Nota che AES256 è disabilitato per impostazione predefinita in tutte le versioni Java di Oracle. È necessario installare i file di criteri di giurisdizione illimitata di Java Cryptography Extension (JCE) per Java 5. BTW: Java 5 non è aggiornato e non è sicuro. Non usarlo più. – Robert

+0

Lo so Robert, grazie. Percezione, voglio usare Boucny Castle perché è più portatile della lib nativa di Java (solo da JDK 6+) – fikouRaf

risposta

19

Si potrebbe usare sia

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

oppure

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

Detto questo, Cipher.getInstance("AES") utilizza Electronic Codebook, che è insicuro. O vuoi le modalità Cipher Block Chaining (Cipher.getInstance("AES/CBC/PKCS5Padding")) o Counter (Cipher.getInstance("AES/CTR/NoPadding")); sono entrambi sicuri, la differenza principale è che CBC richiede il riempimento mentre CTR no.