面试题答案
一键面试对称加密原理
对称加密是一种加密方式,通信双方使用相同的密钥进行加密和解密操作。发送方使用密钥对明文进行加密,生成密文后传输给接收方,接收方使用同样的密钥对密文进行解密,从而得到原始的明文。这种方式的优点是加密和解密速度快,适合对大量数据进行加密处理。缺点是密钥的管理和分发比较困难,因为如果密钥泄露,密文就可以被轻易破解。
AES算法实现示例代码
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64;
public class AESEncryptionExample {
// 生成AES密钥
public static SecretKey generateAESKey() throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(256); // AES-256
return keyGenerator.generateKey();
}
// AES加密
public static String encrypt(String plainText, SecretKey secretKey) throws Exception {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] iv = new byte[16];
SecureRandom secureRandom = new SecureRandom();
secureRandom.nextBytes(iv);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
byte[] encrypted = cipher.doFinal(plainText.getBytes());
byte[] encryptedIVAndText = new byte[iv.length + encrypted.length];
System.arraycopy(iv, 0, encryptedIVAndText, 0, iv.length);
System.arraycopy(encrypted, 0, encryptedIVAndText, iv.length, encrypted.length);
return Base64.getEncoder().encodeToString(encryptedIVAndText);
}
// AES解密
public static String decrypt(String encryptedText, SecretKey secretKey) throws Exception {
byte[] decodedText = Base64.getDecoder().decode(encryptedText);
byte[] iv = new byte[16];
System.arraycopy(decodedText, 0, iv, 0, iv.length);
IvParameterSpec ivSpec = new IvParameterSpec(iv);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
byte[] encrypted = new byte[decodedText.length - iv.length];
System.arraycopy(decodedText, iv.length, encrypted, 0, encrypted.length);
byte[] decrypted = cipher.doFinal(encrypted);
return new String(decrypted);
}
public static void main(String[] args) {
try {
SecretKey secretKey = generateAESKey();
String plainText = "sensitive information";
String encryptedText = encrypt(plainText, secretKey);
System.out.println("加密后的文本: " + encryptedText);
String decryptedText = decrypt(encryptedText, secretKey);
System.out.println("解密后的文本: " + decryptedText);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在上述代码中:
generateAESKey
方法使用KeyGenerator
生成一个256位的AES密钥。encrypt
方法首先生成一个随机的初始化向量(IV),然后使用AES算法在CBC模式下对明文进行加密,并将IV和加密后的文本拼接在一起进行Base64编码。decrypt
方法先对Base64编码的密文进行解码,提取出IV,然后使用AES算法在CBC模式下对密文进行解密。- 在
main
方法中演示了密钥生成、加密和解密的完整过程。