Bouncy Castle を使ってみる
暗号化 API ( Crypto API ) の Bouncy Castle を使ってみたのでメモしておきます。Java と C# のインターフェイスがあるみたいですが、今回は 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