java AES加密

package com.sf.util;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;

import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import org.junit.Test;


/**

 * 可逆加密
 * 对称密钥加密又叫专用密钥加密,即发送和接收数据的双方必使用相同的密钥对明文进行加密和解密运算。
 * 对称密钥加密算法主要包括:DES、3DES、IDEA、FEAL、BLOWFISH等。
 *
 * @author Administrator
 */
public class AES {
    
    /**
     * 辅助数组,主要把byte值转化为对应的char值
     */
    private static char[] CHARS = "0123456789abcdef".toCharArray();
    
    /**
     * 加密
     *
     * 因为没有操作对象,也没有操作相同的资源,所以不会出现多线程问题
     *
     * @param content
     *            需要加密的内容
     * @param password
     *            加密密码
     * @return
     */
    public static byte[] encrypt(String content, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128, new SecureRandom(password.getBytes()));
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(byteContent);
            return result;
            // return parseByte2HexStr(result); // 加密
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 把二进制byte数组转化为十六进制字符串
     * @param buf
     * @return
     */
    public static String parseByte2HexStr(byte buf[]) {
        StringBuffer sBuffer = new StringBuffer();
        for (int i = 0; i < buf.length; i++) {
            byte b = buf[i];
            byte c1 = (byte) ((b & 0xF0) >> 4);
            byte c2 = (byte) (b & 0x0F);
            
            sBuffer.append(CHARS[c1]).append(CHARS[c2]);
        }
        return sBuffer.toString().toUpperCase();
    }
    
    public static byte[] parseHexByte2Str(String str) {
        str = str.toLowerCase();
        byte[] bytes = new byte[str.length() / 2];
        char[] cs = str.toCharArray();
        for (int i = 0; i < cs.length / 2; ++i) {
            char c1 = cs[i * 2];
            char c2 = cs[i * 2 + 1];
            int a1, a2;
            if (c1 < 'a') a1 = c1 - '0';
            else a1 = (c1 - 'a') + 10;
            if (c2 < 'a') a2 = c2 - '0';
            else a2 = (c2 - 'a') + 10;
            bytes[i] = (byte)(((a1 & 0x0F) << 4) | (a2 & 0x0F));
        }
        return bytes;
    }

    /**
     * 解密
     *
     * @param content
     *            待解密内容
     * @param password
     *            解密密钥
     * @return
     */
    public static byte[] decrypt(byte[] content, String password) {
        try {
            KeyGenerator kgen = KeyGenerator.getInstance("AES");
            kgen.init(128, new SecureRandom(password.getBytes()));
            SecretKey secretKey = kgen.generateKey();
            byte[] enCodeFormat = secretKey.getEncoded();
            SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");
            Cipher cipher = Cipher.getInstance("AES");// 创建密码器
            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(content);
            return result; // 加密
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (NoSuchPaddingException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        } catch (IllegalBlockSizeException e) {
            e.printStackTrace();
        } catch (BadPaddingException e) {
            e.printStackTrace();
        }
        return null;
    }

    @Test
    public void testEncrypt() {
        byte[] contentEncrypt = AES.encrypt("你好123威风威风22222222","12345678");
        try {
            String after = AES.parseByte2HexStr(contentEncrypt);
            System.out.println("加密后:" + after);
            byte[] bytes = AES.parseHexByte2Str(after);
            System.out.println(new String(AES.decrypt(bytes, "12345678"),"UTF-8"));
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}


### Java AES 加密实现教程 #### 创建加密工具类 为了便于管理和重复利用,建议创建一个专门用于处理AES加解密操作的工具类 `AesUtil`。 ```java import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.SecretKeySpec; import java.util.Base64; public class AesUtil { private static final String ALGORITHM = "AES"; private static final String TRANSFORMATION = "AES/CBC/PKCS5Padding"; public static SecretKeySpec generateKey() throws Exception { KeyGenerator keyGen = KeyGenerator.getInstance(ALGORITHM); keyGen.init(256); // 使用256位长度秘钥 SecretKey secretKey = keyGen.generateKey(); return new SecretKeySpec(secretKey.getEncoded(), ALGORITHM); } public static byte[] encrypt(String plainText, SecretKeySpec key, IvParameterSpec iv) throws Exception { Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.ENCRYPT_MODE, key, iv); return cipher.doFinal(plainText.getBytes()); } public static String decrypt(byte[] cipherText, SecretKeySpec key, IvParameterSpec iv) throws Exception { Cipher cipher = Cipher.getInstance(TRANSFORMATION); cipher.init(Cipher.DECRYPT_MODE, key, iv); return new String(cipher.doFinal(cipherText)); } } ``` 此代码展示了如何生成AES秘钥以及执行基本的加密和解密过程[^1]。注意这里选择了更安全的CBC模式而非示例中的ECB模式,并加入了初始化向量IV来增强安全性。 对于实际应用而言,还需要考虑秘钥的安全存储方式、异常处理机制等问题,在生产环境中应遵循最佳实践指南以确保数据传输的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值