java实现AES加密

128位密钥,用jdk自带库实现

[参考1](https://blog.youkuaiyun.com/u013871100/article/details/80100992)
[参考2](https://blog.youkuaiyun.com/qq_18870023/article/details/52183755)

AES涉及几个参数:加密模式、补码方式、偏移量
经验证jdk默认的是ECB模式,并不是参考中所说的CBC
因为,ECB模式是不需要偏移的,默认情况下插入偏移,从jdk报错信息提示来看,默认确定是ECB
代码在下,加密和解密都没问题。可是加密结果和在线加密工具出的结果不一致
很费解为什么不一致,参数设置都已经一样了,只能先这样了
public class AesUtil {

	public static String 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");//默认ECB模式
            byte[] byteContent = content.getBytes("utf-8");
            cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(byteContent);
            return new Base64().encodeToString(result); // 加密
//            return byteToHexString(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;
	}
	
	public static String decrypt(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");// 创建密码器
            cipher.init(Cipher.DECRYPT_MODE, key);// 初始化
            byte[] result = cipher.doFinal(Base64.decodeBase64(content));
            return new String(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;
	}
	
//	public static String byteToHexString(byte[] bytes) {
//        StringBuffer sb = new StringBuffer(bytes.length);
//        String sTemp;
//        for (int i = 0; i < bytes.length; i++) {
//            sTemp = Integer.toHexString(0xFF & bytes[i]);
//            if (sTemp.length() < 2)
//                sb.append(0);
//            sb.append(sTemp.toUpperCase());
//        }
//        return sb.toString();
//	}
}
### 实现AES加密Java中的方法 对于希望利用Java实现AES加密的应用开发者来说,可以依赖于标准库`javax.crypto`包来完成这一目标[^1]。下面提供了一个简单的例子用于说明如何创建一个基于AES算法的加密解密工具类。 ```java import javax.crypto.Cipher; import javax.crypto.KeyGenerator; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; public class AesUtil { private static final String ALGORITHM = "AES"; public byte[] encrypt(String content, SecretKey secretKey) throws Exception { Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, secretKey); return cipher.doFinal(content.getBytes()); } public byte[] decrypt(byte[] content, SecretKey secretKey) throws Exception { Cipher cipher = Cipher.getInstance(ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, secretKey); return cipher.doFinal(content); } } ``` 为了生成所需的秘钥对象,在实际应用中可以通过如下方式: ```java // 创建并初始化秘钥生成器实例 KeyGenerator keyGen = KeyGenerator.getInstance("AES"); keyGen.init(128); // 可选参数长度为128/192/256位,默认128 SecretKey secretKey = keyGen.generateKey(); ``` 如果已经有了十六进制表示形式的秘密钥匙字符串,则可通过以下代码转换成`SecretKey`对象以便后续操作: ```java byte[] decoded = Hex.decodeHex(hexString.toCharArray()); SecretKey originalKey = new SecretKeySpec(decoded , 0, decoded.length, "AES"); ``` 需要注意的是,上述示例仅展示了基本的功能框架;真实场景下还需要考虑更多因素如异常处理、输入验证以及安全存储秘密钥匙等问题。此外,当涉及到PGP消息加密时,虽然BouncyCastle是一个流行的选择,但是由于其复杂性和与其他应用程序兼容性的挑战,建议寻找更简单易用的相关库来进行开发工作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值