まず、対称暗号化について話しましょう。対称暗号化とは、暗号化と復号化の両方に同じキーを使用するプロセスを指します。簡単に言えば、開くのに同じ鍵が必要なロックのようなものです。この方法は実装が容易であるため、多くの場面で広く使用されています。
次に、Java で対称暗号化を実装します。広く使用されている対称暗号化アルゴリズムである AES アルゴリズムを選択します。まず、javax.crypto パッケージのキー クラスを使用してキーを生成する必要があります。次のように:
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class SymmetricEncryption {
public static void main(String[] args) throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyBytes = secretKey.getEncoded();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
}
}
次に、次のように、暗号化のために javax.crypto パッケージの暗号化クラスを使用する必要があります。
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class SymmetricEncryption {
public static void main(String[] args) throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyBytes = secretKey.getEncoded();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] input = "Hello, world!".getBytes("UTF-8");
byte[] encrypted = cipher.doFinal(input);
System.out.println(new String(encrypted, "UTF-8"));
}
}
この例では、AES アルゴリズムを使用し、ECB モードと PKCS5Padding 充填方法を使用します。ECB は、平文を固定サイズのブロックに分割し、各ブロックを個別に暗号化する単純なモードです。PKCS5Padding は、平文の長さがブロック長の整数倍になるように、平文の最後に適切なバイトを埋め込むパディング方法です。
最後に、同じキーとデクリプタ クラスを使用して、次のように復号化する必要があります。
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
public class SymmetricEncryption {
public static void main(String[] args) throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
byte[] keyBytes = secretKey.getEncoded();
SecretKeySpec keySpec = new SecretKeySpec(keyBytes, "AES");
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
byte[] input = "Hello, world!".getBytes("UTF-8");
byte[] encrypted = cipher.doFinal(input);
cipher.init(Cipher.DECRYPT_MODE, keySpec);
byte[] decrypted = cipher.doFinal(encrypted);
System.out.println(new String(decrypted, "UTF-8"));
}
}
この例では、最初に同じキー ジェネレーターを使用して同じキーを生成します。次に、同じ暗号化クラスとキーを使用して平文を暗号化し、暗号化された暗号文を入力として復号化クラスに渡します。同じキーを使用するため、decryptor クラスは暗号文を正しく復号化し、平文を出力できます。
Java での対称暗号化の単純な実装は以上です。この記事が、Java 対称暗号化の操作プロセスを理解するのに役立つことを願っています。なぜ暗号化を使用するのですか? 情報漏えいを避けるために機密情報を保護する必要があることが多いためです。そしたら、次回必要になったときの参考に、手元にサンプルコードありますよ!