如果一个比特币密钥以“6P”开头,它是什么类型的密钥?

本文介绍了比特币密钥的不同类型,重点解释了以“6P”开头的密钥是使用BIP38标准加密的私钥。BIP38使用AES加密算法和scrypt密钥推导函数来保护私钥,通过口令加密私钥,增加了密钥的安全性,使得暴力破解的难度大大增加。

如果一个比特币密钥以 “6P” 开头,它是什么类型的密钥?

对我来说,比特币是有史以来最漂亮的计算基础设施之一。 当然,它在工作量证明 (PoW) 方面存在问题,但底层的加密机制运行得非常好 —— 并汇集了数十年在加密方法方面的研究工作。 为此,地球上的任何人都能够创建他们自己的数字钱包。 这些钱包有以 “bc1q”、“bc1p”、“1” 或 “3” 开头的标识符 [ 这里]:

我们拥有的地址是:

  • Legacy (P2PKH) 地址以数字 1 开头,例如 1 AR9sWV7ZR2C2ohGSDDKXipCfZ3RLGynHM [ 这里]。
  • Nested SegWit (P2SH) 地址以数字 3 开头,例如 3 GrgsgrLp1PZngQU4QDoxpnRQ5SrH8WXjX [ 这里]。
  • Native Native SegWit (Bech32) 地址以 bc1q 开头,例如:bc1q vf3ywexg0q5a3frzv7z2z6adpk0zsryvjnxf5u [ 这里]。
  • Tarpool 地址 以 bcqp 开头,例如 bc1p wyzhgwy30q2juhau2f2c4qscasddle5ymw9m7scq5kc62t8kyzkqyz059k [ 这里]。 这些是最新的地址,专注于增强隐私。

但是,如果它以 “6P” 开头呢?

嗯,答案是,我们有一个使用 BIP38 加密的私钥。 通过 BIP38 加密,我们使用强大的加密算法 (AES) 和慢速密钥派生函数 (scrypt) 来保护私钥。 这涉及到密码短语的使用,该密码短语可用于加密私钥,然后用于解密私钥。

对于比特币,我们为私钥创建一个 256 位随机数,然后将其转换为钱包交换格式密钥 (WiF) 格式,这是随机密钥的 Base-58 格式。 这是存储在比特币钱包中的格式。 例如,一个私钥的示例是:

Private key: 5c04990cf2fb95ca8749d4021100ee98b0744e81a5ec00a2177aeaf4b29c00d3

然后,我们将其转换为 WiF 格式 (Base-58) 以给出:

5JWp4FM7sfAAE88DW3yvGF5mQyrsEXeWzXZn79bg61Vg8YMfJjA

这可以存储在比特币钱包中。 接下来,我们可以获取私钥和哈希值,并将其转换为可用的比特币地址,例如:

1A3CohNBuB6kFAMtp3KFEYwv3Eu58F2HyN

密钥的格式定义如下,我们创建一个 256 位私钥并将其转换为 WiF 私钥。 接下来,我们生成一个 512 位公钥,然后获取一个 160 位 RIPEM-160 哈希并转换为比特币地址:

BIP 38

为了加密我们的私钥,我们然后获取私钥 (bitcoinprivkey),然后生成四个随机字节(32 位),并将它们定义为 salt 值 (salt)。 接下来,我们使用 scrypt (n=16384, r=8, p=8, length=32) 从密码短语中派生 AES 加密密钥 (passfactor)。 总的来说,生成此密钥将花费超过一秒钟的时间。 如果有人试图对加密密钥进行暴力破解或字典攻击,那么将花费大量的能量和计算资源才有机会发现密钥。 事实上,对于一个八个字符的密码短语,尝试所有暴力破解的组合将花费大约 1,695,196 百万年的时间(假设生成一个密钥大约需要 1 秒)。

然后,我们将加密过程分为两部分:

Do AES256Encrypt(block = bitcoinprivkey[0...15] xor derivedhalf1[0...15],
     key = derivedhalf2), call the 16-byte result encryptedhalf1
Do AES256Encrypt(block = bitcoinprivkey[16...31] xor derivedhalf1[16...31],
     key = derivedhalf2), call the 16-byte result encryptedhalf2

然后我们创建以下格式:

0x01 0x42 + flagbyte + salt + encryptedhalf1 + encryptedhalf2

原始加密流的示例是:

0142e0ffcd3ac1df4f82cee80340137083b9cac86c565e1c77e2afaf6465ce2d3d498bdcf4fa68e88ddd0c

请注意,前两个字节是 0142。如果现在转换为 Base58,我们会得到:

> bx base58-encode 0142e0ffcd3ac1df4f82cee80340137083b9cac86c565e1c77e2afaf6465ce2d3d498bdcf4fa68e88ddd0c
6PYXfWjcZLzARkZsZMNEQKzRwFpyJdotEweCRfhWMaJTTHsfqban5SftAP

因此,加密密钥是 “6PYXfWjcZLzARkZsZMNEQKzRwFpyJdotEweCRfhWMaJTTHsfqban5SftAP”。 总的来说,我们的加密密钥将始终以 “6P” 开头,因为 0x01 和 0x42 的起始值。

编码

在这种情况下,我们将使用 PowerShell 并调用 BX 程序 [这里]。 以下定义了编码 [ 这里]:

$pwd='Qwerty123'

$pwd =  $Args[0]
"Pass phrase: ",$pwd # 口令短语
$seed = bx seed
"`nSeed: ",$seed # 种子

$pri = bx ec-new $seed
"`nEC private key: ",$pri # EC 私钥
$wif = bx ec-to-wif $pri
"`nWif: ",$wif # Wif
$pub = bx ec-to-public $pri
"`nPublic key: ",$pub # 公钥

$enc =bx ec-to-ek $pwd $pri
"`nEncrypted: ",$enc # 加密的
$dec =bx ek-to-ec  $pwd $enc
"`nDencrypted (private key): ",$dec # 解密的(私钥)

一个运行示例是 [ 这里]:

Pass phrase:
Qwerty123

Seed:
1e8c56fa82dfb2f44fc3e0d9b9a330c80a350739ba5a5b3b

EC private key:
e9447bc2d737517a8594daf6f5a5538e2e8b0264b9c3156d3cb3102e2b809e6a

Wif:
L539o5a9ZWeH4DLXpeBJkpUBek21umCMeMvoDte5M8wfmn4PhVf7

Public key:
0330385b43ed8d6cbca3407a91b7ade8741a6007016a27ba902e8eb9c4d1e67534

Encrypted:
6PYXfWjcZLzARkZsZMNEQKzRwFpyJdotEweCRfhWMaJTTHsfqban5SftAP

Decrypted:
e9447bc2d737517a8594daf6f5a5538e2e8b0264b9c3156d3cb3102e2b809e6a

我们可以看到,解密的密钥与私钥 (“e9447bc2d737517a8594daf6f5a5538e2e8b0264b9c3156d3cb3102e2b809e6a”) 相同。

  • 原文链接: medium.com/asecuritysite...
  • 登链社区 AI 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
点赞 0
收藏 0
分享
本文参与登链社区写作激励计划 ,好文好收益,欢迎正在阅读的你也加入。

0 条评论

请先 登录 后评论
asecuritysite
asecuritysite
江湖只有他的大名,没有他的介绍。