secp256r1 c语言程序,区块链中的数学-secp256k1点压缩和公钥恢复原理

本节主要讲了secp256k1的参数,点表示形式和由签名试图恢复公钥的原理

## 写在前面

上一节讲了[Schnorr离散对数签名及素数阶群构造(Schnorr群)](https://learnblockchain.cn/article/1527),相对于结合椭圆曲线的算法,更简洁,更易理解。

之前有不少篇幅讲有限域上椭圆曲线的概念和运算规则【群,加解密,签名验签等】。

本节我们讲下特定的椭圆曲线上的有意思的一个知识点:公钥恢复。椭圆曲线算法常用的有几种实例,本节重点关注区块链领域应用最广的secp256k1曲线。

## secp256k1

secp256k1 是区块链项目中应用最多的椭圆曲线算法,源于比特币中的应用,后来的大多数区块链项目如以太坊等都在用。

名称中的前三个字母sec代表Standards for Efficient Cryptography (SEC)

后面的p256K1指的是参数256位素数域。

定义一条具体有限域上的椭圆曲线,有一些选择的参数。下面看一下secp256k1曲线的参数:

```

p = FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFC2F

a=0000000000000000000000000000000000000000000000000000000000000000

b=0000000000000000000000000000000000000000000000000000000000000007

G=79BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798

483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8

n=FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141

h = 01

```

以上参数是十六进制的表示形式。理解以上参数的含义,我们再来回顾下secp256k1曲线方程:

$y^2 \equiv x^3+ax +b\ (mod\ p)$

方程中a,b, p就是参数,p的值怎么来的?就是下式的计算结果

$ 2^{256}-2^{32}-2^{9}-2^{8}-2^{7}-2^{6}-2^{4}-1$

参数G 是椭圆曲线点群中的生成元,是选定的一个点,上面给出的值是**非压缩格式**。

n是以G为生成元群的阶。【这些基本概念,参考之前二,三,四等文章】

还有一个协因子&

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Java使用secp256k1签名并恢复公钥,你可以使用Bouncy Castle库。以下是一个示例代码: ```java import org.bouncycastle.crypto.digests.SHA256Digest; import org.bouncycastle.crypto.params.ECDomainParameters; import org.bouncycastle.crypto.params.ECPrivateKeyParameters; import org.bouncycastle.crypto.params.ECPublicKeyParameters; import org.bouncycastle.crypto.signers.ECDSASigner; import org.bouncycastle.math.ec.ECPoint; import org.bouncycastle.util.encoders.Hex; import java.math.BigInteger; import java.security.SecureRandom; public class ECDSAExample { public static void main(String[] args) { // Generate a random private key SecureRandom random = new SecureRandom(); BigInteger privateKey = new BigInteger(256, random); // Define the secp256k1 curve parameters ECDomainParameters curve = ECNamedCurveTable.getByName("secp256k1"); // Create an EC private key object ECPrivateKeyParameters privateKeyParams = new ECPrivateKeyParameters(privateKey, curve); // Create an EC signer object ECDSASigner signer = new ECDSASigner(new HMacDSAKCalculator(new SHA256Digest())); // Initialize the signer with the private key signer.init(true, privateKeyParams); // Generate a random message to sign byte[] message = "Hello, world!".getBytes(); // Calculate the signature BigInteger[] signature = signer.generateSignature(message); // Print the signature System.out.println("Signature: " + Hex.toHexString(signature[0].toByteArray()) + Hex.toHexString(signature[1].toByteArray())); // Recover the public key from the signature ECPoint publicKey = signer.getPublicKey(); // Create an EC public key object ECPublicKeyParameters publicKeyParams = new ECPublicKeyParameters(publicKey, curve); // Verify the signature using the recovered public key signer.init(false, publicKeyParams); boolean valid = signer.verifySignature(message, signature[0], signature[1]); System.out.println("Valid signature? " + valid); } } ``` 这个示例代码使用Bouncy Castle库生成一个随机的私钥,使用secp256k1曲线参数创建一个EC私钥对象,并使用ECDSASigner进行签名和验证。签名后,公钥从签名恢复,并用于验证签名。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值