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