Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >Java初始化ECDHKeyAgreement

Java初始化ECDHKeyAgreement
EN

Stack Overflow用户
提问于 2019-09-15 02:05:22
回答 1查看 746关注 0票数 4

我有一个像这样的迪夫-赫尔曼保安班:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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();
        }
    }
} 

并实现了这个类:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Node extends AESSecurityCap {
}

有时我需要重新初始化DH keyAgreement

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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()); 
    }
}

但请接受这一例外:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Exception in thread "main" java.lang.IllegalStateException: Phase already executed
    at jdk.crypto.ec/sun.security.ec.ECDHKeyAgreement.engineDoPhase(ECDHKeyAgreement.java:91)
    at java.base/javax.crypto.KeyAgreement.doPhase(KeyAgreement.java:579)
    at ir.moke.AESSecurityCap.setReceiverPublicKey(AESSecurityCap.java:37)
    at ir.moke.TestMainClass.main(TestMainClass.java:13)

有什么方法可以多次重新初始化ECDH KeyAgreement吗?

这是我的测试用例:

  1. 客户端初始化DH并生成公钥。
  2. 客户端向服务器发送公钥。
  3. 服务器使用客户端密钥初始化DH,并生成自己的公钥和共享密钥。
  4. 服务器向客户端发送公钥。
  5. 客户端使用服务器公钥生成共享密钥。在此步骤中,客户端和服务器具有公钥和共享秘密。

我的问题是客户端断开连接()和由单例对象初始化的KeyAgreement,而不是第二次重新初始化。

有时候我需要做这件事。

请指导我解决这个问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-15 06:24:09

IllegalStateException (Phase already executed)似乎特别是由SunEC提供商的ECDH实现引起的.如果在紧接init之前执行(附加的) doPhase,则不会出现异常。但是,这个init-call不应该是必要的,因为在执行doPhase-call generateSecret之后,应该将KeyAgreement-instance重置为init-call之后的状态,至少根据generateSecret-documentation:

此方法将此KeyAgreement对象重置为它在最近调用init方法之一后所处的状态.

可能是SunEC提供商的一个漏洞。如果使用DH代替ECDH (并且使用SunJCE-provider而不是SunEC-provider),则行为是预期的,即可以重复使用doPhase-calls (不需要额外的init-calls)。这同样适用于使用BouncyCastle-provider的ECDH。因此,您可以使用BouncyCastle代替SunEC-provider来使用您的代码运行ECDH。

