暗号ライブラリ
オープンソースとして利用可能な各種の言語に対応した暗号ライブラリを紹介します.
Java プラットフォームには,暗号化,公開鍵基盤(PKI),認証,安全な通信,アクセス制御など,主要なセキュリティ分野に渡る一連の API が定義されています.
SUN (ORACLE) の提供するJavaプラットフォームには,暗号機能を提供する以下に示す暗号プロバイダが含まれています.
- SUN
メッセージダイジェスト(MessageDigest),署名(Signature), 乱数ジェネレータ(SecureRandom)などを提供する.
- SunRsaSign
RSA署名機能を提供する.
- SunJSSE
SSLv3,TLSv1プロトコルやRSA署名を提供する.
- SunJCE
各種暗号(AES, DES, RSAなど),HMAC,鍵交換などを提供する.
BouncyCastleは,Java Cryptography Architecture (JCA/JCE)に基づいたJava暗号ライブラリです.
BouncyCastleのCrypto APIは次のものから構成されています.
- A lightweight cryptography API in Java.
- A provider for the JCE and JCA.
- A clean room implementation of the JCE 1.2.1.
- A library for reading and writing encoded ASN.1 objects.
- A lightweight client-side TLS API.
- Generators for Version 1 and Version 3 X.509 certificates and PKCS12 files.
- Generators for Version 2 X.509 attribute certificates.
- Generators/Processors for S/MIME and CMS (PKCS7/RFC 3852).
- Generators/Processors for OCSP (RFC 2560).
- Generators/Processors for TSP (RFC 3161 & RFC 5544).
- Generators/Processors for CMP and CRMF (RFC 4210 & RFC 4211).
- Generators/Processors for OpenPGP (RFC 2440).
- A signed jar version suitable for JDK 1.4/1.5 and the Sun JCE.
提供されている主なアルゴリズムは以下です.
- 共通鍵暗号
AES,Blowfish,CAST5,CAST6,DES,DESede,IDEA,RC2,RC5,RC6,Rijndael,Skipjack, Twofish,Serpent, Camellia
- 公開鍵暗号
DSA,ECDSA,RSA-PSS
- 鍵交換
DH,ECDH,ECDHC
- ハッシュ関数
MD2,MD4,MD5,SHA-1,SHA-224,SHA-256,SHA-384,SHA-512,RIPEMD-128,RIPEMD-160,RIPEMD-256,RIPEMD-320,Tiger
- メッセージ認証コード
HMAC
HP:
http://www.bouncycastle.org/
FlexiProviderは,Java Cryptography Architecture (JCA/JCE)に基づいたJava暗号ライブラリです. FlexiProviderプロジェクトの目標は,高速で安全な暗号アルゴリズムの実装を提供することとされています.
次のモジュールがあります.
- CoreProvider
共通鍵暗号,公開鍵暗号,ハッシュ関数,擬似乱数生成などの良く知られた暗号アルゴリズムを提供する.
- ECProvider
楕円曲線暗号に基づく暗号アルゴリズムを提供する. 次の標準に基づき実装されている.
- ANSI X9.62 - 1998: ECDSA
- IEEE 1363 - 2000 and IEEE P1363a: ECDSA, ECNR, ECDH, ECIES
- SEC1, SEC2: ECDSA, ECDH, ECIES
FlexiProviderはオープンソースであり,CoreProvider は LGPLライセンス,ECprovider および NFProvider は GPLライセンスです.
提供されている主なアルゴリズムは以下です.
- 共通鍵暗号
Camellia,DESede,IDEA,MARS,RC2,RC5,RC6,Rijndael,SAFERPlus, AFERPlusPlus,Serpent,Twofish
- 公開鍵暗号
RSA,DSA
- 楕円曲線暗号
ECDSA,ECNR,ECDH,ECIES
- ハッシュ関数
MD4,MD5,SHA-1,SHA-256,SHA-384,SHA-512,RIPEMD-128,RIPEMD-160
- メッセージ認証コード
HMAC
HP:
http://www.flexiprovider.de/
GNUプロジェクトが提供しているJava版の暗号ライブラリです.
2.0.1版では,以下の提供アルゴリズムが提供されています.
- 共通鍵暗号
AES,Anubis,Blowfish,DES,Khazad,Serpent,Square,Triple-DES,Twofish
- 公開鍵暗号
RSA-PSS,DSA
- 鍵交換
Diffie-Hellman (DH)
- ハッシュ関数
MD2,MD4,MD5,RIPEMD-128,RIPEMD-160,SHA-1,SHA-256,SHA-384,SHA-512,Tiger,Whirlpool
- メッセージ認証コード
HMAC,TMMH(Truncated Multi-Modular Hash),UHASH-32,UMAC-32
HP:
http://www.gnu.org/software/gnu-crypto/
OpenSSLは,Secure Sockets Layer(SSL v2/v3)と,世界標準の暗号プロトコルであるTransport Layer Security(TLS)を実装した強固で商用に耐えうる高機能なオープンソースのツールキットです. OpenSSLは,Eric A. YoungとTim J. Hudsonによって開発されたSSLeayというライブラリを基にしています.
OpenSSL ツールキットは,Apache 形式のライセンスが供与されています.いくつかの簡単なライセンスの制約下でなら入手と商用・非商用の利用は自由です.
OpenSSLには.コマンドラインツール(opelsslコマンド)があり,鍵や証明書の生成など幅広い暗号機能を実行できます.(→ OpenSSL コマンド操作)
使える機能には,以下のものがあります.
- RSA,DH,DSA 鍵パラメータの作成
- X.509 証明書,CSRs,CRLs の作成
- Message Digests の計算
- Ciphers の暗号化と解読
- SSL/TLS クライアントとサーバのテスト
OpenSSL の高レベルの暗号化インタフェースである主な EVP 関数の仕様を OpenSSL EVP 関数,および OpenSSL EVP_PKEY 関数 にまとめてあります.
HP:
https://www.openssl.org/
Crypto++ Library は,フリーの各種暗号機能を実装したC++クラスライブラリです. 高度に抽象化されたAPIを提供しており,暗号アルゴリズムの詳細はクラス内部に隠蔽されています. 最新版は、2017.2現在Crypto++ Library 5.6.5です. 動作環境は,Windows,UNIX,Macですが,すべての環境と版数の組合せでテストされているわけではありません. 開発は主としてWindowsで行われているようです. 実装されている暗号アルゴリズムは,現時点で広く知られているアルゴリズムをほぼ網羅しています.
提供されている主なアルゴリズムを以下に示します.
- ブロック暗号
AES (Rijndael),RC6,MARS,Twofish,Serpent,CAST-256 Triple-DES (DES-EDE2,DES-EDE3),DESX (DES-XEX3),RC2,RC5, Blowfish, Diamond2,TEA,SAFER,3-WAY, GOST,SHARK,CAST-128,Square,Skipjack,Camellia,SHACAL-2
- ストリーム暗号
Panama,ARC4,SEAL,WAKE,WAKE-OFB,BlumBlumShub
- 公開鍵暗号
RSA,DSA,ElGamal,Nyberg-Rueppel (NR), Rabin, Rabin-Williams (RW), LUC,LUCELG, DLIES (variants of DHAES), ESIGN
- 楕円曲線暗号
ECDSA,ECNR,ECIES,ECDH,ECMQV
- 鍵交換
Diffie-Hellman (DH),Unified Diffie-Hellman (DH2), Menezes-Qu-Vanstone (MQV), LUCDIF,XTR-DH
- ハッシュ関数
SHA-1,MD2,MD4,MD5,HAVAL,RIPEMD-128,RIPEMD-256,RIPEMD-160, RIPEMD-320,Tiger, SHA-2 (SHA-256,SHA-384,SHA-512),Panama,Whirlpool
- メッセージ認証コード
MD5-MAC,HMAC,XOR-MAC,CBC-MAC,DMAC,Two-Track-MAC
HP:
http://www.cryptopp.com/
Mozilla.org のプロジェクトで,セキュリティ機能が必要なサーバアプリケーションの開発に利用できるライブラリ群です.
NSSでサポートしているセキュリティ標準には次のものがあります.
- SSL v2/v3
クイアントとサーバとの間での相互認証や,認証され暗号化された接続の確立
- TLS v1(RFC 2246)
IETFが標準化した Transport Layer Security(TLS)プロトコル
- PKCS #1
RSA アルゴリズムを基礎とした公開鍵暗号を規定する RSA 標準
- PKCS #3
Diffie-Hellman 鍵交換(key agreement)を規定する RSA 標準
- PKCS #5
パスワードベースの暗号化を規定する RSA 標準
- PKCS #7
データの暗号化のアプリケーション(ディジタル署名等)を規定する RSA標準
- PKCS #8
秘密鍵の保存や暗号化を規定する RSA 標準
- PKCS #9
PKCS #7,PKCS #8,PKCS #10で使用される属性タイプを含め,選択された属性タイプを規定する RSA 標準
- PKCS #10
証明書要求のためのシンタックスを規定する RSA 標準
- PKCS #11
暗号化トークンを使った通信(ハードウェアアクセラレータやスマートカードなど)を統括し,アプリケーションを特定のアルゴリズムや実装から独立させる RSA 標準
- PKCS #12
秘密鍵や証明書,その他の機密データを保存または移送する際に使用される形式を規定する RSA 標準
- S/MIME(RFC 2311,RFC 2633)
普及しているインターネット MIME 標準に基づいた IETF メッセージの仕様で,署名や暗号化された MIME データを送受信するための手段を提供する.
- X.509 v3
公開鍵暗号で使用される証明書の形式を統括する ITU 標準.
- OCSP(RFC 2560)
オンライン証明書ステータスプロトコル(The Online Certificate Status Protocol:OCSP)であり,証明書の妥当性をリアルタイムで検証する.
- PKIX Certificate ,CRL Profile(RFC 2459)
インターネットのための IETF 公開鍵基盤(X.509)ワーキンググループPKIX)によって開発されている四部からなる標準の第一部.
- 暗号化アルゴリズム
AES,RSA,DSA,Triple DES,DES,Diffie-Hellman,RC2,RC4,SHA-1,MD2,MD5
Network Security Services for Java (JSS)として,NSSに対するJavaインタフェースがあります.ASN.1 と BER/DERエンコーディングに対するJavaインタフェースもサポートします.
HP:
https://nss-crypto.org/
Node.js は JavaScript の実行環境 (プラットフォーム) を提供しています.Node.js により JavaScript を Webブラウザ上ではなく,サーバサイド(ローカル)で動作させることができます.
HP:http://nodejs.org/
Node.js のモジュールに暗号機能を持つ Crypto があります. Crypto は,OpenSSL のハッシュ関数,HMAC,暗号化・復号,署名生成・検証へのラッパーを提供しており,JavaScript から OpenSSLの暗号機能を利用できるようになります.
CryptoJS は,JavaScript で実装された暗号機能を実現するモジュールです.
ハッシュy関数(MD5, SHA1, SHA2, etc.),HMAC,暗号(AES, DES,TripleDES, RC4 etc.) 機能が実装されています.
HP:https://code.google.com/archive/p/crypto-js/
CryptoJS を Node.js 下で使うには,Node.js に含まれるモジュール管理ツール npm を使って crypto-js をインストールします.
npm install crypto-js
CryptoJS をブラウザ環境で使うには,npm を使って最初にフロントエンド用のパッケージ管理ツールである bower をインストールします.
npm install bower -g
さらに, bower を初期化した後 crypto-js をインストールします.
bower init
bower install crypto-js