gpt4 book ai didi

java - 异常 : "Given final block not properly padded" in Linux, 但它适用于 Windows

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:01:19 34 4
gpt4 key购买 nike

我的应用程序在 Windows 中运行,但在 Linux 中失败并出现Given final block not properly padded异常。

配置:

  • JDK 版本:1.6
  • Windows:版本 7
  • Linux 操作系统:CentOS 5.8 64 位

我的代码如下:

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.Key;
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 sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;

public class SecurityKey {
private static Key key = null;
private static String encode = "UTF-8";
private static String cipherKey = "DES/ECB/PKCS5Padding";

static {
try {
KeyGenerator generator = KeyGenerator.getInstance("DES");
String seedStr = "test";
generator.init(new SecureRandom(seedStr.getBytes()));
key = generator.generateKey();
} catch(Exception e) {
}
}

// SecurityKey.decodeKey("password")
public static String decodeKey(String str) throws Exception {
if(str == null)
return str;

Cipher cipher = null;
byte[] raw = null;
BASE64Decoder decoder = new BASE64Decoder();
String result = null;
cipher = Cipher.getInstance(cipherKey);
cipher.init(Cipher.DECRYPT_MODE, key);
raw = decoder.decodeBuffer(str);
byte[] stringBytes = null;
stringBytes = cipher.doFinal(raw); // Exception!!!!
result = new String(stringBytes, encode);

return result;
}
}

在线:

   ciper.doFilnal(raw);

抛出以下异常:

   javax.crypto.BadPaddingException: Given final block not properly padded

我该如何解决这个问题?

最佳答案

答案在于 SecureRandom 播种对于特定运行时可能不同。大多数时候您会得到 "SHA1PRNG",它不会立即播种。相反,您可以在请求任何随机数之前调用 setSeed(),在这种情况下,种子将用作熵的唯一来源。在这种情况下,您的 key 将始终相同。

问题是未定义返回哪个 SecureRandom。您可能会得到一个完全不同的、特定于平台的实现,但上述情况并非如此。如果其他提供商优先,您可能无法获得 Sun 提供商之一。

然后是种子的问题。在调用 getBytes() 期间,种子使用 seedStr 变量的平台默认编码。由于编码可能不同,种子可能不同,因此结果也会不同。

尝试使用诸如 PBKDF2 之类的函数来代替 key 派生; stackoverflow 上有足够的关于如何进行的内容。

关于java - 异常 : "Given final block not properly padded" in Linux, 但它适用于 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12509363/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com