注意:第二个参数(lastPhasedoPhase中应该设置为true,否则将生成一个IllegalStateException (Only two party agreement supported, lastPhase must be true) (至少对于ECDH)。

编辑:

在JDK 12中已经知道并修复了这个bug,请参阅不重置基于ECDH的算法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57943056

复制
相关文章
关于 循环引用问题
多个对象相互持有,A对象强引用B对象,同时B对象也强引用于A对象,两者相互等待对方发消息告诉自己需要Release,一直等待,形成闭环,内存无法释放,导致内存泄露。
honey缘木鱼
2019/12/20
3.3K0
关于 循环引用问题
fastjson 重复引用和循环引用问题
数据传输使用json格式再方便不过了。 fastjson 由阿里巴巴那伙人使用Java语言编写,号称最快的JSON库 前两天遇到一个问题 后台的数据转化为json字符串后发送到前台出现了$ref字样的东西,后来明白了这是引用,在传输的数据中出现相同的对象时,fastjson默认开启引用检测将相同的对象写成引用的形式. 说到引用分为两种,重复引用和循环引用
Mshu
2018/10/31
2.6K0
PHP 循环引用的问题
问题 为了引出问题, 先来看下面一段代码: <?php $arr = [ 'a', 'b', 'c', 'd', ]; foreach ($arr as &$each){ e
烟草的香味
2019/07/25
3.7K0
PHP 循环引用的问题
Spring循环依赖问题修复
拆分的时候,把错误都处理完后,准备把工程起起来,发现弹簧的循环依赖问题。具体问题如下
端游岚
2018/12/19
3.5K0
Spring循环依赖问题修复
Golang代码循环依赖问题
其实就 package A 引入了 package B ,然后 package B 又引入了 package A ,因此形成了循环依赖。
王小明_HIT
2021/12/02
1.2K0
Golang代码循环依赖问题
python模块循环引用导致问题
这个问题遇到几次了,代码写多了之后,莫名其妙报错。现在终于知道了是因为循环引用的问题。重现一下:
py3study
2020/01/15
7360
python循环引用带来的MemoryError错误解决
在工作中,有一天django服务开始报错MemoryError的错误,没有遇到过这样的错误,上来之后还是很蒙蔽的,问了几个业内的人,他们 都给我说让我改服务器里面配置的东西, 因为是要给大家用的,服务器要保证长久运行,不能临时去修改这个,导致在大家无法使用平台呢,我想着是一个服务启动的时候 引发的,短暂的停服后,并没有解决掉这个问题。还是依旧存在,如果用命令去释放,只会短暂的解决。自己刚开始 也没有想到gc模块,在百度搜索, 找半天 终于找到了,知乎的链接,大概的方式就是用gc 直接去处理。
雷子
2021/03/15
1.5K0
解决循环依赖问题:优雅处理依赖关系的技巧
在软件开发中,依赖是不可避免的。我们经常需要在应用程序的不同组件之间建立依赖关系,以实现功能的模块化和复用。然而,有时候依赖关系可能变得复杂,甚至导致循环依赖的问题。在本文中,我们将通过项目中实际遇到的异常探讨一些解决循环依赖问题的技巧,帮助你在开发过程中优雅地处理依赖关系。
修己xj
2023/08/25
8650
解决循环依赖问题:优雅处理依赖关系的技巧
小记 TypeScript 中的循环引用问题
平时编写 TypeScript 代码时,一般都倾向于使用模块(Module),通过结合使用 import 和 export 我们便可以方便的进行模块的导入和导出.
用户2615200
2020/10/15
5.8K0
iOS常见的内存问题——循环引用
小编在这段儿时间测试过程中发现了好多内存问题,其中较大部分都是由于循环引用造成的内存泄漏,这里小编就借此类问题来给大家分享一下循环引用引发的原因及常见解决方案。
用户5521279
2019/12/10
1.8K0
iOS常见的内存问题——循环引用
Python 实战项目解决循环依赖问题
由于我在 Python 领域还是个初学者,没有遇到类似问题,但是根据分析,问题应该是出在了 循环依赖。
宋天伦
2023/10/20
4140
Python 实战项目解决循环依赖问题
由于我在 Python 领域还是个初学者,没有遇到类似问题,但是根据分析,问题应该是出在了 循环依赖。
宋天伦
2023/10/20
2350
Spring如何解决循环依赖问题
(1)通过构造方法进行依赖注入时产生的循环依赖问题。 (2)通过setter方法进行依赖注入且是在多例(原型)模式下产生的循环依赖问题。 (3)通过setter方法进行依赖注入且是在单例模式下产生的循环依赖问题。 在Spring中,只有第(3)种方式的循环依赖问题被解决了,其他两种方式在遇到循环依赖问题时都会产生异常。这是因为:
红目香薰
2022/11/29
8500
Spring 如何解决循环依赖问题?
这个问题算是关于Spring的一个高频面试题,因为如果不刻意研读,相信即使读过源码,面试者也不一定能够一下子思考出个中奥秘。
Java技术栈
2019/11/28
1.6K0
Spring 如何解决循环依赖问题?
三探循环依赖 → 记一次线上偶现的循环依赖问题
Spring 的循环依赖,源码详细分析 → 真的非要三级缓存吗 中讲到了循环依赖问题
青石路
2022/05/10
8410
三探循环依赖 → 记一次线上偶现的循环依赖问题
通过循环引用问题来分析Spring源码
本文主要分析Spring的循环依赖问题。开始正文之前,我们需要定义这2个类。LoopReferenceA中引用LoopReferenceB,LoopReferenceB中引用LoopReferenceA。
用户2032165
2018/09/03
1.4K0
通过循环引用问题来分析Spring源码
Spring中解决循环依赖报错的问题
当一个ClassA依赖于ClassB,然后ClassB又反过来依赖ClassA,这就形成了一个循环依赖:
Happyjava
2019/07/16
2.9K0
Spring中解决循环依赖报错的问题
iOS循环引用
iOS循环引用 当前类的闭包/Block属性,用到了当前类,就会造成循环引用 此闭包/Block应该是当前类的属性,我们经常对Block进行copy,copy到堆中,以便后用。 单方向引用是不会产生循环引用。需要self引用闭包/Block,Block中使用self。 有两个规则: 如果你是通过引用来访问一个实例变量,那么将强引用至self。 如果你是通过值来访问一个实例变量,那么将直接强引用至这个“值”变量。 Object-C Block循环引用情况 一般来说我们总会在设置Block之后,在合适的时间
用户1941540
2018/05/11
7980
面试题:Spring 的循环依赖问题
# [Spring 的循环依赖问题](https://www.cnblogs.com/mghio/p/15024461.html)
程序员黄小斜
2021/12/06
5330
循环依赖 之 手写代码模拟spring循环依赖
如上图: A依赖了B, B同时依赖了A和C , C依赖了A. 这也是循环依赖. , 形成了一个闭环
用户5546570
2020/11/12
7960
循环依赖 之 手写代码模拟spring循环依赖

相似问题

循环依赖关系-结构和函数指针相互引用

211

Django模型相互引用

15

C++类相互依赖,导致循环依赖错误

45

相互使用的类的循环引用问题

38

具有相互引用/循环依赖的类的复制构造函数

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文