对称加密实现

86 阅读1分钟

SM4

public class Test {
    public static void main(String[] args) {
        String skey = "abcd1234567890ab";
        SymmetricCrypto sm4 = SmUtil.sm4(skey.getBytes());
        String enBase64Data = sm4.encryptBase64("你好呀");
        String decryptStr = sm4.decryptStr(enBase64Data);
        System.out.println("sm4加密后:" + enBase64Data);
        System.out.println("sm4解密后:" + decryptStr);
    }
}

AES

import cn.hutool.core.util.HexUtil;

import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;

public class AESUtils {
    private static final String AES_ALGORITHM = "AES";
    
    private static final String AES_MODE = "AES/CBC/PKCS5Padding"; // AES加密模式为CBC,填充方式为PKCS5Padding
    
    private static final String AES_KEY = "1234567890123456"; // AES密钥为16位
    
    private static final String AES_IV = "abcdefghijklmnop"; // AES初始化向量为16位

    /**
     * AES加密
     * @param data 待加密的数据
     * @return 加密后的数据,使用16进制编码
     */
    public static String encrypt(String data) throws Exception {
        SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());
        Cipher cipher = Cipher.getInstance(AES_MODE);

        // 初始化加密器,设置加密模式、密钥和初始化向量
        cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec, ivParameterSpec);

        // 加密数据
        byte[] encryptedData = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
        return new String(HexUtil.encodeHex(encryptedData));
//      return Base64.getEncoder().encodeToString(encryptedData); // 对加密后的数据使用Base64编码
    }

    /**
     * AES解密
     * @param encryptedData 加密后的数据,使用16进制编码
     * @return 解密后的数据
     */
    public static String decrypt(String encryptedData) throws Exception {
        // 对加密后的数据使用Base64解码
        byte[] decodedData = HexUtil.decodeHex(encryptedData);

        SecretKeySpec secretKeySpec = new SecretKeySpec(AES_KEY.getBytes(), AES_ALGORITHM);
        IvParameterSpec ivParameterSpec = new IvParameterSpec(AES_IV.getBytes());

        Cipher cipher = Cipher.getInstance(AES_MODE);

        // 初始化解密器,设置解密模式、密钥和初始化向量
        cipher.init(Cipher.DECRYPT_MODE, secretKeySpec, ivParameterSpec);

        // 解密数据
        byte[] decryptedData = cipher.doFinal(decodedData);
        return new String(decryptedData, StandardCharsets.UTF_8);
    }

    public static void main(String[] args) throws Exception {
        String data = "Hello World";

        String encryptedData = encrypt(data);
        System.out.println("加密后的数据:" + encryptedData);

        String decryptedData = decrypt(encryptedData);
        System.out.println("解密后的数据:" + decryptedData);
    }
}