com.nttdocomo.security
クラス SymmetricCipher

Object
  拡張com.nttdocomo.security.SymmetricCipher

public final class SymmetricCipher
extends Object
 [iアプリオプションAPI]

共通鍵暗号で暗号化/復号化する機能を定義します。

暗号化アルゴリズムはDES、トリプル DES、 AES をサポートします。 暗号化アルゴリズムの暗号モードは CBC(Cipher Block Chaining) をサポートします。 終端の暗号化ブロックをパディングする方式は、 PKCS#7 で規定された方式をサポートします。 PKCS#7 の規定については、 RFC 2315 を参照してください。

CipherPBECipherSessionKeyRandomNumberGeneratorを使用する暗号化・復号化のサンプルコードを以下に記します。 サンプルコードでは、プログラム説明のため、 セッション鍵を暗号化する暗号化アルゴリズムと平文を暗号化する暗号化アルゴリズムを分けていますが、 それぞれの処理で用いる暗号化アルゴリズムが同じでもかまいません。

暗号化サンプルコード
 //
 // PBEを用いてセッション鍵を暗号化
 //

 // パスワードは任意の ASCII 文字
 byte[] password = "01234".getBytes();
 // 繰り返し回数は、1000以上
 int iterationCount = 1000;
 // ソルトは 64 ビット以上
 byte[] salt = RandomNumberGenerator.getRandomNumber(8);
 //AES のブロックサイズは 128 ビット
 byte[] ivForSessionKey = RandomNumberGenerator.getRandomNumber(16);

 // AESを用いてセッション鍵を暗号化するためのオブジェクト
 CipherPBE encryptionPBE = new CipherPBE(password,
                                    salt,
                                    iterationCount,
                                    CipherPBE.HASH_SHA1,
                                    SymmetricCipher.AES_128_CBC_PKCS7PADDING,
                                    ivForSessionKey);

 // DESで使用するセッション鍵を作成し、CipherSessionKey オブジェクトを生成
 CipherSessionKey sessionKey = 
    encryptionPBE.createCipherSessionKey(SymmetricCipher.DES_CBC_PKCS7PADDING);

 // 暗号化されたセッション鍵を取得
 byte[] encryptedSessionKey = sessionKey.getEncryptedSessionKey();

 //DES のブロックサイズは 64 ビット
 byte[] iv = RandomNumberGenerator.getRandomNumber(8);

 // DESを用いて平文を暗号化するためのオブジェクト
 
 SymmetricCipher sc = sessionKey.createSymmetricCipher(SymmetricCipher.DES_CBC_PKCS7PADDING,
                                      iv,
                                      true);
 

 byte[] plainText = "Sample plain text".getBytes();

 // 暗号化
 byte[] encryptedData1 = sc.execute(plainText);
 // 終端ブロックのパディング処理
 
 byte[] encryptedData2 = null;
 try {
     encryptedData2 = sc.executeFinal(null);
 } catch(CipherException ce) {
 }
 
 // 暗号文の結合
 ByteArrayOutputStream workStream = new ByteArrayOutputStream();
 workStream.write(encryptedData1, 0, encryptedData1.length);
 workStream.write(encryptedData2, 0, encryptedData2.length);
 byte[] encryptedResult = workStream.toByteArray();

 
復号化サンプルコード
暗号化されたセッション鍵を復号化するために必要な情報
  • 暗号化されたセッション鍵: encryptedSessionKey
  • パスワード:password
  • ソルト:salt
  • 繰り返し回数:iterationCount
  • 初期化ベクタ:ivForSessionKey
  • ハッシュアルゴリズム:CipherPBE.HASH_SHA1
  • 暗号化アルゴリズム(セッション鍵用):SymmetricCipher.AES_128_CBC_PKCS7PADDING
暗号文を復号化するために必要な情報
  • 暗号化アルゴリズム:SymmetricCipher.DES_CBC_PKCS7PADDING
  • 初期化ベクタ:iv
 // AESを用いて暗号化されたセッション鍵を復号化するためのオブジェクト
 CipherPBE decryptionPBE = new CipherPBE(password,
                                  salt,
                                  iterationCount,
                                  CipherPBE.HASH_SHA1,
                                  SymmetricCipher.AES_128_CBC_PKCS7PADDING,
                                  ivForSessionKey);

 // 暗号化されたセッション鍵から CipherSessionKey オブジェクトを生成
 
 CipherSessionKey sessionKeyForDecryption = null;
 try {
     sessionKeyForDecryption = decryptionPBE.createCipherSessionKey(encryptedSessionKey);
 } catch(CipherException ce) {
 }
 

 // DESを用いて暗号文を復号化するためのオブジェクト
 
 SymmetricCipher sc = sessionKeyForDecryption.createSymmetricCipher(SymmetricCipher.DES_CBC_PKCS7PADDING,
                                      iv,
                                      false);
 

 
 // 復号化(終端ブロックのパディング処理も含む)
 byte[] decryptedResult = null;
 try {
     decryptedResult = sc.executeFinal(encryptedResult);
 } catch(CipherException ce) {
 }
 
 
 

