一文了解比特币地址生成使用的椭圆曲线算法

基本概念:

比特币的私钥和公钥生成使用的是椭圆曲线数字签名算法(ECDSA) ,具体基于 secp256k1 椭圆曲线。

算法概述:

ECDSA(Elliptic Curve Digital Signature Algorithm)

ECDSA 是一种基于椭圆曲线的公钥加密算法,用于生成密钥对(私钥和公钥)以及进行数字签名。比特币选择 ECDSA 是因为它在较短的密钥长度下提供高安全性,计算效率也较高。

secp256k1 曲线

比特币使用的具体椭圆曲线是 secp256k1,由 NIST(美国国家标准与技术研究院)定义。这条曲线具有以下特点:

  • 方程:y² = x³ + 7(在有限域 GF(p) 上,其中 p 是一个大素数)。
  • 提供 256 位密钥长度,安全性相当于 128 位对称加密。
  • 相比其他曲线(如 secp256r1),secp256k1 的参数更高效且专为加密货币设计。

私钥和公钥生成过程

私钥生成:

定义:私钥是一个随机的 256 位数字(32 字节)。

生成方法

  • 使用加密安全的随机数生成器(CSPRNG)生成一个 256 位随机数。
  • 确保该数字在 secp256k1 曲线的阶(order)范围内,即 1 ≤ 私钥 < n,其中 n 是曲线的阶(一个大素数,约为 2²⁵⁶)。

格式

  • 私钥通常以原始的 32 字节二进制形式存储。
  • 为方便使用,私钥可能被编码为 WIF(Wallet Import Format) ,如 Base58Check 编码,添加前缀和校验和(例如:5J... 或 K...)。

公钥生成

定义:公钥是从私钥通过椭圆曲线运算生成的点 (x, y),位于 secp256k1 曲线上。

生成方法

  • 使用 secp256k1 曲线的基点(generator point)G。
  • 私钥(一个标量)与基点 G 进行椭圆曲线点乘 运算:
    公钥 = 私钥 × G
  • 点乘运算基于椭圆曲线的数学性质,生成一个新的点 (x, y),即公钥。

格式

  • 未压缩公钥 :由前缀 0x04 加上 32 字节的 x 坐标和 32 字节的 y 坐标组成,共 65 字节。
    例:0x04 + x + y
  • 压缩公钥 :仅包含 x 坐标(32 字节)加上一个前缀(0x02 或 0x03,表示 y 的奇偶性),共 33 字节。
    例:0x02 + x(如果 y 是偶数)或 0x03 + x(如果 y 是奇数)。
  • 比特币地址通常基于压缩公钥生成(更节省空间)。

从公钥生成比特币地址(简要说明)

虽然问题聚焦于私钥和公钥生成,但地址生成与公钥相关,简单概述:

  • 对公钥(通常是压缩格式)进行 SHA-256 哈希。
  • 对 SHA-256 结果进行 RIPEMD-160 哈希,得到 20 字节的哈希值。
  • 添加网络前缀(如主网为 0x00)和校验和,编码为 Base58Check 格式,生成比特币地址(如 1A1zP1...)。
  • 现代比特币地址可能使用 Bech32 格式(SegWit 地址,如 bc1...),基于不同的编码规则。

算法细节

椭圆曲线运算

  • 点加法:将曲线上的两个点相加,得到一个新点。
  • 点倍增:将一个点重复加自身,相当于标量乘法。
  • 比特币的公钥生成依赖于标量乘法(私钥 × 基点 G),这是一个单向函数,难以通过公钥反推私钥。

安全性

  • ECDSA 的安全性依赖于离散对数问题的难度,即给定公钥和基点 G,计算私钥在计算上是不可行的。
  • secp256k1 的参数经过优化,确保没有已知的数学漏洞。

随机数生成

  • 私钥的随机性至关重要。如果随机数生成器不安全,可能导致私钥被破解(如 2013 年 Android 钱包的随机数漏洞)。
  • 比特币软件通常使用操作系统提供的加密安全随机数生成器(如 /dev/urandom 或 Windows 的 CryptGenRandom)。

代码示例(伪代码)

以下是生成比特币私钥和公钥的简化伪代码(基于 secp256k1):

python 复制代码
from ecdsa import SigningKey, SECP256k1
import os

# 生成私钥
private_key = os.urandom(32)  # 随机 32 字节
signing_key = SigningKey.from_string(private_key, curve=SECP256k1)

# 生成公钥
verifying_key = signing_key.get_verifying_key()
public_key = verifying_key.to_string("compressed")  # 压缩格式,33 字节

print("私钥(HEX):", private_key.hex())
print("公钥(HEX):", public_key.hex())

总结:

  • 算法 :比特币私钥和公钥生成使用 ECDSA ,基于 secp256k1 椭圆曲线。
  • 私钥:随机 256 位数字,使用加密安全的随机数生成器生成。
  • 公钥:通过私钥与 secp256k1 基点 G 的椭圆曲线点乘运算生成,可为压缩(33 字节)或未压缩(65 字节)格式。
  • 安全性:依赖椭圆曲线离散对数问题的计算难度和随机数生成的质量。
相关推荐
我是前端小学生1 个月前
如何理解比特币交易中一个典型的结构:1输入2输出
比特币
搬砖魁首3 个月前
BTC系列 - 启示录
区块链·比特币·btc
区块链文博4 个月前
比特币国家与企业机构“战略储备”潮起
大数据·人工智能·web3·区块链·比特币
Daniel_1876 个月前
区块链技术与应用-PKU 学习笔记
区块链·以太坊·比特币
编程老船长6 个月前
第4章 揭秘区块链:从创世区块到链式结构
算法·区块链·比特币
我是前端小学生7 个月前
手把手教你实现HD钱包助记词生成算法
比特币
Mindfulness code7 个月前
比特币详解
区块链·比特币
Z3r4y9 个月前
【区块链】浅谈面向小白的关于BlockChain那些事
区块链·智能合约·it·以太坊·比特币
我想学LINUX9 个月前
【常见开源库的二次开发】基于openssl的加密与解密——SHA算法源码解析(六)
算法·开源·openssl·比特币·sha-1·sha-2·比特币挖矿