我有以下代码将DH密钥转换为AES密钥。直到Oracle JRE 8u161开始限制java.security文件中DH密钥NoSuchAlgorithmException: Unsupported secret key algorithm AES。

PrivateKey privKey = null;
PublicKey pubKey = null;
PublicKey agreement = null;

KeyAgreement keyAgreement = KeyAgreement.getInstance("DH");
keyAgreement.init(privKey);
keyAgreement.doPhase(pubKey, false);
keyAgreement.doPhase(agreement, true);
SecretKey key = keyAgreement.generateSecret("AES");


我尝试将最后一行更改为此。我可以使用新密钥进行加密和解密,但这不适用于以前生成的旧密钥。

byte[] encodedKey = keyAgreement.generateSecret();
SecretKey key = new SecretKeySpec(encodedKey, 0, encodedKey.length, "AES");


我发现了一个类似的SO问题What metod KeyAgreement.generateSecret(String algorithm) does?,但是我仍然不知道如何在不破坏现有密钥的情况下解决此问题。

最佳答案

通常,密钥大小要求是在CipherKeyAgreement类本身中检查的,而不是由提供程序执行的服务。当然,无论[EDIT:这似乎在这种情况下都可以工作,因此尝试测试诸如Bouncy Castle提供程序之类的其他提供程序,因此密钥大小限制在Java运行时附带的默认提供程序中,似乎使用了“ BC”提供程序。工作正常,see the comment below the answer]。

如果使用其他提供程序不起作用,则使用Bouncy Castle轻量级API(org.bouncycastle.**类)来使用DH的另一个软件实现,从而完全绕过KeyAgreement类。但是,应避免单步执行JCA / KeyAgreement

不用说,存在不使用

09-25 21:55