導入されたバージョン:
DoJa-5.1 (905i)

フィールドの概要
static int AES_128_CBC_PKCS7PADDING
          AES(128 ビット鍵) を用いた暗号化方式を表します(=3)。
static int AES_192_CBC_PKCS7PADDING
          AES(192 ビット鍵) を用いた暗号化方式を表します(=4)。
static int AES_256_CBC_PKCS7PADDING
          AES(256 ビット鍵) を用いた暗号化方式を表します(=5)。
static int DES_CBC_PKCS7PADDING
          DES を用いた暗号化方式を表します(=1)。
static int DES_EDE_CBC_PKCS7PADDING
          トリプル DES を用いた暗号化方式を表します(=2)。
 
メソッドの概要
 byte[] execute(byte[] data)
           指定されたデータに対し暗号化/復号化を行います。
 byte[] executeFinal(byte[] data)
           指定されたデータに対し暗号化/復号化を行います。
 void reset()
           オブジェクトの状態をオブジェクト生成時の状態に戻します。
 
クラス Object から継承したメソッド
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

フィールドの詳細

DES_CBC_PKCS7PADDING

public static final int DES_CBC_PKCS7PADDING
DES を用いた暗号化方式を表します(=1)。

この暗号化方式は以下の方式により暗号化/復号化することを示します。

  • 暗号化アルゴリズム:DES
  • 鍵長:64ビット(パリティビット含む)
  • 暗号化ブロックサイズ:64ビット
  • 暗号モード:CBC
  • パディング方式:PKCS#7

関連項目:
CipherSessionKey.createSymmetricCipher(int, byte[], boolean), CipherPBE.CipherPBE(byte[], byte[], int, int, int, byte[]), 定数フィールド値

DES_EDE_CBC_PKCS7PADDING

public static final int DES_EDE_CBC_PKCS7PADDING
トリプル DES を用いた暗号化方式を表します(=2)。

この暗号化方式は以下の方式により暗号化/復号化することを示します。

  • 暗号化アルゴリズム:トリプル DES
  • 鍵長:192ビット(パリティビット含む)
  • 暗号化ブロックサイズ:64ビット
  • 暗号モード:CBC
  • パディング方式:PKCS#7

先頭 64 ビットを鍵A、次の 64 ビットを鍵B、残り 64 ビットを鍵Cとして、 鍵A-鍵B-鍵Cの順序で暗号化が行われます。

関連項目:
CipherSessionKey.createSymmetricCipher(int, byte[], boolean), CipherPBE.CipherPBE(byte[], byte[], int, int, int, byte[]), 定数フィールド値

AES_128_CBC_PKCS7PADDING

public static final int AES_128_CBC_PKCS7PADDING
AES(128 ビット鍵) を用いた暗号化方式を表します(=3)。

この暗号化方式は以下の方式により暗号化/復号化することを示します。

  • 暗号化アルゴリズム:AES
  • 鍵長:128ビット
  • 暗号化ブロックサイズ:128ビット
  • 暗号モード:CBC
  • パディング方式:PKCS#7

関連項目:
CipherSessionKey.createSymmetricCipher(int, byte[], boolean), CipherPBE.CipherPBE(byte[], byte[], int, int, int, byte[]), 定数フィールド値

AES_192_CBC_PKCS7PADDING

public static final int AES_192_CBC_PKCS7PADDING
AES(192 ビット鍵) を用いた暗号化方式を表します(=4)。

この暗号化方式は以下の方式により暗号化/復号化することを示します。

  • 暗号化アルゴリズム:AES
  • 鍵長:192 ビット
  • 暗号化ブロックサイズ:128 ビット
  • 暗号モード:CBC
  • パディング方式:PKCS#7

関連項目:
CipherSessionKey.createSymmetricCipher(int, byte[], boolean), CipherPBE.CipherPBE(byte[], byte[], int, int, int, byte[]), 定数フィールド値

AES_256_CBC_PKCS7PADDING

public static final int AES_256_CBC_PKCS7PADDING
AES(256 ビット鍵) を用いた暗号化方式を表します(=5)。

この暗号化方式は以下の方式により暗号化/復号化することを示します。

  • 暗号化アルゴリズム:AES
  • 鍵長:256ビット
  • 暗号化ブロックサイズ:128ビット
  • 暗号モード:CBC
  • パディング方式:PKCS#7

関連項目:
CipherSessionKey.createSymmetricCipher(int, byte[], boolean), CipherPBE.CipherPBE(byte[], byte[], int, int, int, byte[]), 定数フィールド値
メソッドの詳細

