【发布时间】:2018-04-19 21:18:19
【问题描述】:
我正在尝试设置 128 位 AES 加密,但我的 Cipher.init 出现异常:
No installed provider supports this key: javax.crypto.spec.SecretKeySpec
我正在使用以下代码在客户端生成密钥:
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();
然后,此密钥作为标头传递给服务器。它是使用此函数进行 Base64 编码的:
public String secretKeyToString(SecretKey s) {
Base64 b64 = new Base64();
byte[] bytes = b64.encodeBase64(s.getEncoded());
return new String(bytes);
}
服务器拉头,然后做
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;
}
为了调试它,我在客户端的密钥生成之后和服务器端的 cipher.init 之前都放置了断点。根据 Netbeans 的说法,组成 SecretKey 的字节是相同的,长度为 16 个字节(事实上,据我所知,对象是相同的)。
我知道无限强度的 JCE 东西,但我并不认为我需要它来实现 128 位 AES。
客户端:java版本“1.6.0_26”
服务器端:java 版本“1.6.0_20”
有什么想法吗?
【问题讨论】:
-
您在服务器上安装了哪些提供程序?
for (Provider p : Security.getProviders()) System.out.println(p.getName()); -
还有,
SYMMETRIC_ALGORITHM的定义是什么? -
@erickson Dangit,我尝试替换 SYMMETRIC_ALGORITHM 字符串。它们是定义为“AES”的最终字符串(在服务器和客户端上)。我会尝试您提供给我的提供程序代码并回复您
-
@erickson 输出:
SUN SunRsaSign SunJSSE SunJCE SunJGSS SunSASL XMLDSig SunPCSC SunPKCS11-NSS -
您是否从 Oracle 安装了无限制加密的策略文件?您可以尝试安装它们吗?
标签: java encryption cryptography aes secret-key