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

新手上路,请多包涵
    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());
     

这里最后生成密码有的时候报坐标无效 有的时候可以计算成功
下面是样例图片
图片.png
图片.png

阅读 3k
1 个回答
✓ 已被采纳新手上路,请多包涵

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

推荐问题