execute

public byte[] execute(byte[] data)

指定されたデータに対し暗号化/復号化を行います。

このメソッドは暗号化/復号化されたデータを返します。 このオブジェクトが保持する余剰データと指定されたデータの合計サイズがブロックサイズに満たない場合、 またはデータとして null が指定された場合はnull を返します。

このメソッドが暗号化または復号化のどちらで動作するかは、 このオブジェクトの生成時に決まります。

このメソッドは暗号化/復号化対象のデータ量が多い場合に使用します。 データを任意の長さで分割後、分割した最初のデータから順番にこのメソッドを繰り返し実行します。 分割した最後のデータについては、executeFinal(byte[]) を使用します。 メソッド呼び出し順に戻り値を結合することで、一つの暗号化/復号化されたデータが完成します。

指定するデータの長さは、暗号化ブロックサイズの倍数である必要はありません。 暗号化/復号化されない余剰データはこのオブジェクトに保持されます。 再度このメソッドが呼び出されるか、 executeFinal(byte[]) を呼び出された時に、 各メソッドで指定されたデータと合わせて暗号化/復号化が行われます。 指定されたデータが暗号化ブロックサイズに満たない場合でも、 このオブジェクトが保持する余剰データとの合計サイズが暗号化ブロックサイズを満たせば、 暗号化/復号化が行われます。

データ終端の暗号化ブロックに対するパディング処理は行われません。 分割した最後のデータについては、executeFinal(byte[]) を呼び出さなければなりません。

指定した暗号化/復号化対象のデータは、このメソッド内でコピーされ使用されます。 返される暗号化/復号化されたデータは、このオブジェクトが内部で保持している配列のコピーです。

パラメータ:
data - 暗号化/復号化対象のデータを指定します。
戻り値:
暗号化/復号化されたデータを返します。
関連項目:
executeFinal(byte[])

executeFinal

public byte[] executeFinal(byte[] data)
                    throws CipherException

指定されたデータに対し暗号化/復号化を行います。

このメソッドは暗号化/復号化されたデータを返します。 このオブジェクトに余剰データがない状態で引数 data に null が指定されると、 execute(byte[]) の呼び出し直後である場合は、 暗号化においては暗号化されたパディングデータを返し、復号化においては例外を発生させます。 execute(byte[]) の呼び出し直後でない場合は、 暗号化/復号化のいずれにおいても null を返します。 なお、このメソッド呼び出し後、このメソッドまたは execute(byte[]) により、 新たに暗号化/復号化を行えます。

このメソッドが暗号化または復号化のどちらで動作するかは、 このオブジェクトの生成時に決まります。

このメソッドはデータ終端の暗号化ブロックに対するパディング処理を行います。

暗号化/復号化対象のデータ量が多い場合には、 データを任意の長さで分割し execute(byte[]) を使用してください。 execute(byte[]) によってこのオブジェクトに余剰データがある状態では、 このメソッドの振る舞いは暗号化と復号化でそれぞれ異なります。 暗号化においては、 指定されたデータと余剰データの合計サイズが暗号化ブロックサイズの倍数であるか否かに関わらず、 暗号化されたデータを返します。 一方、復号化においては、 指定されたデータと余剰データの合計サイズが暗号化ブロックサイズの倍数である場合には復号化されたデータを返しますが、 そうでない場合には例外が発生します。 従って、このオブジェクトに余剰データがある状態で引数 data に null が指定された場合、 このメソッドは暗号化においては暗号化されたデータを返し、復号化においては例外が発生します。

指定した暗号化/復号化対象のデータは、このメソッド内でコピーされ使用されます。 返される暗号化/復号化されたデータは、このオブジェクトが内部で保持している配列のコピーです。

このメソッドで例外が発生した場合に、 このオブジェクトの状態がオブジェクト生成時の状態に戻されるかどうかは機種依存です。 再度、暗号化/復号化を行う場合には reset() を呼び出してください。

パラメータ:
data - 暗号化/復号化対象のデータを指定します。
戻り値:
暗号化/復号化されたデータを返します。
例外:
CipherException -
復号化において、パディングを解除できない場合に発生します(BAD_PADDING)。 以下の場合を含みます。
  • 復号化するための設定に誤りがあり復号化に失敗した場合
  • 終端ブロックが含まれていない暗号文を復号化した場合
  • 復号化すべきデータがない場合
  • 復号化すべきデータが暗号化ブロックサイズの倍数でない場合
関連項目:
execute(byte[])

reset

public void reset()

オブジェクトの状態をオブジェクト生成時の状態に戻します。

execute(byte[]) の呼び出しから executeFinal(byte[]) の呼び出しまでの間に 暗号化/復号化を中止し、再度、新たに暗号化/復号化を行う場合に使用してください。