有佬搞过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());
这里最后一行有的时候报坐标无效 有的时候可以计算成功
有劳指点一下
我注意到你在发送端使用了坐标形式的公钥,并将其转换为十六进制字符串。然后,在接收端使用相应方法进行解析。
公钥坐标问题:确保发送端在生成临时密钥对后,正确地将公钥的坐标x和y传输给接收端。在接收端使用这两个坐标进行公钥重建时,需要确保坐标的正确性。
解决方法。确保坐标正确性:在发送端生成临时密钥对后,将公钥的坐标x和y正确传输给接收端。确保没有任何数据损坏或意外修改。
坐标编码格式问题:对于secp256r1曲线(也称为P-256曲线),公钥的坐标一般是以压缩或非压缩的格式表示的。压缩格式以0x02或0x03开头,而非压缩格式以0x04开头。请确保在发送端将坐标编码为正确的格式,并在接收端进行相应的解码操作。
解决方法。检查坐标编码格式:对于secp256r1曲线,公钥的坐标通常以压缩或非压缩格式表示。请确保在发送端将坐标正确地编码为所需的格式,并在接收端进行相应的解码操作。
坐标解析问题:在接收端,确保正确地将十六进制字符串解析为坐标形式的公钥。可以使用相关的工具或库来实现这个解析过程。
解决方法。使用正确的坐标解析方法:在接收端,使用正确的方法将十六进制字符串解析为坐标形式的公钥。使用Bouncy Castle库提供的方法ECPoint ecPoint = curve.decodePoint(publicKeyBytes);来解析公钥。
密钥协商算法问题:确保发送端和接收端使用相同的密钥协商算法。在你的代码中,使用的是ECDH算法,这是一种基于椭圆曲线Diffie-Hellman(ECDH)的密钥协商协议。确认发送端和接收端都初始化并使用相同的ECDH算法进行密钥协商。
解决方法。检查密钥协商算法一致性:确保发送端和接收端都初始化并使用相同的密钥协商算法(如ECDH)进行密钥协商。验证发送端和接收端是否使用了相同的算法和参数。