|
||||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||
| 概要: 入れ子 | フィールド | コンストラクタ | メソッド | 詳細: フィールド | コンストラクタ | メソッド | |||||||||
Objectcom.nttdocomo.security.SymmetricCipher
共通鍵暗号で暗号化/復号化する機能を定義します。
暗号化アルゴリズムはDES、トリプル DES、 AES をサポートします。 暗号化アルゴリズムの暗号モードは CBC(Cipher Block Chaining) をサポートします。 終端の暗号化ブロックをパディングする方式は、 PKCS#7 で規定された方式をサポートします。 PKCS#7 の規定については、 RFC 2315 を参照してください。
CipherPBE、CipherSessionKey、
RandomNumberGeneratorを使用する暗号化・復号化のサンプルコードを以下に記します。
サンプルコードでは、プログラム説明のため、
セッション鍵を暗号化する暗号化アルゴリズムと平文を暗号化する暗号化アルゴリズムを分けていますが、
それぞれの処理で用いる暗号化アルゴリズムが同じでもかまいません。
//
// 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();
// 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) {
}
| フィールドの概要 | |
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 |
| フィールドの詳細 |
public static final int DES_CBC_PKCS7PADDING
この暗号化方式は以下の方式により暗号化/復号化することを示します。
CipherSessionKey.createSymmetricCipher(int, byte[], boolean),
CipherPBE.CipherPBE(byte[], byte[], int, int, int, byte[]),
定数フィールド値public static final int DES_EDE_CBC_PKCS7PADDING
この暗号化方式は以下の方式により暗号化/復号化することを示します。
先頭 64 ビットを鍵A、次の 64 ビットを鍵B、残り 64 ビットを鍵Cとして、 鍵A-鍵B-鍵Cの順序で暗号化が行われます。
CipherSessionKey.createSymmetricCipher(int, byte[], boolean),
CipherPBE.CipherPBE(byte[], byte[], int, int, int, byte[]),
定数フィールド値public static final int AES_128_CBC_PKCS7PADDING
この暗号化方式は以下の方式により暗号化/復号化することを示します。
CipherSessionKey.createSymmetricCipher(int, byte[], boolean),
CipherPBE.CipherPBE(byte[], byte[], int, int, int, byte[]),
定数フィールド値public static final int AES_192_CBC_PKCS7PADDING
この暗号化方式は以下の方式により暗号化/復号化することを示します。
CipherSessionKey.createSymmetricCipher(int, byte[], boolean),
CipherPBE.CipherPBE(byte[], byte[], int, int, int, byte[]),
定数フィールド値public static final int AES_256_CBC_PKCS7PADDING
この暗号化方式は以下の方式により暗号化/復号化することを示します。
CipherSessionKey.createSymmetricCipher(int, byte[], boolean),
CipherPBE.CipherPBE(byte[], byte[], int, int, int, byte[]),
定数フィールド値| メソッドの詳細 |
public byte[] execute(byte[] data)
指定されたデータに対し暗号化/復号化を行います。
このメソッドは暗号化/復号化されたデータを返します。 このオブジェクトが保持する余剰データと指定されたデータの合計サイズがブロックサイズに満たない場合、 またはデータとして null が指定された場合はnull を返します。
このメソッドが暗号化または復号化のどちらで動作するかは、 このオブジェクトの生成時に決まります。
このメソッドは暗号化/復号化対象のデータ量が多い場合に使用します。
データを任意の長さで分割後、分割した最初のデータから順番にこのメソッドを繰り返し実行します。
分割した最後のデータについては、executeFinal(byte[]) を使用します。
メソッド呼び出し順に戻り値を結合することで、一つの暗号化/復号化されたデータが完成します。
指定するデータの長さは、暗号化ブロックサイズの倍数である必要はありません。
暗号化/復号化されない余剰データはこのオブジェクトに保持されます。
再度このメソッドが呼び出されるか、
executeFinal(byte[]) を呼び出された時に、
各メソッドで指定されたデータと合わせて暗号化/復号化が行われます。
指定されたデータが暗号化ブロックサイズに満たない場合でも、
このオブジェクトが保持する余剰データとの合計サイズが暗号化ブロックサイズを満たせば、
暗号化/復号化が行われます。
データ終端の暗号化ブロックに対するパディング処理は行われません。
分割した最後のデータについては、executeFinal(byte[]) を呼び出さなければなりません。
指定した暗号化/復号化対象のデータは、このメソッド内でコピーされ使用されます。 返される暗号化/復号化されたデータは、このオブジェクトが内部で保持している配列のコピーです。
data - 暗号化/復号化対象のデータを指定します。
executeFinal(byte[])
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 - execute(byte[])public void reset()
オブジェクトの状態をオブジェクト生成時の状態に戻します。
execute(byte[]) の呼び出しから executeFinal(byte[])
の呼び出しまでの間に
暗号化/復号化を中止し、再度、新たに暗号化/復号化を行う場合に使用してください。
|
||||||||||
| 前のクラス 次のクラス | フレームあり フレームなし | |||||||||