如何配置並使用 Bouncy Castle 密碼包
原文出處:http://gitbook.cn/gitchat/activity/5a41ed6d358c1646ff6bc855
Bouncycstle 是一款開源的密碼包,其包含了大量的密碼演算法,其支援橢圓曲線密碼演算法,本文主要說明 Bouncy Castle 如何配置和簡單使用。
1、Bouncy Castle 簡介
2、Bouncy Castle 兩種配置方式
3、Java 進口管制限制解除
Bouncy Castle 是一款輕量級的密碼包,包含的許多常用的密碼演算法,對 Java 安全體系能夠起到很好的補充,同時其支援橢圓曲線密碼體系。
Bouncy Castle 配置方式有兩種:一種是動態安裝的方式,一種是靜態配置的方式。無論是哪種配置方式,都需要先把 Bouncy Castle 包下載下來(當然也可以使用 Maven 等方式配置使用)。
最新 Bouncy Castle 下載地址請單擊這裡,需要下載兩個檔案 bcprov-jdk15on-158.jar 和 bcprov-ext-jdk15on-158.jar。
(一)動態安裝的方式
這種方式是在工程中直接使用 Bouncy Castle,對環境的依賴較小。
- 將 bcprov-jdk15on-158.jar 匯入工程
- 在使用之前動態加入BouncyCastle Provider
example 1:
public class hello { //動態使用provider static { Security.addProvider(new BouncyCastleProvider()); } public static void main(String args[]) { System.out.println("請輸入待加密資料:"); Scanner scan = new Scanner(System.in); while (scan.hasNext()) { try { String date = scan.nextLine(); KeyGenerator kg =KeyGenerator.getInstance("AES"); kg.init(256); SecretKey secretKey = kg.generateKey(); Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding", "BC"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] enResult = cipher.doFinal(date.getBytes()); System.out.println("加密資料:"); String strEnResult = Base64.toBase64String(enResult); System.out.println(strEnResult); } catch (NoSuchAlgorithmException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchProviderException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InvalidKeyException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (BadPaddingException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
(二)靜態配置的方式
靜態配置方式是本地 Java 環境中新增 Bouncy Castle 支援,需要使用到的 jar 包是 bcprov-ext-jdk15on-158.jar。
- 把 bcprov-ext-jdk15on-158.jar 新增到 java sdk 和 java jre 中。
- sdk位置→C:\Program Files\Java\jdk1.8.0_144\jre\lib\ext
- jre位置→C:\Program Files\Java\jre1.8.0_144\lib\ext
-
修改security配置檔案java.security,為了更好的體驗,最好將sdk和jre中security檔案都進行修改。實際僅僅修改sdk中security檔案即可。
-
sdk中security檔案:
C:\ProgramFiles\Java\jdk1.8.0_144\jre\lib\security\java.security
- jre中security檔案:
C:\ProgramFiles\Java\jre1.8.0_144\lib\security\java.security
在 security 檔案中找到以下部分:
security.provider.1=sun.security.provider.Sun
security.provider.2=sun.security.rsa.SunRsaSign
security.provider.3=sun.security.ec.SunEC
security.provider.4=com.sun.net.ssl.internal.ssl.Provider
security.provider.5=com.sun.crypto.provider.SunJCE
security.provider.6=sun.security.jgss.SunProvider
security.provider.7=com.sun.security.sasl.Provider
security.provider.8=org.jcp.xml.dsig.internal.dom.XMLDSigRI
security.provider.9=sun.security.smartcardio.SunPCSC
security.provider.10=sun.security.mscapi.SunMSCAPI
在後面新增
security.provider.11=org.bouncycastle.jce.provider.BouncyCastleProvider
注意其中的序號根據自己security檔案而定。 檢測安裝是否成功,可以使用下面的簡單程式進行:
public static void main(String[] args) {
Provider provider = Security.getProvider("BC");
System.out.println(provider);
}
若顯示為null表示安裝失敗,若顯示為BC表示安裝成功。
(三)Java 進口管制限制解除
由於國外的進出口限制,對Java密碼演算法體系進行了一些限制,為了解除限制,需要覆蓋策略檔案。
(1)下載策略檔案
- jdk6→http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html
- jdk7→http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html
- jdk8→http://www.oracle.com/technetwork/java/javase/downloads/jce8-download-2133166.html
下載的策略檔案中需要兩個檔案:local_policy.jar
和US_export_policy.jar
(2)覆蓋 sdk 和 jre 中的這兩個策略檔案
- sdk 中策略檔案位置→C:\Program Files\Java\jdk1.8.0_144\jre\lib\security
- jre 中策略檔案位置→C:\Program Files\Java\jre1.8.0_144\lib\security
(四)測試
策略檔案是否生效,可以使用下面的程式檢驗:
AES 演算法沒有解除限制之前,AES 演算法只支援128位。
public static void main(String[] args) {
try {
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(256);
SecretKey secretKey=kg.generateKey();
System.out.println(secretKey.getFormat());
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
若出現 java.security.InvalidKeyException: Illegal key 錯誤,表示限制沒有解除。