Web3专题(四) keccak256背后的故事(一个小八卦)

本文是对钱包原理这个部分的一个简单补充

本文是对钱包原理这个部分的一个简单补充,在此,列出相关文章:

Web3专题(一) 助记词和生成私钥、公钥、地址的基本原理 Web3专题(二) 2 种钱包之非确定性钱包(keystore 管理私钥) Web3专题(三) 2 种钱包之分层确定性钱包(HD Wallet,BIP32,BIP39,BIP44)

众所周知,keccak256是密码学的一种哈希函数,在以太坊中,用于将任何消息进行哈希返回 256 位的哈希值,即长度为 64 个十六进制字符的字符串。比如我在Web3 专题(一) 中讲的,可以将公钥哈希之后得到地址。

那么,keccak256背后有着什么样的故事呢?

早在 2007 年,为了确定 SHA-2 标准的后继者,美国国家标准与技术研究所(NIST)组织的 SHA-3 竞赛开始了,Keccak 算法是其中的一个竞争者,并赢得了 SHA-3 竞赛,最终在 2015 年被标准化为 FIPS(联邦信息处理标准)202 SHA-3。

keccak256是 Keccak 算法的一个特定实例。以太坊在创建智能合约时,采用了最初的 Keccak 算法,当时 Keccak 算法还没有被标准化,因此,为了保证一致性和兼容性,在 Keccak 算法标准化后,没有进行更改。 结果就是 以太坊使用的 keccak256 算法 和 标准的 FIPS-202 SHA-3 算法 不一样。

如何判断你使用的keccak256是哪一个呢?

一个简单的方法是用空字符串("")作为输入,运行哈希函数,根据结果判断。
以太坊使用的是:Keccak256("") = c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470
标准化完成的是:SHA3("") = a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a

下面是一个代码示例

// 引入需要的包
import (
    "github.com/ethereum/go-ethereum/common"
    "github.com/ethereum/go-ethereum/crypto"
    "golang.org/x/crypto/sha3"
)

// ...

// 以太坊使用的`keccak256`
b := crypto.Keccak256([]byte(""))
s := common.BytesToHash(b).Hex()
s = strings.TrimPrefix(s, "0x")
fmt.Println(s)
fmt.Println(s == "c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470")

// 标准化的`keccak算法`,即sha3
dig := sha3.Sum256([]byte(""))
fmt.Println(hex.EncodeToString(dig[:]))
fmt.Println(hex.EncodeToString(dig[:]) == "a7ffc6f8bf1ed76651c14756a061d662f580ff4de43b49fa82d80a4b80f8434a")
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
认知那些事
认知那些事
0x2b62...95a0
人立于天地之间,必然有我们的出路。