亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java Diffie hellman 初始化 ECDHKeyAgreement

Java Diffie hellman 初始化 ECDHKeyAgreement

飲歌長嘯 2023-07-28 16:31:22
我有一個像這樣的 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:generateSecretKeyAgreementinitgenerateSecret

此方法將此 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)。

查看完整回答
反對 回復 2023-07-28
  • 1 回答
  • 0 關注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號