图解ECDSA签名与验签基本原理

本文介绍了ECDSA算法的基本原理,包括如何生成椭圆曲线参数,如何生成和验证签名,以及在比特币中使用的secp256k1曲线。通过详细步骤解释了签名生成和验证过程,帮助理解区块链中的数字签名机制。
摘要由CSDN通过智能技术生成

本文首发公众号VenusBlockChain,关注公众号后可免费阅读!VenusBlockChain致力于区块链技术研究,传播区块链技术和解决方案、区块链应用落地、区块链行业动态等。
在这里插入图片描述

1 ECDSA算法

首先,需要设置参数 ( a , b , p , N , G ) (a,b,p,N,G) (a,b,p,N,G)来初始化一椭圆曲线,椭圆曲线方程 y 2 = ( x 3 + a x + b ) m o d p y^2=(x^3+ax+b)modp y2=(x3+ax+b)modp p p p是模运算的底, N N N是曲线上面点的个数, G G G是曲线上所有点的生成元,也就是一个参考的基点,也可以是曲线上面的任意一点。

然后,生成公钥 p k pk pk和私钥 s k sk sk s k sk sk是一个随机数,且 s k ∈ Z n ∗ , d < n sk\in Z_n^\ast,d < n skZnd<n,公钥 p k = G ∗ s k pk=G*{sk} pk=Gsk

目前,比特币中的ECDSA签名算法使用的椭圆曲线是secp256k1,其中素数 p = 2 256 − 2 32 − 977 p=2^{256}-2^{32}-977 p=2256232

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ECDSA(Elliptic Curve Digital Signature Algorithm)是一种基于椭圆曲线密码学的数字签名算法。OpenSSL库提供了ECDSA签名和验的函数。 ECDSA签名: 1. 生成ECDSA密钥对: ``` EC_KEY *key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); EC_KEY_generate_key(key); ``` 2. 计算消息的哈希值: ``` unsigned char *msg = "Hello World"; unsigned char digest[SHA256_DIGEST_LENGTH]; SHA256(msg, strlen(msg), digest); ``` 3. 对消息哈希值进行签名: ``` unsigned char *signature; unsigned int signature_len; signature = (unsigned char *)malloc(ECDSA_size(key)); ECDSA_sign(0, digest, SHA256_DIGEST_LENGTH, signature, &signature_len, key); ``` 4. 将签名结果进行编码: ``` unsigned char *encoded_signature; unsigned int encoded_signature_len; encoded_signature = (unsigned char *)malloc(signature_len * 2 + 1); ECDSA_signature_encode(ECDSA_SIG_new(), signature, signature_len, encoded_signature, &encoded_signature_len); ``` ECDSA: 1. 解码签名结果: ``` ECDSA_SIG *ecdsa_sig = ECDSA_SIG_new(); unsigned char *encoded_signature = "304402202a24c7d48f6a..."; // 签名结果 unsigned int encoded_signature_len = strlen(encoded_signature); ECDSA_signature_decode(ecdsa_sig, encoded_signature, encoded_signature_len); ``` 2. 计算消息的哈希值: ``` unsigned char *msg = "Hello World"; unsigned char digest[SHA256_DIGEST_LENGTH]; SHA256(msg, strlen(msg), digest); ``` 3. 进行验: ``` int result = ECDSA_do_verify(digest, SHA256_DIGEST_LENGTH, ecdsa_sig, key); if (result == 1) { printf("Signature verified successfully.\n"); } else if (result == 0) { printf("Signature verification failed.\n"); } else { printf("Error occurred during signature verification.\n"); } ``` 完整的示例代码: ``` #include <openssl/ec.h> #include <openssl/ecdsa.h> #include <openssl/obj_mac.h> #include <openssl/sha.h> int main() { EC_KEY *key = EC_KEY_new_by_curve_name(NID_X9_62_prime256v1); // 选择椭圆曲线 EC_KEY_generate_key(key); // 生成密钥对 // 签名 unsigned char *msg = "Hello World"; unsigned char digest[SHA256_DIGEST_LENGTH]; SHA256(msg, strlen(msg), digest); // 计算哈希值 unsigned char *signature; unsigned int signature_len; signature = (unsigned char *)malloc(ECDSA_size(key)); ECDSA_sign(0, digest, SHA256_DIGEST_LENGTH, signature, &signature_len, key); // 进行签名 unsigned char *encoded_signature; unsigned int encoded_signature_len; encoded_signature = (unsigned char *)malloc(signature_len * 2 + 1); ECDSA_signature_encode(ECDSA_SIG_new(), signature, signature_len, encoded_signature, &encoded_signature_len); // 编码签名结果 // 验 ECDSA_SIG *ecdsa_sig = ECDSA_SIG_new(); ECDSA_signature_decode(ecdsa_sig, encoded_signature, encoded_signature_len); // 解码签名结果 int result = ECDSA_do_verify(digest, SHA256_DIGEST_LENGTH, ecdsa_sig, key); // 进行验 if (result == 1) { printf("Signature verified successfully.\n"); } else if (result == 0) { printf("Signature verification failed.\n"); } else { printf("Error occurred during signature verification.\n"); } ECDSA_SIG_free(ecdsa_sig); EC_KEY_free(key); free(signature); free(encoded_signature); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值