2010-01-12 32 views
11

任何人都可以向我展示(或提供鏈接)如何使用彈性城堡加密Java文件的示例?我瀏覽過bouncycastle.org,但找不到他們的API的任何文檔。即使只知道要使用哪些課程,對我而言也是一大幫助!使用彈性城堡在Java中加密xml文件的示例

+0

去與cb160的鏈接,並且一定要得到bouncycastle的源代碼。 API文檔大多很差,通常很差。但是,源代碼非常易讀,我經常用它來回答諸如「RijndaelEngine需要什麼樣的CipherParameters?」等問題。只要看看相關的Rijndael方法就會很明顯。 – 2010-01-12 23:22:08

回答

19

你想要執行什麼類型的加密?基於密碼(PBE),對稱,不對稱?它的全部內容如何配置Cipher

您不應該使用任何BouncyCastle特定的API,只需使用它提供的算法。下面是使用BouncyCastle的PBE密碼來加密的字符串,例如:

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

鹽不應該是恆定的.. – 2015-01-29 13:39:47

+1

如果你正在得到 java.security.InvalidKeyException:非法密鑰大小 ref:http://stackoverflow.com/a/6481658/234110 – 2015-06-25 06:01:03

-1

雖然這是一個間接的回答你的問題,也許你會發現它很有用jasypt來處理加密。

這裏有一個如何使用jasypt加密文件的例子: http://www.jasypt.org/encrypting-configuration.html

而且,這裏是如何充氣城堡配置爲jasypt供應商: http://www.jasypt.org/bouncy-castle.html

+1

第二個第三方庫抽象第一個可能不需要的第三方庫?聽起來像一個非常好的主意。 – jarnbjo 2010-01-12 20:55:29

+0

我們使用jasypt和BouncyCastle。 Jasypt使用Hibernate處理數據庫列的透明加密和解密,而BouncyCastle執行實際的加密和解密。 – Omniwombat 2010-01-12 21:46:48

1

如果你不這樣做有任何使用BountyCastle的特殊原因,您可以通過幾個代碼示例here找到有關Java內置加密支持的良好教程和背景信息。

+0

值得指出的是,BouncyCastle只是一個在內置加密框架(JCE)中工作的「提供者」。它經常被使用,因爲它包含比默認提供程序更完整的原語套件。 – caf 2010-01-13 04:02:32

+0

BouncyCastle不是「只是提供者」。您還可以通過其專有的API使用BouncyCastle的加密功能。你說得對,BouncyCastle提供了額外的加密算法,但我很少看到任何真正的需要。然而,經常使用BouncyCastle的功能已經由標準API和VM嵌入式安全提供商提供。 – jarnbjo 2010-01-13 12:14:31

1

找到充氣城堡Java代碼示例最好的地方是要經過測試用例的測試套件充氣城堡的 Bouncy Castle latest release java

這些測試套件包含非過時代碼,可以很容易地使用

相關問題