JAVA,AES加密算法

本文详细介绍了使用Java实现AES加密算法的过程,包括密钥生成、数据加密和解密的步骤,以及如何使用UTF-8字符集。代码示例涵盖了从字符串到字节数组的编码和从字节数组到字符串的解码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

private static final String AES = "AES";
    private static final String CHARSET_NAME = "utf-8";

    
    private static SecretKeySpec getKey(String password)
            throws NoSuchAlgorithmException {
        // 密钥加密器生成器
        KeyGenerator kgen = KeyGenerator.getInstance(AES);
        SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
        random.setSeed(password.getBytes());
        kgen.init(128, random);
        // 创建加密器
        SecretKey secretKey = kgen.generateKey();
        byte[] enCodeFormat = secretKey.getEncoded();
        SecretKeySpec key = new SecretKeySpec(enCodeFormat, AES);
        return key;
    }

    
    public static String encode(String str, String password) {
        byte[] arr = encodeToArr(str, password);
        return byteArrToString(arr);
    }

    
    private static byte[] encodeToArr(String str, String password) {
        try {
            Cipher cipher = Cipher.getInstance(AES);// 创建密码器
            byte[] byteContent = str.getBytes(CHARSET_NAME);

            cipher.init(Cipher.ENCRYPT_MODE, getKey(password));// 初始化
            byte[] result = cipher.doFinal(byteContent);
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    
    public static String decode(String hexStr, String password) {
        try {
            byte[] arr = string2ByteArr(hexStr);
            return decode(arr, password);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    
    private static String decode(byte[] arr, String password) {
        try {
            // 创建密码器
            Cipher cipher = Cipher.getInstance(AES);
            cipher.init(Cipher.DECRYPT_MODE, getKey(password));// 初始化

            byte[] result = cipher.doFinal(arr);
            return new String(result, CHARSET_NAME);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    
    private static String byteArrToString(byte[] arr) {
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < arr.length; i++) {
            String s = Integer.toString(arr[i] + 128, 16);
            if (s.length() == 1) {
                s = "0" + s;
            }
            sb.append(s);
        }

        return sb.toString().toUpperCase();
    }

    
    private static byte[] string2ByteArr(String s) {
        s = s.toUpperCase();
        String str = "0123456789ABCDEF";
        byte[] arr = new byte[s.length() / 2];
        for (int i = 0; i < arr.length; i++) {
            char s1 = s.charAt(i * 2);
            char s2 = s.charAt(i * 2 + 1);
            int tmp1 = str.indexOf(s1) * 16;
            int tmp2 = str.indexOf(s2);
            arr[i] = (byte) (tmp1 + tmp2 - 128);

        }
        return arr;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值