secp256r1椭圆曲线加密问题

有佬搞过secp256r1椭圆曲线加密么?

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());

这里最后一行有的时候报坐标无效 有的时候可以计算成功
有劳指点一下

我注意到你在发送端使用了坐标形式的公钥,并将其转换为十六进制字符串。然后,在接收端使用相应方法进行解析。

  1. 公钥坐标问题:确保发送端在生成临时密钥对后,正确地将公钥的坐标x和y传输给接收端。在接收端使用这两个坐标进行公钥重建时,需要确保坐标的正确性。
    解决方法。确保坐标正确性:在发送端生成临时密钥对后,将公钥的坐标x和y正确传输给接收端。确保没有任何数据损坏或意外修改。

  2. 坐标编码格式问题:对于secp256r1曲线(也称为P-256曲线),公钥的坐标一般是以压缩或非压缩的格式表示的。压缩格式以0x02或0x03开头,而非压缩格式以0x04开头。请确保在发送端将坐标编码为正确的格式,并在接收端进行相应的解码操作。
    解决方法。检查坐标编码格式:对于secp256r1曲线,公钥的坐标通常以压缩或非压缩格式表示。请确保在发送端将坐标正确地编码为所需的格式,并在接收端进行相应的解码操作。

  3. 坐标解析问题:在接收端,确保正确地将十六进制字符串解析为坐标形式的公钥。可以使用相关的工具或库来实现这个解析过程。
    解决方法。使用正确的坐标解析方法:在接收端,使用正确的方法将十六进制字符串解析为坐标形式的公钥。使用Bouncy Castle库提供的方法ECPoint ecPoint = curve.decodePoint(publicKeyBytes);来解析公钥。

  4. 密钥协商算法问题:确保发送端和接收端使用相同的密钥协商算法。在你的代码中,使用的是ECDH算法,这是一种基于椭圆曲线Diffie-Hellman(ECDH)的密钥协商协议。确认发送端和接收端都初始化并使用相同的ECDH算法进行密钥协商。
    解决方法。检查密钥协商算法一致性:确保发送端和接收端都初始化并使用相同的密钥协商算法(如ECDH)进行密钥协商。验证发送端和接收端是否使用了相同的算法和参数。