javax.crypto.BadPaddingException: Given final block not properly padded. Such issues can arise if a bad key is used during decryption.
线上排查出现过linux获取秘钥与windows不同的情况,应注意秘钥获取方式
import org.apache.tomcat.util.codec.binary.Base64;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
/**
* 3DES加密解密方式
*
* @author zbing
*/
public class DesUtils {
private static final String KEY_ALGORITHM = "DESede";
public static final String key = "key";
/**
* DESede 加密
*
* @param content 待加密内容
* @param key 加密密钥
* @return 返回Base64转码后的加密数据
*/
public static String encrypt(String content, String key) {
try {
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
// 创建密码器
byte[] byteContent = content.getBytes("utf-8");
cipher.init(Cipher.ENCRYPT_MODE, getSecretKey(key));
// 初始化为加密模式的密码器
byte[] result = cipher.doFinal(byteContent);
return Base64.encodeBase64String(result);
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 解密
*
* @param content
* @param key
* @return 明文数据
*/
public static String decrypt(String content, String key) {
try {
// 实例化
Cipher cipher = Cipher.getInstance(KEY_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, getSecretKey(key));
byte[] result = cipher.doFinal(Base64.decodeBase64(content));
return new String(result, "utf-8");
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
/**
* 生成加密秘钥(如果使用SecureRandom 注意linux和windows 获得的私钥会不一样)
*
* @return
*/
private static SecretKey getSecretKey(final String key) {
SecureRandom secureRandom = null;
try {
secureRandom = SecureRandom.getInstance("SHA1PRNG");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
secureRandom.setSeed(key.getBytes());
// 为我们选择的DES算法生成一个KeyGenerator对象
KeyGenerator kg = null;
try {
kg = KeyGenerator.getInstance(KEY_ALGORITHM);
} catch (NoSuchAlgorithmException e) {
}
kg.init(secureRandom);
// 生成密钥
return kg.generateKey();
}
public static void main(String[] args) {
String content = "root";
System.out.println("content:" + content);
String s1 = encrypt(content, key);
System.out.println("加密:" + s1);
System.out.println("解密:" + DesUtils.decrypt(s1, key));
}
}
参考:https://blog.csdn.net/rj042/article/details/8196125