Bouncy Castle を使ってみる

暗号化 API ( Crypto API ) の Bouncy Castle を使ってみたのでメモしておきます。JavaC#インターフェイスがあるみたいですが、今回は Java の方を試します。

・bouncycastle.org
https://www.bouncycastle.org/index.html

・The Legion of the Bouncy Castle Java Cryptography APIs
https://www.bouncycastle.org/java.html


1. ダウンロード


以下がダウンロードページです。今回は現時点最新と思われる 1.52 を使うことにしました。
なんだか色々 .jar ファイルありますが、ひとまず Provider だけでいいだろうということで bcprov-jdk15on-152.jar のみで。

・bouncycastle.org
https://www.bouncycastle.org/latest_releases.html

Maven 使いたい場合は、以下あたりで。

Maven Repository: org.bouncycastle
http://mvnrepository.com/artifact/org.bouncycastle


2. プロバイダのインストール


以下の Wiki に情報がありました。コードからやる方法java.security に追記する方法の 2 種類あるみたいです。今回は簡単なコードでやる方法を採用しました。

・Provider Installation - Java APIs 1.X - The Legion of the Bouncy Castle
https://www.bouncycastle.org/wiki/display/JA1/Provider+Installation

import org.bouncycastle.jce.provider.BouncyCastleProvider;
...
Security.addProvider(new BouncyCastleProvider());


一応、ちゃんとインストールされているか確認するサンプルコードを実行しておく。

import java.security.Provider;
import java.security.Security;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class Test {
    public static void main(String[] args) {
        getProviderList();
    }

    private static void getProviderList() {
        Security.addProvider(new BouncyCastleProvider());
        Provider[] providers = Security.getProviders();
        for (int i = 0; i != providers.length; i++) {
            System.out.println("Name: " + providers[i].getName());
        }
    }
}


「Name: BC」が Bouncy Castle のプロバイダっぽいです。ちゃんとインストールできてますね。

Name: SUN
Name: SunRsaSign
Name: SunEC
Name: SunJSSE
Name: SunJCE
 - 略 -
Name: BC



せっかくなのでメッセージダイジェストを計算するサンプル。

import java.security.MessageDigest;
import java.security.Provider;
import java.security.Security;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class Test {
    public static void main(String[] args) throws Exception {
        init();
        hashTest();
    }

    private static void init() {
        Security.addProvider(new BouncyCastleProvider());
    }
    
    private static void hashTest() throws Exception {
        MessageDigest md = MessageDigest.getInstance("SHA1", "BC");
        String input = "ABCDE";
        byte[] output = md.digest(input.getBytes());
        for(byte b : output) {
            System.out.print(String.format("%02x", b));
        }
    }
}


SHA1Digest なる Bouncy Castle が用意している API もあるようです。

import java.security.Security;

import org.bouncycastle.crypto.digests.SHA1Digest;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

public class Test {
    public static void main(String[] args) throws Exception {
        init();
        hashTest2();
    }

    private static void init() {
        Security.addProvider(new BouncyCastleProvider());
    }

    private static void hashTest2() {
        SHA1Digest sd = new SHA1Digest();
        String input = "ABCDE";
        byte[] output = new byte[sd.getDigestSize()];
        sd.update(input.getBytes(), 0, input.getBytes().length);
        sd.doFinal(output, 0);
        for (byte b : output) {
            System.out.print(String.format("%02x", b));
        }
    }
}


ドキュメントの類いは以下にあります。

・bouncycastle.org
https://www.bouncycastle.org/specifications.html#install

・Overview (Bouncy Castle Library 1.52 API Specification)
https://www.bouncycastle.org/docs/docs1.5on/overview-summary.html

ちゃんと見れてはないけど、以下の Web ページ「example」からダウンロードできるサンプルも参考になるかも。

・bouncycastle.org
https://www.bouncycastle.org/documentation.html


以上です。

[ 環境情報 ]
Windows 7 SP1
Java SE 8 Upate 25
Bouncy Castle 1.52