本文介绍了比特币密钥的不同类型,重点解释了以“6P”开头的密钥是使用BIP38标准加密的私钥。BIP38使用AES加密算法和scrypt密钥推导函数来保护私钥,通过口令加密私钥,增加了密钥的安全性,使得暴力破解的难度大大增加。
对我来说,比特币是有史以来最漂亮的计算基础设施之一。 当然,它在工作量证明 (PoW) 方面存在问题,但底层的加密机制运行得非常好 —— 并汇集了数十年在加密方法方面的研究工作。 为此,地球上的任何人都能够创建他们自己的数字钱包。 这些钱包有以 “bc1q”、“bc1p”、“1” 或 “3” 开头的标识符 [ 这里]:
我们拥有的地址是:
但是,如果它以 “6P” 开头呢?
嗯,答案是,我们有一个使用 BIP38 加密的私钥。 通过 BIP38 加密,我们使用强大的加密算法 (AES) 和慢速密钥派生函数 (scrypt) 来保护私钥。 这涉及到密码短语的使用,该密码短语可用于加密私钥,然后用于解密私钥。
对于比特币,我们为私钥创建一个 256 位随机数,然后将其转换为钱包交换格式密钥 (WiF) 格式,这是随机密钥的 Base-58 格式。 这是存储在比特币钱包中的格式。 例如,一个私钥的示例是:
Private key: 5c04990cf2fb95ca8749d4021100ee98b0744e81a5ec00a2177aeaf4b29c00d3
然后,我们将其转换为 WiF 格式 (Base-58) 以给出:
5JWp4FM7sfAAE88DW3yvGF5mQyrsEXeWzXZn79bg61Vg8YMfJjA
这可以存储在比特币钱包中。 接下来,我们可以获取私钥和哈希值,并将其转换为可用的比特币地址,例如:
1A3CohNBuB6kFAMtp3KFEYwv3Eu58F2HyN
密钥的格式定义如下,我们创建一个 256 位私钥并将其转换为 WiF 私钥。 接下来,我们生成一个 512 位公钥,然后获取一个 160 位 RIPEM-160 哈希并转换为比特币地址:
为了加密我们的私钥,我们然后获取私钥 (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 助手,为大家转译优秀英文文章,如有翻译不通的地方,还请包涵~
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!