必要な手順
保存されたデータの読み込み
鍵 (secretKey.key)、ソルト (salt.key)、初期化ベクトル (iv.key) をそれぞれファイルから読み込みます。
暗号器の初期化
読み込んだsecretKey と ivを用いて、 Chipherを暗号化モードに設定します。
データの暗号化
初期化した Chipherを使用してデータを暗号化します。
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import javax.crypto.spec.IvParameterSpec;
import java.io.FileInputStream;
import java.io.ByteArrayOutputStream;
public void encryptData(String data, String storagePath) throws Exception {
// 保存された鍵を読み込む
byte[] encodedKey;
try (FileInputStream keyIn = new FileInputStream(storagePath + "/secretKey.key")) {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
byte[] temp = new byte[1024];
int bytesRead;
while ((bytesRead = keyIn.read(temp)) != -1) {
buffer.write(temp, 0, bytesRead);
}
encodedKey = buffer.toByteArray();
}
SecretKey secretKey = new SecretKeySpec(encodedKey, "AES");
// ソルトを読み込む(将来的に復号が必要な場合のみ必要)
byte[] salt;
try (FileInputStream saltIn = new FileInputStream(storagePath + "/salt.key")) {
salt = saltIn.readAllBytes();
}
// 初期化ベクトル (IV) を読み込む
byte[] iv;
try (FileInputStream ivIn = new FileInputStream(storagePath + "/iv.key")) {
iv = ivIn.readAllBytes();
}
IvParameterSpec ivSpec = new IvParameterSpec(iv);
// AES 暗号器の初期化
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
// データの暗号化
byte[] plaintext = data.getBytes("UTF-8");
byte[] ciphertext = cipher.doFinal(plaintext);
// 暗号化結果を表示または保存
System.out.println("Encrypted Data: " + javax.xml.bind.DatatypeConverter.printHexBinary(ciphertext));
}
説明
鍵 (secretKey.key) の読み込み: 鍵をSecretKeySpec として再構築します。
初期化ベクトル (iv.key) の読み込み: IV を IvParameterSpecとして読み込んで利用します。
暗号器 (Chiher) の設定: を使用して AES/CBC/PKCS5Padding のモードを設定します。
暗号化結果: 暗号化されたデータを で表示していますが、必要に応じてファイルに保存も可能です。
注意点
暗号化モードには AES/CBC/PKCS5Paddingを使用しています。復号化の際にも同じモードを利用してください。
必ず同じソルト (salt.key) と IV (iv.key) を使用してください。これらが一致しないと復号に失敗します。
暗号化されたデータを適切な場所に保存するか、必要ならファイル出力してください。



コメント