暗号化・複合化を行う ブロック暗号

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モードなし
CBCCipher Block Chaining Mode
CFBCipher Feedback Mode
ECBElectronic Codebook Mode
OFBOutput Feedback Mode
PCBCPropagating 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

関連記事

スポンサーリンク

LOG関数 自然対数

ホームページ製作・web系アプリ系の製作案件募集中です。

上に戻る