微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 HMAC_SHA512 的结果可能不同

如何解决为什么 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 举报,一经查实,本站将立刻删除。