1. 序章

3DESまたはトリプルデータ暗号化アルゴリズムは、DES暗号化アルゴリズムを各データブロックに3回適用する対称鍵ブロック暗号です。

このチュートリアルでは、 3DESキーを作成し、それらを使用してJavaの文字列とファイルを暗号化および復号化する方法を学習します。

2. シークレットキーの生成

3DES秘密鍵を生成するには、いくつかの手順が必要です。 まず、暗号化と復号化のプロセスに使用される秘密鍵を生成する必要があります。 この例では、乱数と文字で構成された24バイトのキーを使用します。

byte[] secretKey = "9mng65v8jf4lxn93nabf981m".getBytes();

秘密鍵は公に共有されるべきではないことに注意してください

次に、キーを SecretKeySpec でラップし、選択したアルゴリズムと組み合わせます。

SecretKeySpec secretKeySpec = new SecretKeySpec(secretKey, "TripleDES");

この例では、Javaセキュリティ標準アルゴリズムの1つであるTripleDESを使用しています。

事前に生成する必要があるもう1つの項目は、キーの初期化ベクトルです。 乱数と文字の8バイト配列を使用します。

byte[] iv = "a76nb5h9".getBytes();

次に、それをIvParameterSpecクラスでラップします。

IvParameterSpec ivSpec = new IvParameterSpec(iv);

3. 文字列の暗号化

これで、単純なString値を暗号化する準備が整いました。 まず、使用するStringを定義しましょう。

String secretMessage = "Baeldung secret message";

次に、暗号化モード、秘密鍵、および以前に生成した初期化ベクトルで初期化されたCipherオブジェクトが必要です。

Cipher encryptCipher = Cipher.getInstance("TripleDES/CBC/PKCS5Padding");
encryptCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec);

TripleDESアルゴリズムとCBCおよびPKCS#5パディングスキームを使用していることに注意してください。

Cipherを使用すると、doFinalメソッドを実行してメッセージを暗号化できます byte 配列でのみ機能するため、最初にStringを変換する必要があることに注意してください。

byte[] secretMessagesBytes = secretMessage.getBytes(StandardCharsets.UTF_8);
byte[] encryptedMessageBytes = encryptCipher.doFinal(secretMessagesBytes);

これで、メッセージは正常に暗号化されました。 データベースに保存したり、 REST API を介して送信したりする場合は、Base64アルファベットエンコードする方が便利です。

String encodedMessage = Base64.getEncoder().encodeToString(encryptedMessageBytes);

Base64エンコーディングにより、メッセージが読みやすくなり、操作が簡単になります。

4. 文字列の復号化

次に、暗号化プロセスを逆にして、メッセージを元の形式に復号化する方法を見てみましょう。 このために、新しいCipherインスタンスが必要ですが、今回は復号化モードで初期化します

Cipher decryptCipher = Cipher.getInstance("TripleDES/CBC/PKCS5Padding");
decryptCipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec);

次に、doFinalメソッドを実行します。

byte[] decryptedMessageBytes = decryptCipher.doFinal(encryptedMessageBytes);

次に、結果をString変数にデコードします。

String decryptedMessage = new String(decryptedMessageBytes, StandardCharsets.UTF_8);

最後に、結果を検証して、初期値と比較することにより、復号化プロセスが正しく実行されたことを確認できます。

Assertions.assertEquals(secretMessage, decryptedMessage);

5. ファイルの操作

ファイル全体を暗号化することもできます。 例として、いくつかのテキストコンテンツを含む一時ファイルを作成しましょう。

String originalContent = "Secret Baeldung message";
Path tempFile = Files.createTempFile("temp", "txt");
writeString(tempFile, originalContent);

次に、そのコンテンツを1バイト配列に変換しましょう。

byte[] fileBytes = Files.readAllBytes(tempFile);

これで、Stringで行ったのと同じ方法で暗号化暗号を使用できます。

Cipher encryptCipher = Cipher.getInstance("TripleDES/CBC/PKCS5Padding");
encryptCipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivSpec);
byte[] encryptedFileBytes = encryptCipher.doFinal(fileBytes);

最後に、ファイルの内容を新しい暗号化されたデータで上書きしましょう。

try (FileOutputStream stream = new FileOutputStream(tempFile.toFile())) {
    stream.write(encryptedFileBytes);
}

復号化プロセスは非常によく似ています。 唯一の違いは、復号化モードで初期化された暗号です。

encryptedFileBytes = Files.readAllBytes(tempFile);
Cipher decryptCipher = Cipher.getInstance("TripleDES/CBC/PKCS5Padding");
decryptCipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivSpec);
byte[] decryptedFileBytes = decryptCipher.doFinal(encryptedFileBytes);

もう一度、ファイルの内容を上書きしましょう–今回は、復号化されたデータで:

try (FileOutputStream stream = new FileOutputStream(tempFile.toFile())) {
    stream.write(decryptedFileBytes);
}

最後のステップとして、ファイルの内容が元の値と一致するかどうかを確認できます。

String fileContent = readString(tempFile);
Assertions.assertEquals(originalContent, fileContent);

6. 概要

この記事では、Javaで3DESキーを作成する方法と、それを使用してStringとファイルを暗号化および復号化する方法を学習しました。

いつものように、すべてのソースコードはGitHub利用できます。