如何解决为什么 HMAC_SHA512 的结果可能不同
我现在正在为 IOS 创建加密高清钱包,我需要使用 HMAC_sha512 函数从种子生成主密钥。我正在使用 OpenSSL
库和 HMAC
函数。问题是它的结果与我检查它的网站不同。有什么问题?
我正在 https://iancoleman.io/bip39/ 网站上查看结果。
如果我把我的测试种子粘贴到那里:
04566640a205e779975193a404cdfb0829daabf256ea70198cd060eb4a4043766a24a62233e6d2ae907d3767256c9f9171f8be0d993af15848cfabf2fcade1c8
我得到 BIP32 根密钥:
xprv9s21ZrQH143K48Uym5n1kBFYhzBvvNscsmEvRbMUiHEthfzc9s8VC2Be19oRq8Y49cExD6pqMujrfuztq3SiR8YGfpjnkKJcFLtgqA7RdpE
xprv9s21ZrQH143K4LPo1zX7NJaie2BnqR13Z1bJJDxV1MBHQnwNzrK42DQGiN2AX8YLi5QJ4ssSYf1KaNiFz1iZrEyupr2RPqyZ2Xx9C9zbr6u
我不明白为什么,谁能帮帮我。我的代码如下。
var seed = "04566640a205e779975193a404cdfb0829daabf256ea70198cd060eb4a4043766a24a62233e6d2ae907d3767256c9f9171f8be0d993af15848cfabf2fcade1c8"
func generateMasterKeys() {
var result = [UInt8](repeating: 0,count: 64)
let btcSeed = "Bitcoin seed".uInt8Array()
let seedBytes = seed.uInt8Array()
HMAC(EVP_sha512(),btcSeed,Int32(btcSeed.count),seedBytes,seed.count,&result,nil)
print("HMAC_512 result in HEX: \(Data(result).hexEncodedString())")
// f968ebeccfd01491dfe3f84972228f3e2df2adeb3a47d5f3362eecbcaf794b1ee4a79b404a5fa2891157321141d887f5ac906587507e7cb1a6b4164ffaa9c081
masterPrivateKey = Data(result[0..<32]).hexEncodedString()
masterChainCode = Data(result[32...]).hexEncodedString()
print("Master private key: \(masterPrivateKey)")
print("Master Chain code: \(masterChainCode)")
// Master private key: f968ebeccfd01491dfe3f84972228f3e2df2adeb3a47d5f3362eecbcaf794b1e
// Master Chain code: e4a79b404a5fa2891157321141d887f5ac906587507e7cb1a6b4164ffaa9c081
base58check2(chainCode: masterChainCode,privateKey: masterPrivateKey)
}
func base58check2(chainCode: String,privateKey: String) {
let networkType = "0488ADE4"
let depth = "00"
let parentFingerprint = "00000000"
let keyIndex = "00000000"
var hexToSerialize = networkType + depth + parentFingerprint + keyIndex + chainCode + "00" + privateKey
let doubleSHA = SHA256.hash(data: hexToSerialize.hexaBytes).withUnsafeBytes { data2 in
return SHA256.hash(data: data2)
}
hexToSerialize = hexToSerialize + doubleSHA.hexStr.prefix(8)
print("hex to serialize: \(hexToSerialize)")
// 0488ADE4000000000000000000e4a79b404a5fa2891157321141d887f5ac906587507e7cb1a6b4164ffaa9c08100f968ebeccfd01491dfe3f84972228f3e2df2adeb3a47d5f3362eecbcaf794b1e22CA73DA
let result = base58.base58Encode(hexToSerialize.hexaToBytes)
print("----==== ROOT KEY ====----")
print(result) // xprv9s21ZrQH143K4LPo1zX7NJaie2BnqR13Z1bJJDxV1MBHQnwNzrK42DQGiN2AX8YLi5QJ4ssSYf1KaNiFz1iZrEyupr2RPqyZ2Xx9C9zbr6u
// I need to get this:
// xprv9s21ZrQH143K48Uym5n1kBFYhzBvvNscsmEvRbMUiHEthfzc9s8VC2Be19oRq8Y49cExD6pqMujrfuztq3SiR8YGfpjnkKJcFLtgqA7RdpE
// But I get this:
// xprv9s21ZrQH143K4LPo1zX7NJaie2BnqR13Z1bJJDxV1MBHQnwNzrK42DQGiN2AX8YLi5QJ4ssSYf1KaNiFz1iZrEyupr2RPqyZ2Xx9C9zbr6u
}
如果我使用生成的根种子并使用 base58 对其进行解码,我会发现主密钥和私钥与我的完全不同。
let decoded = base58.base58Decode("xprv9s21ZrQH143K48Uym5n1kBFYhzBvvNscsmEvRbMUiHEthfzc9s8VC2Be19oRq8Y49cExD6pqMujrfuztq3SiR8YGfpjnkKJcFLtgqA7RdpE")!
let decodedData = Data(decoded).hexEncodedString()
print(decodedData) // 0488ade4000000000000000000d0074c1b7d5116fd851935a424f6624e288b50ce3df5ef53ca4d4a182347c9c400ff361fbd7249a379f04bc97990924148dc07ebcdbdc86eddcd97b9a6d36ee2bd9fea8f03
// 0488ade4 - network type the same
// 00 - depth the same
// 00000000 - parent fingerprint the same
// 00000000 - key index the same
// d0074c1b7d5116fd851935a424f6624e288b50ce3df5ef53ca4d4a182347c9c4 - different private key
// 00
// ff361fbd7249a379f04bc97990924148dc07ebcdbdc86eddcd97b9a6d36ee2bd - different chain code
// 9fea8f03 - thus different checksum
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。