対称鍵暗号化: 対称鍵は、暗号化と復号化に同じ鍵を使用します。このタイプの暗号化の主な課題は、送信者と受信者の 2 つの当事者間で秘密鍵を交換することです。
例 :次の例では、Sun のJCE ( Java Cryptography Extension ) の一部として利用可能な暗号化および復号化アルゴリズムに対称キーを使用します。Sun JCE には、暗号 API 層とプロバイダ層の 2 つの層があります。
DES ( Data Encryption Standard ) は、一般的な対称鍵アルゴリズムでした。現在、DES は時代遅れであり、安全ではないと考えられています。トリプル DESとDESのより強力な変形。対称鍵ブロック暗号です。Blowfish、Twofish、AES (高度な暗号化標準)などの他のアルゴリズムがあります。AES は、DES に対する最新の暗号化標準です。
手順 :
- セキュリティ プロバイダを追加します。JDK で利用可能な SunJCE プロバイダを使用しています。
- 秘密鍵の生成 :
KeyGenerator
とアルゴリズムを使用して秘密鍵を生成します。使用していますDESede
( DESedeは 3DES 実装のわかりやすい名前です: DESede = DES-Encrypt-Decrypt-Encrypt = Triple DES)。
- Encode Text :プラットフォーム全体での一貫性を保つために、 を使用してプレーン テキストをバイトとしてエンコードします
UTF-8 encoding
。
- Encrypt Text :でインスタンス化
Cipher
しENCRYPT_MODE
、秘密鍵を使用してバイトを暗号化します。
- Decrypt Text :でインスタンス化
Cipher
しDECRYPT_MODE
、同じ秘密鍵を使用してバイトを復号化します。
上記の手順と概念はすべて同じです。アルゴリズムを置き換えるだけです。
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
public class EncryptionDecryptionAES {
static Cipher cipher;
public static void main(String[] args) throws Exception {
/*
create key
If we need to generate a new key use a KeyGenerator
If we have existing plaintext key use a SecretKeyFactory
*/
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128); // block size is 128bits
SecretKey secretKey = keyGenerator.generateKey();
/*
Cipher Info
Algorithm : for the encryption of electronic data
mode of operation : to avoid repeated blocks encrypt to the same values.
padding: ensuring messages are the proper length necessary for certain ciphers
mode/padding are not used with stream cyphers.
*/
cipher = Cipher.getInstance("AES"); //SunJCE provider AES algorithm, mode(optional) and padding schema(optional)
String plainText = "AES Symmetric Encryption Decryption";
System.out.println("Plain Text Before Encryption: " + plainText);
String encryptedText = encrypt(plainText, secretKey);
System.out.println("Encrypted Text After Encryption: " + encryptedText);
String decryptedText = decrypt(encryptedText, secretKey);
System.out.println("Decrypted Text After Decryption: " + decryptedText);
}
public static String encrypt(String plainText, SecretKey secretKey)
throws Exception {
byte[] plainTextByte = plainText.getBytes();
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
byte[] encryptedByte = cipher.doFinal(plainTextByte);
Base64.Encoder encoder = Base64.getEncoder();
String encryptedText = encoder.encodeToString(encryptedByte);
return encryptedText;
}
public static String decrypt(String encryptedText, SecretKey secretKey)
throws Exception {
Base64.Decoder decoder = Base64.getDecoder();
byte[] encryptedTextByte = decoder.decode(encryptedText);
cipher.init(Cipher.DECRYPT_MODE, secretKey);
byte[] decryptedByte = cipher.doFinal(encryptedTextByte);
String decryptedText = new String(decryptedByte);
return decryptedText;
}
}
出力:
Plain Text Before Encryption: AES Symmetric Encryption Decryption
Encrypted Text After Encryption: sY6vkQrWRg0fvRzbqSAYxepeBIXg4AySj7Xh3x4vDv8TBTkNiTfca7wW/dxiMMJl
Decrypted Text After Decryption: AES Symmetric Encryption Decryption
ソース
例:暗号化と復号化の 2 つのモードを持つ暗号。テキストを暗号化または復号化するモードを設定した後、毎回開始する必要があります。