暗号化・複合化を行う ブロック暗号
Javaでブロック暗号を行うにはCipherクラスを使用します。
AESやDES、Blowfishなどが使用可能です。
AndroidではBlowfishが正しく使用できません。(2.2で確認)
[参考記事] ブロック暗号とは
[参考記事] PHPで暗号化・複合化を行う ブロック暗号
[参考記事] Perlで暗号化・複合化を行う ブロック暗号
[参考記事] Rubyで暗号化・複合化を行う ブロック暗号
サンプルコード
使用できる暗号アルゴリズムの一覧
使用できる暗号利用モードの一覧
指定できるパディング方式の一覧
鍵生成(KeyGenerator)で指定できる暗号化アルゴリズムの一覧
この暗号化方式はアルゴリズム規定のブロック長に分割して秘密鍵を用いて暗号化を行います。
規定のブロック長に分割する方式を暗号利用モード、ブロック長に満たないときの補完方法をパディング方式といいます。
暗号利用モードで分割するときに前の平文ブロックの結果を次の平文に使用しますが、この最初のブロックで使用される値がIV(初期化ベクトル)です。
まとめ
暗号化の流れ
(1) ブロック長に満たない部分をパディング方式で補完する。
(2) アルゴリズムに対応したブロック長に分割する。
このときの分割ルールを決めるのが暗号利用モード
分割モードによっては初期値が必要で、これがIV(初期化ベクトル)
(3) 暗号鍵を用いてアルゴリズムで暗号化する。
(4) 分割されたデータを結合する。
復号化の流れ
(1) アルゴリズムに対応したブロック長に分割する。
(2) 暗号鍵を用いてアルゴリズムで復号化する。
(3) 暗号利用モードを元に分割されたデータを結合する。
分割モードによっては初期値が必要で、これがIV(初期化ベクトル)
(4) 補完されたパディングをパディング方式で除去する。
ブロック暗号では、
ブロック長
秘密鍵
暗号アルゴリズム
暗号利用モード
パディング方式
IV(初期化ベクトル)
の6つのキーワードが重要です。
ブロック長、共通鍵の長さは使用する暗号アルゴリズムに依存します。
アルゴリズム、暗号利用モード、パディング方式は次のように指定します。
Cipher.getInstance("AES/CBC/PKCS5Padding");
アルゴリズムのみでの指定も可能です。
Cipher.getInstance("AES");
サンプルコード
import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.security.InvalidAlgorithmParameterException; import java.security.SecureRandom; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import javax.crypto.KeyGenerator; // 暗号化 // buf 暗号化するデータ // key 暗号化鍵 // iv IV(初期化ベクトル) public static byte[] cipherEncrypt(byte[] buf, String key, String iv){ try { // 秘密鍵を構築します SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), "AES"); // IV(初期化ベクトル)を構築します IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes()); // 暗号化を行うアルゴリズム、モード、パディング方式を指定します Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // 初期化します cipher.init(Cipher.ENCRYPT_MODE, sksSpec, ivSpec); // 暗号化します return cipher.doFinal(buf); } catch (NoSuchAlgorithmException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (InvalidKeyException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (BadPaddingException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } return null; } // 複合化 // buf 暗号化されたデータ // key 暗号化鍵 // iv IV(初期化ベクトル) public static byte[] cipherDecrypt(byte[] buf, String key, String iv){ try { // 秘密鍵を構築します SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), "AES"); // IV(初期化ベクトル)を構築します IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes()); // 暗号化を行うアルゴリズム、モード、パディング方式を指定します Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); // 初期化します cipher.init(Cipher.DECRYPT_MODE, sksSpec, ivSpec); // 複合化します return cipher.doFinal(buf); } catch (NoSuchAlgorithmException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (NoSuchPaddingException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (InvalidKeyException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (IllegalBlockSizeException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (BadPaddingException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } catch (InvalidAlgorithmParameterException e) { // TODO 自動生成された catch ブロック e.printStackTrace(); } return null; } // 暗号化アルゴリズムに応じた鍵を生成する private static Key genKey() throws NoSuchAlgorithmException { KeyGenerator generator = KeyGenerator.getInstance("AES"); // 乱数の発生源を作成します 指定できるのはSHA1PRNGのみ SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); // 第一引数にキー長のbit数を指定します generator.init(128, random); return key = generator.generateKey(); }
使用できる暗号アルゴリズムの一覧
AES
ARCFOUR/RC4
Blowfish
DES
DESede
PBEWith<digest>And<encryption>
PBEWith<prf>And<encryption>
PBEWithMD5AndDES
PBEWithHmacSHA1AndDESede
RC2
RC4
RC5
RSA
使用できる暗号利用モードの一覧
NONE | モードなし |
---|---|
CBC | Cipher Block Chaining Mode |
CFB | Cipher Feedback Mode |
ECB | Electronic Codebook Mode |
OFB | Output Feedback Mode |
PCBC | Propagating Cipher Block Chaining |
指定できるパディング方式の一覧
ISO10126Padding
NoPadding
OAEPWith<digest>And<mgf>Padding
PKCS5Padding
SSL3Padding
鍵生成(KeyGenerator)で指定できる暗号化アルゴリズムの一覧
AES
ARCFOUR/RC4
Blowfish
DES
DESede
HmacMD5
HmacSHA1
HmacSHA256
HmacSHA384
HmacSHA512
RC2
関連記事
- 文字列の置き換えを行う方法 (replaceAllで気をつけること)
- 文字列の部分一致検索を行う方法
- Java メモリー使用量を取得する方法
- 実行中のメソッド名やクラス名を取得する方法
- Singletonパターンを使ってクラスのインスタンスを1つにする(共有クラスのリソースを削減する方法)
- ファイルのテキストデータを読み込む
- テキストデータをファイルに書き込む BufferedWriterの使用例
- Webからダウンロードして保存する DefaultHttpClientの使用例
- ファイルをコピーする InputStream,OutputStreamの使用例
- base64変換の一覧とその詳細サンプルコード
- 型変換の一覧(キャスト)
- 処理を一定時間停止させる方法
- ファイルの拡張子を取得する
- サンプルコード
- AndroidアプリでTextViewに使用できるフォントの一覧
- 動画を再生する方法 VideoView
- アプリ起動時にスプラッシュ画面を表示させる方法
- LinearLayout をスクロールさせる方法(ScrollViewの使用方法)
- SDカードからサムネイル画像を取り出す getThumbnailメソッド
- SDカードの空き容量を調べる方法
- 画像を拡大縮小する方法
- EditTextのソフトキーボードの『完了』を虫メガネアイコンなどに変更する方法
- SDカードが接続されているかどうか知る方法 書き込み可能かどうか 読み込み可能かどうか
- SDやdata、downloadなど各種ディレクトリパスの取得方法
- Androidでマルチスレッド処理をする方法
- 動画を再生する方法 MediaPlayer
- 実機内やエミュレータ内のファイルを操作する DDMS、adbとサンプルコード
- WebViewを使ってWebサイトを表示する方法 WebKitからアプリ、アプリからWebKitへの連携処理
- Viewの表示・非表示を切り替える方法
- 処理中を表すプログレスダイアログを表示する
- SDカードに保存したファイルをギャラリーなどに反映させる方法
スポンサーリンク