惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
N
Netflix TechBlog - Medium
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
V
V2EX
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
Blog — PlanetScale
Blog — PlanetScale
Microsoft Security Blog
Microsoft Security Blog
D
Docker
WordPress大学
WordPress大学
罗磊的独立博客
J
Java Code Geeks
博客园 - 【当耐特】
博客园 - 司徒正美
雷峰网
雷峰网
H
Help Net Security
酷 壳 – CoolShell
酷 壳 – CoolShell
Last Week in AI
Last Week in AI
宝玉的分享
宝玉的分享
Martin Fowler
Martin Fowler
T
Tailwind CSS Blog
Google DeepMind News
Google DeepMind News
M
MIT News - Artificial intelligence
Recent Announcements
Recent Announcements
B
Blog

smallyu的博客

为什么买的加密货币一定要去中心化 RISC-V 虚拟机无法代替 EVM 虚拟机 Polkadot 的 Existential Deposit 机制错在哪里 利息,套利,交易策略,金融市场 LayerZero 从来不挑战比特币的地位 默认参数引起的以太坊节点运行错误 硬件钱包与资产安全 预测市场比币圈更赌场 为什么去中心化的跨链桥不可能实现 我对于 AI 时代的答案 不要投资任何隐私币 区块链技术世界的三大真理 以太坊 AA 钱包的致命问题是什么 基于 AI 语义执行的 MCP 区块链的设计 一个集成 Geth 和 CometBFT 的兼容层 我的加密货币定投策略(二) DeFi 基础: 理解 AMM 定价机制 Go 语言 GMP 调度器的原理是什么 Web3 项目分析计划 对 Psyche Network 项目的分析 continuation 教程: 理解 CPS 如何开发一个比特币符文(Runes)协议 比特币脚本开发教程 我从王垠的计算机科学视频班学到了什么 区块链技术面试题(2025年版) Rust 语言容易让新手困惑的一个“过度优化” Solana 智能合约开发教程 (1) 尝试开发一个最小 EVM 虚拟机 基于 ZK 的链上身份系统设计 一个 Web3 打赏系统的设计
为什么以太坊的私钥计算不可逆
2023-02-20 · via smallyu的博客

为什么以太坊的私钥计算不可逆

2023-02-20

你有没有过好奇,为什么以太坊的私钥无法从账户地址逆推算出来?当你拥有一个私钥,想要得到这个私钥对应的账户地址,你可以在 MetaMask 里导入这个账户,或者使用 ether.js 这样的 SDK 在代码层面导入一个账户到钱包,然后打印出账户的地址。这个导入账户的过程有没有黑箱操作?

我前几天无意中在 Medium 上看到一片文章,作者用很简洁的代码写出了从私钥到地址的计算过程,作者的代码在这里 RareSkills/generate-ethereum-address-lower-level.py

我把代码复制过来:

from ecpy.curves import Curve
from sha3 import keccak_256

private_key = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80

cv     = Curve.get_curve('secp256k1')
pu_key = private_key * cv.generator # just multiplying the private key by generator point (EC multiplication)

concat_x_y = pu_key.x.to_bytes(32, byteorder='big') + pu_key.y.to_bytes(32, byteorder='big')
eth_addr = '0x' + keccak_256(concat_x_y).digest()[-20:].hex()

print('private key: ', hex(private_key))
print('eth_address: ', eth_addr)

这段代码只有四五行,计算的关键有两个地方,private_key * cv.generatorkeccak_256(concat_x_y)。除了这两个地方,其他的部分都是常量计算,乍一看挺复杂,仔细看看拆解一下,都是很简单的字符串拼接。

其中,private_key * cv.generator 是椭圆曲线的计算,上看定义的私钥 private_key 是一个 16 进制的数字,注意是 int 类型,然后用椭圆曲线的生成器去计算出一个值。这个计算过程是不可逆的,就是在椭圆曲线上绕圈那个过程,可以类比理解为,一个数字取余之后,你无法还原出取余之前的数字。椭圆曲线只是用更复杂的方式,提供了比 RSA 更加安全的计算结果。

第二个不可逆的计算是 keccak_256(concat_x_y),这是一个计算哈希值的过程,keccak 是 sha3 的一种。摘要算法不可逆,这也是毫无疑问的事情。

也就是说,从私钥到地址的计算过程,有两处是不可逆的,所以整体上,无法从以太坊的账户地址,逆推计算出私钥。