gpt4 book ai didi

Java AES : No installed provider supports this key: javax. crypto.spec.SecretKeySpec

转载 作者:搜寻专家 更新时间:2023-10-30 21:07:07 68 4
gpt4 key购买 nike

我正在尝试设置 128 位 AES 加密,但我的 Cipher.init 出现异常:

没有已安装的提供程序支持此 key :javax.crypto.spec.SecretKeySpec

我使用以下代码在客户端生成 key :

private KeyGenerator kgen;
try {
kgen = KeyGenerator.getInstance("AES");
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
kgen.init(128);
}
SecretKey skey = kgen.generateKey();

此 key 随后作为 header 传递到服务器。它是使用此函数进行 Base64 编码的:

public String secretKeyToString(SecretKey s) {
Base64 b64 = new Base64();
byte[] bytes = b64.encodeBase64(s.getEncoded());
return new String(bytes);
}

服务器拉取 header ,并执行

protected static byte[] encrypt(byte[] data, String base64encodedKey) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException {
Cipher cipher;
try {
cipher = Cipher.getInstance("AES");
} catch (NoSuchAlgorithmException ex) {
//log error
} catch (NoSuchPaddingException ex) {
//log error
}
SecretKey key = b64EncodedStringToSecretKey(base64encodedKey);
cipher.init(Cipher.ENCRYPT_MODE, key); //THIS IS WHERE IT FAILS
data = cipher.doFinal(data);
return data;
}
private static SecretKey b64EncodedStringToSecretKey(String base64encodedKey) {
SecretKey key = null;

try {
byte[] temp = Base64.decodeBase64(base64encodedKey.getBytes());
key = new SecretKeySpec(temp, SYMMETRIC_ALGORITHM);
} catch (Exception e) {
// Do nothing
}

return key;
}

为了调试它,我在客户端的 key 生成之后和服务器端的 cipher.init 之前都放置了断点。根据 Netbeans 的说法,构成 SecretKey 的字节是相同的,长度为 16 个字节(事实上,据我所知,对象是相同的)。

我知道无限强度的 JCE 东西,但我的印象不是我需要它用于 128 位 AES。

客户端:Java 版本“1.6.0_26”

服务器端:Java 版本“1.6.0_20”

有什么想法吗?

最佳答案

我以不同的方式运行您的代码,使用:Java 1.{5,6,7}(使用 AES);不同的 Base64 编解码器(Apache Commons Codec、DatatypeConverted、Base64);不同的字符集;在不同的 JVM 之间(通过套接字)……无济于事。我没有发现任何错误。

要缩小问题范围,您可以在两端 运行以下代码吗?

static {
System.out.println(System.getProperty("java.version"));
for (Provider provider : Security.getProviders())
System.out.println(provider);
}

public static void main(String[] args) throws Exception {
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
keyGenerator.init(128);
SecretKey secretKey = keyGenerator.generateKey();
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
}

(我知道您已经说明了您正在使用的 JDK 版本和其他内容,但这并没有什么坏处。)

鉴于 key 在您将其从客户端传输到服务器(或可能相反)时不会损坏,那么如果:

  • 客户端抛出,但服务器没有——错误在客户端;
  • 客户端不抛出,但服务器抛出——错误在服务器端;
  • 客户端和服务器都抛出或两者都不抛出——需要进一步调查。

无论如何,如果抛出错误,请将整个堆栈跟踪发布到某处。错误 No installed provider supports this key: javax.crypto.spec.SecretKeySpec 没有告诉我们任何信息(至少对我来说没有,而且我也无法重现这个特定错误)。

关于Java AES : No installed provider supports this key: javax. crypto.spec.SecretKeySpec,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8362262/

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