MST

星途 面试题库

面试题:Java安全编程之加密 - 对称加密算法应用

在Java安全编程中,假设你需要对用户的敏感信息进行加密传输,要求使用对称加密算法。请简述对称加密的原理,并使用AES算法实现一个简单的加密和解密功能示例代码,包括密钥生成、加密、解密的步骤。
29.4万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

对称加密原理

对称加密是一种加密方式,通信双方使用相同的密钥进行加密和解密操作。发送方使用密钥对明文进行加密,生成密文后传输给接收方,接收方使用同样的密钥对密文进行解密,从而得到原始的明文。这种方式的优点是加密和解密速度快,适合对大量数据进行加密处理。缺点是密钥的管理和分发比较困难,因为如果密钥泄露,密文就可以被轻易破解。

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();
        }
    }
}

在上述代码中:

  1. generateAESKey 方法使用 KeyGenerator 生成一个256位的AES密钥。
  2. encrypt 方法首先生成一个随机的初始化向量(IV),然后使用AES算法在CBC模式下对明文进行加密,并将IV和加密后的文本拼接在一起进行Base64编码。
  3. decrypt 方法先对Base64编码的密文进行解码,提取出IV,然后使用AES算法在CBC模式下对密文进行解密。
  4. main 方法中演示了密钥生成、加密和解密的完整过程。