2010-01-12 33 views
11

Có ai cho tôi thấy (hoặc cung cấp liên kết đến) một ví dụ về cách mã hóa tệp trong Java bằng cách sử dụng lâu đài bouncy không? Tôi đã xem qua bouncycastle.org nhưng không thể tìm thấy bất kỳ tài liệu nào về API của họ. Thậm chí chỉ cần biết lớp nào sẽ sử dụng sẽ là một trợ giúp lớn cho tôi để bắt đầu!Ví dụ về mã hóa một tệp xml trong Java bằng cách sử dụng lâu đài bouncy

+0

Đi với các liên kết của cb160, và cũng chắc chắn để có được mã nguồn cho bouncycastle. Tài liệu API hầu hết là người nghèo và thường rất nghèo. Tuy nhiên, mã nguồn khá dễ đọc và tôi thường sử dụng nó để trả lời các câu hỏi như "RijndaelEngine cần loại CipherParameters nào?". Chỉ cần nhìn vào phương pháp Rijndael có liên quan và nó sẽ hiển nhiên. –

Trả lời

19

Bạn muốn thực hiện loại mã hóa nào? Dựa trên mật khẩu (PBE), đối xứng, không đối xứng? Tất cả trong cách bạn cấu hình Cipher.

Bạn không cần phải sử dụng bất kỳ API cụ thể nào của BouncyCastle, chỉ các thuật toán mà nó cung cấp. Dưới đây là một ví dụ sử dụng các thuật toán mã hóa BouncyCastle PBE để mã hóa một String:

import java.security.SecureRandom; 
import java.security.Security; 

import javax.crypto.Cipher; 
import javax.crypto.SecretKey; 
import javax.crypto.SecretKeyFactory; 
import javax.crypto.spec.IvParameterSpec; 
import javax.crypto.spec.PBEKeySpec; 

import org.bouncycastle.jce.provider.BouncyCastleProvider; 

public class PBE { 

    private static final String salt = "A long, but constant phrase that will be used each time as the salt."; 
    private static final int iterations = 2000; 
    private static final int keyLength = 256; 
    private static final SecureRandom random = new SecureRandom(); 

    public static void main(String [] args) throws Exception { 
     Security.insertProviderAt(new BouncyCastleProvider(), 1); 

     String passphrase = "The quick brown fox jumped over the lazy brown dog"; 
     String plaintext = "hello world"; 
     byte [] ciphertext = encrypt(passphrase, plaintext); 
     String recoveredPlaintext = decrypt(passphrase, ciphertext); 

     System.out.println(recoveredPlaintext); 
    } 

    private static byte [] encrypt(String passphrase, String plaintext) throws Exception { 
     SecretKey key = generateKey(passphrase); 

     Cipher cipher = Cipher.getInstance("AES/CTR/NOPADDING"); 
     cipher.init(Cipher.ENCRYPT_MODE, key, generateIV(cipher), random); 
     return cipher.doFinal(plaintext.getBytes()); 
    } 

    private static String decrypt(String passphrase, byte [] ciphertext) throws Exception { 
     SecretKey key = generateKey(passphrase); 

     Cipher cipher = Cipher.getInstance("AES/CTR/NOPADDING"); 
     cipher.init(Cipher.DECRYPT_MODE, key, generateIV(cipher), random); 
     return new String(cipher.doFinal(ciphertext)); 
    } 

    private static SecretKey generateKey(String passphrase) throws Exception { 
     PBEKeySpec keySpec = new PBEKeySpec(passphrase.toCharArray(), salt.getBytes(), iterations, keyLength); 
     SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWITHSHA256AND256BITAES-CBC-BC"); 
     return keyFactory.generateSecret(keySpec); 
    } 

    private static IvParameterSpec generateIV(Cipher cipher) throws Exception { 
     byte [] ivBytes = new byte[cipher.getBlockSize()]; 
     random.nextBytes(ivBytes); 
     return new IvParameterSpec(ivBytes); 
    } 

} 
+2

Muối không được cố định .. –

+1

Nếu bạn đang nhận được java.security.InvalidKeyException: Kích thước khóa bất hợp pháp ref: http://stackoverflow.com/a/6481658/234110 –

-1

Trong khi đó là một câu trả lời gián tiếp cho câu hỏi của bạn, có lẽ bạn sẽ tìm thấy nó hữu ích để sử dụng jasypt để xử lý mã hóa.

đây là một ví dụ về cách để mã hóa một tập tin sử dụng jasypt: http://www.jasypt.org/encrypting-configuration.html

Và, đây là cách để cấu hình lâu đài bouncy là nhà cung cấp cho jasypt: http://www.jasypt.org/bouncy-castle.html

+1

Thư viện bên thứ ba thứ hai để trừu tượng lần đầu tiên có thể thư viện của bên thứ ba không được yêu cầu? Nghe có vẻ là ý kiến ​​hay đấy. – jarnbjo

+0

Chúng tôi đang sử dụng jasypt và BouncyCastle. Jasypt xử lý mã hóa trong suốt và giải mã các cột cơ sở dữ liệu với Hibernate và BouncyCastle thực hiện mã hóa và giải mã thực tế. – Omniwombat

1

Nếu bạn không có bất kỳ lý do cụ thể để sử dụng BountyCastle, bạn có thể tìm thấy một hướng dẫn tốt và thông tin cơ bản về hỗ trợ mã hóa được tích hợp sẵn Java với một số ví dụ mã số here.

+0

Điều đáng nói là BouncyCastle chỉ là một "nhà cung cấp" hoạt động trong khuôn khổ mật mã tích hợp (JCE). Nó thường được sử dụng bởi vì nó chứa một bộ nguyên thủy hoàn chỉnh hơn nhà cung cấp mặc định. – caf

+0

BouncyCastle không phải là "chỉ là nhà cung cấp". Bạn cũng có thể sử dụng chức năng mã hóa của BouncyCastle thông qua API độc quyền của họ. Bạn nói đúng rằng BouncyCastle cung cấp các thuật toán mã hóa bổ sung, nhưng tôi hiếm khi thấy bất kỳ nhu cầu thực sự nào về những thuật toán này. Tuy nhiên, thường xuyên hơn, BouncyCastle được sử dụng cho chức năng đã được cung cấp bởi các nhà cung cấp bảo mật nhúng API và VM chuẩn. – jarnbjo

1

Nơi tốt nhất để tìm Bouncy Castle ví dụ mã java là phải đi qua các trường hợp thử nghiệm trong các bộ kiểm tra của lâu đài bouncy Bouncy Castle latest release java

Những dãy phòng thử nghiệm chứa không bị phản đối mã này có thể được sử dụng dễ dàng

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