别以为随便写个密匙的key值就可以进行加解密了

本文探讨了在Windows和Linux环境下使用AES加密解密时,因密匙串定义不当导致的解密失败问题。介绍了如何生成通用密匙串,并提供了加密解密方法,确保在不同操作系统上的一致性。

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

我们都知道在使用加密解密的时候都需要密匙,但是密匙随便定义个可以吗,今天我就遇到这个坑,加密解密用的都是同一个密匙,在本地测试一切正常,然而部署到服务器的时候就亮了,解密的时候报了下面的错误,经查阅资料,原来是因为windows跟Linux的系统不同导致的,随便定义的密匙串是不行的

javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
	at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:991)
	at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:847)
	at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:446)
	at javax.crypto.Cipher.doFinal(Cipher.java:2164)
	at com.ccb.operation.common.utils.AESUtil.decrypt(AESUtil.java:72)
	at com.ccb.mall.module.client.details.ation.ExceldetailAction.executeEx(ExceldetailAction.java:193)

那么该如何生成的通用的密匙串呢,下面提供一个工具类

//生成密匙的方法
public static String getSecretKey() {
    String keyStr = null;
    try {
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
        keyGenerator.init(128);
        SecretKey secretKey = keyGenerator.generateKey();
        byte[] keyBytes = secretKey.getEncoded();
        Key key = new SecretKeySpec(keyBytes, "AES");
        keyStr = Base64.getEncoder().encodeToString(key.getEncoded());
    } catch (Exception var5) {
        var5.printStackTrace();
    }
    return keyStr;
}

执行的结果如下,比如说生成这个GYBh3Rmey7nNzR/NpV0vAw==,就可以把这个密匙串当做常量,加密解密都用这个密匙串就可以了

在这里插入图片描述
加密方法:

public static String encode(String key, String text) {
    String result = null;
    try {
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(1, new SecretKeySpec(Base64.getDecoder().decode(key), "AES"));
        byte[] encodeResult = cipher.doFinal(text.getBytes());
        result = Hex.encodeHexString(encodeResult);
    } catch (Exception var5) {
        var5.printStackTrace();
    }
    return result;
}

解密方法:

public static String decode(String key, String text) {
    String result = null;
    try {
        Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
        cipher.init(2, new SecretKeySpec(Base64.getDecoder().decode(key), "AES"));
        byte[] decodeResult = cipher.doFinal(Hex.decodeHex(text));
        result = new String(decodeResult);
    } catch (Exception var5) {
        var5.printStackTrace();
    }
    return result;
}

测试效果
在这里插入图片描述
这样无论在windows还是Linux都可以正常进行解密了

总结:密匙串不能随便写个,必须得用系统生成的串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值