我有一个像这样的 Diffie-Hellman 安全类:public class AESSecurityCap { private PublicKey publicKey; KeyAgreement keyAgreement; byte[] sharedsecret; AESSecurityCap() { makeKeyExchangeParams(); } private void makeKeyExchangeParams() { KeyPairGenerator kpg = null; try { kpg = KeyPairGenerator.getInstance("EC"); kpg.initialize(128); KeyPair kp = kpg.generateKeyPair(); publicKey = kp.getPublic(); keyAgreement = KeyAgreement.getInstance("ECDH"); keyAgreement.init(kp.getPrivate()); } catch (NoSuchAlgorithmException | InvalidKeyException e) { e.printStackTrace(); } } public void setReceiverPublicKey(PublicKey publickey) { try { keyAgreement.doPhase(publickey, false); // <--- Error on this line sharedsecret = keyAgreement.generateSecret(); } catch (InvalidKeyException e) { e.printStackTrace(); } }} 并实现了这个类:public class Node extends AESSecurityCap {}有时我需要重新初始化 DH keyAgreement:public class TestMainClass { public static void main(String[] args) { Node server = new Node(); Node client = new Node(); server.setReceiverPublicKey(client.getPublicKey()); client.setReceiverPublicKey(server.getPublicKey()); // My problem is this line , // Second time result exception server.setReceiverPublicKey(client.getPublicKey()); }}有没有办法多次重新初始化ECDH KeyAgreement?这是我的测试用例:客户端初始化DH并生成公钥。客户端将公钥发送到服务器。服务器用客户端密钥初始化DH并生成自己的公钥并生成共享密钥。服务器将公钥发送给客户端。客户端使用服务器公钥生成共享密钥。在此步骤中,客户端和服务器具有公钥和共享秘密。我的问题是客户端断开连接()和 KeyAgreement 由单例对象初始化,并且不会第二次重新初始化。有时我需要做这个课题。请指导我解决这个问题。
1 回答
Qyouu
TA贡献1786条经验 获得超11个赞
这IllegalStateException (Phase already executed)
似乎尤其是由 SunEC 提供商的 ECDH 实现引起的。init
如果紧接在 之前执行(附加),则不会发生异常doPhase
。但是,这个init
-call 应该不是必需的,因为在执行doPhase
-call后,应该将-instance 重置为 -call 后的状态,至少根据-documentation:generateSecret
KeyAgreement
init
generateSecret
此方法将此 KeyAgreement 对象重置为最近调用 init 方法之一后所处的状态...
这可能是 SunEC 提供程序中的一个错误。如果使用 DH 代替 ECDH(并且使用 SunJCE 提供者代替 SunEC 提供者),则行为符合预期,即可以进行重复doPhase
调用(无需额外init
调用)。这同样适用于使用BouncyCastle提供程序的 ECDH。因此,您可以使用 BouncyCastle-provider 而不是 SunEC-provider 来使用您的代码运行 ECDH。
注意:第二个参数 ( lastPhase
)doPhase
应该设置为 true,否则IllegalStateException (Only two party agreement supported, lastPhase must be true)
会生成一个(至少对于 ECDH)。
添加回答
举报
0/150
提交
取消