Javaで暗号・復号をするCipherクラス

外部のライブラリなどは使わずにJavaで暗号・復号をします。

Cipherクラスを使って暗号・復号

javax.crypto.Cipher
暗号アルゴリズムについては詳しくないので、スルーします。

public byte[] encrypt(byte[] data, byte[] key) {
	return transform(Cipher.ENCRYPT_MODE, data, key);
}
public byte[] decrypt(byte[] data, byte[] key) {
	return transform(Cipher.DECRYPT_MODE, data, key);
}
private byte[] transform(int optmode, byte[] data, byte[] key) {
	try {
		Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
		SecretKeySpec secretKeySpec = new SecretKeySpec(key, "AES");
		cipher.init(optmode, secretKeySpec);
		return cipher.doFinal(data);
	} catch (Exception e) {
		e.printStackTrace();
		return null;
	}
}

見やすくするためにExceptionを1つのcatchにまとめています。

暗号のようなパラメータの説明

AESは共通鍵方式の暗号アルゴリズムのひとつです。PKCS5Paddingは、名前の通りパディング、つまりブロックのサイズが不足した場合にどのように値を埋めるかを規定しています。
ECBというのが何なのか分からず調べました。これは、ブロック暗号モードのことだそうで、次のサイトの動画がわかりやすいです。
ブロック暗号モード(block cipher mode)
攻撃に対する耐性を考えると、ECBではなくCBCやOFBを使うべきということですが、上のサンプルは簡単のためにECBで記述しました。CBCやOFBを使う場合、初期化ベクトルとしてIvParameterSpecインスタンスを添える必要があります。

おまけ: 文字列とbyte配列の変換

もし文字列から文字列への暗号・復号がしたければ、次のような形でbyte配列との変換をします。

byte[] byteArray = string.getBytes();
String string = new String(byteArray);

簡単な暗号だったらこれで十分かもしれません。

コメント

タイトルとURLをコピーしました