secp256r1椭圆曲线ECDH密钥协商坐标无效?

作者站长头像
站长
· 阅读数 22
    public static KeyPair gettempKey(){
            Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider());
            // 获取secp256k1曲线参数规格
            ECNamedCurveParameterSpec spec = ECNamedCurveTable.getParameterSpec("secp256r1");
            // 创建密钥对生成器
            KeyPairGenerator generator = KeyPairGenerator.getInstance("EC", "BC");
            generator.initialize(spec);
            // 生成密钥对
            KeyPair keyPair = generator.generateKeyPair();
            return keyPair;
        }

我先用这个生成个密钥对来做接收端的公私钥,然后发送端每次都是生成新的临时密钥对 把公钥以0x04+x+y发过去按坐标解析出公钥再用我接收端的私钥指纹进行ECDH协商计算 如下

            PrivateKey myPrivateKey = getPrivateKeyFromS(myPriHex);
            PublicKey othPublicKey = getPublicKeyFromXY(myPubHex);
            KeyAgreement ecdhA = KeyAgreement.getInstance("ECDH");
            ecdhA.init(myPrivateKey);
            ecdhA.doPhase(othPublicKey, true);
            String commonSecret = HexUtil.encodeHexStr(ecdhA.generateSecret());
     

这里最后生成密码有的时候报坐标无效 有的时候可以计算成功下面是样例图片secp256r1椭圆曲线ECDH密钥协商坐标无效?secp256r1椭圆曲线ECDH密钥协商坐标无效?

回复
1个回答
avatar
test
2024-06-29

getPublicKeyFromXY(String hexStr)方法里坐标生成point的时候转bigInteger没有规定是正号转换,sorry代码没粘全面

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容