2013-04-10 14 views
5

Oto moja implementacja AES 256 szyfrowania i deszyfrowania, opracowany z rodzimej biblioteki JDK 5:AES szyfrowania/deszyfrowania z dostawcy 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); 
} 

Chcę zaimplementować te same metody z zamkiem Boucy API (Java): Dużo szukałem, dużo testowałem, bez rezultatów ... Czy ktoś może mi pomóc?

Dzięki

+1

Zdajesz sobie sprawę, że będziesz używać tego samego API, ale tylko inny dostawca prawa? W każdym razie przeczytaj [tutaj] (http://stackoverflow.com/questions/2435338/java-bouncy-castle-cryptography-encrypt-with-aes). – Perception

+1

Należy pamiętać, że AES256 jest domyślnie wyłączony we wszystkich wersjach Java z Oracle. Musisz zainstalować pliki zasad jurysdykcji Java Cryptography Extension (JCE) Unlimited Strength dla Java 5. BTW: Java 5 jest przestarzała i niezabezpieczona. Nie używaj go już. – Robert

+0

Wiem, że Robert, dzięki. Percepcja, chcę korzystać z Zamku Boucny, ponieważ jest bardziej przenośny niż natywna biblioteka Java (tylko z JDK 6+) – fikouRaf

Odpowiedz

19

Można by użyć

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

albo

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

Powiedział, Cipher.getInstance("AES") wykorzystuje Electronic Codebook, która jest niepewna. Chcesz trybów szyfrowania bloków (Cipher.getInstance("AES/CBC/PKCS5Padding")) lub Counter (Cipher.getInstance("AES/CTR/NoPadding")); oba są bezpieczne, podstawową różnicą jest to, że CBC wymaga wypełnienia, podczas gdy CTR tego nie robi.