Java实现加密——AES加密算法

1、加密算法简介

请添加图片描述

2.1、AES简介

高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法
对称加密算法:加密和解密用相同的密钥。

2.2、AES加密源码

package com.zycfc.ops.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;

/**
 * @Author zhangsan
 * @Date 2023/6/7 10:57
 * @Description AES加密工具类
 * @Version 1.0
 */
@Slf4j
@Component
public class AESUtil {

    /**
     * 默认密钥的KEY
     */
    public static final String AES_KEY = "TRTCDESPHNUIKOHM";


    /**
     * 使用默认key加密字符串
     *
     * @param src
     * @return
     */
    public static String encrypt(String src) {
        try {
            String encrypt = AESUtil.encrypt(src, AES_KEY);
            return encrypt;
        } catch (Exception e) {
            e.printStackTrace();
            log.error("字符串加密失败:{}", e);
        }
        return "";
    }


    /**
     * 使用默认key解密字符串
     *
     * @param src
     * @return
     */
    public static String decrypt(String src) {
        try {
            String decrypt = AESUtil.decrypt(src, AES_KEY);
            return decrypt;
        } catch (Exception e) {
            e.printStackTrace();
            log.error("字符串解密失败:{}", e);
        }
        return "";
    }


    /**
     * 加密
     * 通过AES 加密成 byte[]
     * 然后将byte数组 转成 16进制的字符串
     *
     * @param src
     * @param key
     * @return
     * @throws Exception
     */
    public static String encrypt(String src, String key) throws Exception {
        if (key == null) {
            log.error("密钥不能为空");
            return null;
        }
        // 判断Key是否为16位
        if (key.length() != 16) {
            log.error("key长度不是16位");
            return null;
        }
        byte[] raw = key.getBytes("utf-8");
        SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
        //"算法/模式/补码方式"
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(Cipher.ENCRYPT_MODE, skeySpec);
        byte[] encrypted = cipher.doFinal(src.getBytes("utf-8"));
        return encodeHexString(encrypted);
    }


    /**
     * byte 数组转 16进制字符串
     *
     * @param byteArray byte数组
     * @return String
     */
    public static String encodeHexString(byte[] byteArray) {
        StringBuffer hexStringBuffer = new StringBuffer();
        for (int i = 0; i < byteArray.length; i++) {
            hexStringBuffer.append(byteToHex(byteArray[i]));
        }
        return hexStringBuffer.toString();
    }

    /**
     * byte 转16进制字符串
     *
     * @param num byte
     * @return String
     */
    public static String byteToHex(byte num) {
        char[] hexDigits = new char[2];
        hexDigits[0] = Character.forDigit((num >> 4) & 0xF, 16);
        hexDigits[1] = Character.forDigit((num & 0xF), 16);
        return new String(hexDigits);
    }


    /**
     * 将16进制字符串转成二进制数组 然后解密
     *
     * @param src 16进制字符串
     * @param key 秘钥
     * @return
     */
    public static String decrypt(String src, String key) {
        try {
            // 判断Key是否正确
            if (key == null) {
                log.error("密钥不能为空");
                return null;
            }
            // 判断Key是否为16位
            if (key.length() != 16) {
                log.error("Key长度不是16位");
                return null;
            }
            byte[] raw = key.getBytes("utf-8");
            SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
            cipher.init(Cipher.DECRYPT_MODE, skeySpec);
            byte[] encrypted1 = parseHexStr2Byte(src);
            //new BASE64Decoder().decodeBuffer(src);//先用base64解密
            try {
                byte[] original = cipher.doFinal(encrypted1);
                String originalString = new String(original, "utf-8");
                return originalString;
            } catch (Exception e) {
                log.error(e.toString());
                return null;
            }
        } catch (Exception ex) {
            log.error(ex.toString());
            return null;
        }
    }

    /**
     * 将16进制转换为二进制
     *
     * @param hexStr
     * @return
     */
    public static byte[] parseHexStr2Byte(String hexStr) {
        if (hexStr.length() < 1) {
            return null;
        }
        byte[] result = new byte[hexStr.length() / 2];
        for (int i = 0; i < hexStr.length() / 2; i++) {
            int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);
            int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);
            result[i] = (byte) (high * 16 + low);
        }
        return result;
    }


    public static void main(String[] args) {
        String str = "1680770916096188416";
        String encrypt = AESUtil.encrypt(str);
        System.out.println("加密字符串:" + encrypt);
        String decrypt = AESUtil.decrypt(encrypt);
        System.out.println("解密密字符串:" + decrypt);
    }


}

AES算法Java实现可以通过Java加密javax.crypto来实现。具体步骤如下: 1. 导入相应的包,引入javax.crypto.Cipher和javax.crypto.spec.SecretKeySpec类。 2. 创建一个Cipher对象,指定使用AES算法。 3. 创建一个SecretKeySpec对象,将密钥以字节数组的形式传递给它。 4. 使用Cipher对象的init()方法初始化加密/解密模式和密钥。 5. 调用Cipher对象的doFinal()方法,传入要加密/解密的数据。 6. 处理加密/解密后的数据。 以下是一个简单的AES加密和解密的示例代码: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class AESExample { private static final String key = "0123456789abcdef"; // 密钥,必须为16字节长度的字符串 public static byte[] encrypt(byte[] data) throws Exception { SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, secretKeySpec); return cipher.doFinal(data); } public static byte[] decrypt(byte[] encryptedData) throws Exception { SecretKeySpec secretKeySpec = new SecretKeySpec(key.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, secretKeySpec); return cipher.doFinal(encryptedData); } public static void main(String[] args) throws Exception { String text = "搞事情"; byte[] encryptedData = encrypt(text.getBytes()); String base64EncryptedData = new String(java.util.Base64.getEncoder().encode(encryptedData)); System.out.println("AES加密后:" + base64EncryptedData); byte[] decryptedData = decrypt(java.util.Base64.getDecoder().decode(base64EncryptedData)); String decryptedText = new String(decryptedData); System.out.println("AES解密后:" + decryptedText); } } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值