对称密钥加密 :对称密钥使用相同的密钥进行加密和解密。这种类型的密码学的主要挑战是双方发送方和接收方之间交换密钥。
例:下面的示例使用对称密钥进行加密和解密算法,该算法可作为太阳的 JCE(Java Cryptography Extension) 的一部分提供。Sun JCE有两层,加密API层和提供者层。
DES(Data Encryption Standard)是一种流行的对称密钥算法。目前,DES已经过时,被认为是不安全的。三重 DES 和更强的 DES 变体。它是一个对称密钥块密码。还有其他算法,如Blowfish,Twofish和AES(Advanced Encryption Standard)。AES 是 DES 上最新的加密标准。
步骤:
-
添加安全提供程序 :我们使用的是 JDK 附带的 SunJCE 提供程序。
-
生成密钥 :使用和算法来生成密钥。我们正在使用(DESede是3DES实现的描述性名称:DESede = DES-Encrypt-Decrypt-Encrypt = Triple DES)。
KeyGenerator
DESede
-
编码文本 :为了跨平台的一致性,使用 将纯文本编码为字节。
UTF-8 encoding
-
加密文本 :使用 实例化,使用 密钥并对字节进行加密。
Cipher
ENCRYPT_MODE
-
解密文本 :使用 实例化,使用相同的密钥并解密字节。
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
源
例:密码具有两种模式,它们是加密和解密。我们必须每次在设置模式后开始加密或解密文本。