本發明涉及信息安全領域,尤其涉及適用于數字貨幣的密鑰派生方法及裝置。
背景技術:
數字貨幣是電子貨幣形式的替代貨幣,它采用P2P形式,不依靠特定貨幣機構發行,而是依據特定算法通過大量的計算產生。數字貨幣經濟使用整個P2P網絡中眾多節點構成的分布式數據庫來確認并記錄所有的交易行為,并使用密碼學的設計來確保貨幣流通各個環節的安全性,基于密鑰學的設計可以使數字貨幣只能被真實的擁有者轉移或支付,確保了貨幣所有權與流通交易的匿名性。由于數字貨幣交易的匿名性,用戶每次使用不同的地址接收數字貨幣,通常地址用ECC公鑰表示,用戶擁有一個錢包,每進行一筆數字貨幣交易,需要在錢包中保存與該筆交易對應的ECC密鑰,然而錢包的空間是有限的,所以需要及時備份錢包中的ECC密鑰。
發明人在實現本發明的過程中發現,現有技術中至少存在以下缺陷:
1、隨著交易次數的增多,密鑰的備份體積越來越大,不易管理;
2、密鑰損壞后不能恢復,若密鑰數據損壞,則與密鑰數據對應的交易中的數字貨幣也將無法再消費。
技術實現要素:
本發明的目的是克服現有技術的缺陷,提供適用于數字貨幣的密鑰派生方法及裝置。
本發明是通過下述技術方案實現的:
首先,本發明提供一種適用于數字貨幣的密鑰派生方法及裝置。
所述方法包括:根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
所述根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼可以具體包括:
步驟A1、將父公鑰與子密鑰索引順序拼接得到第一拼接數據;用父鏈碼作為哈希密鑰,根據預設算法計算所述第一拼接數據的哈希值;
步驟A2、對所述第一拼接數據的哈希值進行截取,得到子鏈碼和第一數據,以預設橢圓曲線的基點的階為模數,對父私鑰和所述第一數據做ECC加法模運算,得到第一運算結果;
步驟A3、判斷所述第一運算結果是否為預設值,是則將子密鑰索引遞增,根據父私鑰、父公鑰、父鏈碼和遞增后的子密鑰索引重新派生子私鑰、子公鑰和子鏈碼;否則將所述第一運算結果作為子私鑰,對子私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到子公鑰;
所述父私鑰和所述父公鑰均為所述預設橢圓曲線上的點。
進一步地,所述步驟A1之前還可以包括:比較子密鑰索引和預設值,當子密鑰索引小于所述預設值時,執行步驟A1,否則根據父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
所述根據父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼可以具體包括:
步驟B1、對父私鑰進行高位端補位,將補位后的父私鑰與子密鑰索引順序拼接得到第二拼接數據;用父鏈碼作為哈希密鑰,根據預設算法計算所述第二拼接數據的哈希值;
步驟B2、對所述第二拼接數據的哈希值進行截取,得到子鏈碼和第二數據,以所述預設橢圓曲線的基點的階為模數,對補位前的父私鑰和所述第二數據做ECC加法模運算,得到第二運算結果;
步驟B3、判斷所述第二運算結果是否為預設值,是則將子密鑰索引遞增,根據父私鑰、父鏈碼和遞增后的子密鑰索引重新派生子私鑰、子公鑰和子鏈碼;否則將所述第二運算結果作為子私鑰,對子私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到子公鑰。
進一步地,所述方法還可以包括:根據父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
所述根據父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼可以具體包括:
步驟C1、將父公鑰與子密鑰索引順序拼接得到第三拼接數據;用父鏈碼作為哈希密鑰,根據預設算法計算所述第三拼接數據的哈希值;
步驟C2、對所述第三拼接數據的哈希值進行截取,得到子鏈碼和第三數據,對所述預設橢圓曲線的基點和所述第三數據進行ECC點乘運算,對父公鑰和ECC點乘運算結果做ECC加法運算;
步驟C3、判斷ECC加法運算結果是否為預設值,是則將子密鑰索引遞增,根據父公鑰、父鏈碼和遞增后的子密鑰索引重新派生子公鑰和子鏈碼;否則將所述ECC加法運算結果作為子公鑰。
所述步驟C1之前還可以包括:比較子密鑰索引和預設值,當子密鑰索引小于所述預設值時,執行步驟C1,否則提示失敗。
本方法中,所述父私鑰為主私鑰或上一級子私鑰;所述父公鑰為主公鑰或上一級子公鑰;所述父鏈碼為主鏈碼或上一級子鏈碼。
進一步地,所述方法中還可以包括:生成主私鑰、主公鑰和主鏈碼。
所述生成主私鑰、主公鑰和主鏈碼可以具體包括:
步驟D1、獲取一個偽隨機數作為密鑰種子,用預設字符串作為哈希密鑰,根據預設算法計算所述密鑰種子的哈希值;
步驟D2、對所述密鑰種子的哈希值進行截取,得到主鏈碼和主私鑰;
步驟D3、對所述主私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到主公鑰。
所述裝置,包括:第一派生模塊,用于根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
所述第一派生模塊可以具體包括:
第一拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第一拼接數據;
第一哈希單元,用于用父鏈碼作為哈希密鑰,根據預設算法計算所述第一拼接單元得到的第一拼接數據的哈希值;
第一截取單元,用于對所述第一哈希單元得到的第一拼接數據的哈希值進行截取,得到子鏈碼和第一數據;
第一運算單元,用于以預設橢圓曲線的基點的階為模數,對父私鑰和所述第一截取單元得到的第一數據做ECC加法模運算,得到第一運算結果;
第一判斷單元,用于判斷所述第一運算單元得到的第一運算結果是否為預設值;
第一遞增單元,用于當所述第一判斷單元的判斷結果為是時,將子密鑰索引遞增;
第一密鑰獲取單元,用于當所述第一判斷單元的判斷結果為否時,將所述第一運算單元得到的第一運算結果作為子私鑰,對子私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到子公鑰。
所述父私鑰和所述父公鑰均為所述預設橢圓曲線上的點。
進一步地,所述裝置還可以包括:
第一比較模塊,用于比較子密鑰索引和預設值;
第二派生模塊,用于當所述第一比較模塊確定子密鑰索引大于或者等于預設值時,根據父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
相應地,所述第一派生模塊,具體用于當所述第一比較模塊確定子密鑰索引小于預設值時,根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
所述第二派生模塊可以具體包括:
第二拼接單元,用于對父私鑰進行高位端補位,將補位后的父私鑰與子密鑰索引順序拼接得到第二拼接數據;
第二哈希單元,用于用父鏈碼作為哈希密鑰,根據預設算法計算所述第二拼接單元得到的第二拼接數據的哈希值;
第二截取單元,用于對所述第二哈希單元得到的哈希值進行截取,得到子鏈碼和第二數據;
第二運算單元,用于以所述預設橢圓曲線的基點的階為模數,對補位前的父私鑰和所述第二截取單元得到的第二數據做ECC加法模運算,得到第二運算結果;
第二判斷單元,用于判斷所述第二運算單元得到的第二運算結果是否為預設值;
第二遞增單元,用于當所述第二判斷單元的判斷結果為是時,將子密鑰索引遞增;
第二密鑰獲取單元,用于當所述第二判斷單元的判斷結果為否時,將所述第二運算單元得到的第二運算結果作為子私鑰,對子私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到子公鑰。
進一步地,所述裝置還可以包括:第三派生模塊,用于根據父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
所述第三派生模塊可以具體包括:
第三拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第三拼接數據;
第三哈希單元,用于用父鏈碼作為哈希密鑰,根據預設算法計算所述第三拼接單元得到的第三拼接數據的哈希值;
第三截取單元,用于對所述第三哈希單元得到的第三拼接數據的哈希值進行截取,得到子鏈碼和第三數據;
第三運算單元,用于對所述預設橢圓曲線的基點和所述第三截取單元得到的第三數據進行ECC點乘運算,對父公鑰和ECC點乘運算結果做ECC加法運算;
第三判斷單元,用于判斷第三運算單元得到的ECC加法運算結果是否為預設值;
第三遞增單元,用于當所述第三判斷單元的判斷結果為是時,將子密鑰索引遞增;
第三密鑰獲取單元,用于當所述第三判斷單元的判斷結果為否時,將所述第三運算單元得到的ECC加法運算結果作為子公鑰。
更進一步地,所述裝置還可以包括:
第二比較模塊,用于比較子密鑰索引和預設值;
提示模塊,用于當所述第二比較模塊確定子密鑰索引大于或者等于預設值時,提示失敗;
相應地,所述第三派生模塊,具體用于當所述第二比較模塊確定子密鑰索引小于預設值時,根據父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
本裝置中,所述第一派生模塊可以具體用于:將主私鑰、主公鑰和主鏈碼分別作為父私鑰、父公鑰和父鏈碼,或者將上一級子私鑰、上一級子公鑰和上一級子鏈碼分別作為父私鑰、父公鑰和父鏈碼,根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
進一步地,所述裝置還可以包括:生成模塊,用于生成主私鑰、主公鑰和主鏈碼。
所述生成模塊,可以具體包括:
第四哈希單元,用于獲取一個偽隨機數作為密鑰種子,用預設字符串作為哈希密鑰,根據預設算法計算所述密鑰種子的哈希值;
第四截取單元,用于對所述第四哈希單元得到的密鑰種子的哈希值進行截取,得到主鏈碼和主私鑰;
第四運算單元,用于對所述第四截取單元得到的主私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到主公鑰。
其次,本發明提供另一種適用于數字貨幣的密鑰派生方法及裝置。
所述方法包括:分別以數字貨幣錢包的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第一子密鑰索引作為子密鑰索引,根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,將派生得到的子私鑰、子公鑰和子鏈碼分別作為數字貨幣賬戶的主私鑰、主公鑰和主鏈碼。
本方法中,所述根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,可以具體包括:
步驟A1、將父公鑰與子密鑰索引順序拼接得到第一拼接數據;用父鏈碼作為哈希密鑰,根據預設算法計算所述第一拼接數據的哈希值;
步驟A2、對所述第一拼接數據的哈希值進行截取,得到子鏈碼和第一數據,以預設橢圓曲線的基點的階為模數,對父私鑰和所述第一數據做ECC加法模運算,得到第一運算結果;
步驟A3、判斷所述第一運算結果是否為預設值,是則將子密鑰索引遞增,根據父私鑰、父公鑰、父鏈碼和遞增后的子密鑰索引重新派生子私鑰、子公鑰和子鏈碼;否則將所述第一運算結果作為子私鑰,對子私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到子公鑰;
所述父私鑰和所述父公鑰均為所述預設橢圓曲線上的點。
所述步驟A1之前還可以包括:比較子密鑰索引和預設值,當子密鑰索引小于所述預設值時,執行步驟A1,否則根據父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
所述根據父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼可以具體包括:
步驟B1、對父私鑰進行高位端補位,將補位后的父私鑰與子密鑰索引順序拼接得到第二拼接數據;用父鏈碼作為哈希密鑰,根據預設算法計算所述第二拼接數據的哈希值;
步驟B2、對所述第二拼接數據的哈希值進行截取,得到子鏈碼和第二數據,以所述預設橢圓曲線的基點的階為模數,對補位前的父私鑰和所述第二數據做ECC加法模運算,得到第二運算結果;
步驟B3、判斷所述第二運算結果是否為預設值,是則將子密鑰索引遞增,根據父私鑰、父鏈碼和遞增后的子密鑰索引重新派生子私鑰、子公鑰和子鏈碼;否則將所述第二運算結果作為子私鑰,對子私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到子公鑰。
進一步地,所述方法還可以包括:獲取密鑰種子和數字貨幣種子,用所述數字貨幣種子作為哈希密鑰,根據預設算法計算所述密鑰種子的哈希值;對所述密鑰種子的哈希值進行截取,得到數字貨幣錢包的主私鑰和主鏈碼;對所述數字貨幣錢包的主私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到數字貨幣錢包的主公鑰。
所述方法還可以包括:
步驟1-1、分別以數字貨幣賬戶的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引,根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,將派生得到的子私鑰、子公鑰和子鏈碼分別作為第一子私鑰、第一子公鑰和第一子鏈碼;
步驟1-2、分別以所述第一子公鑰和所述第一子鏈碼為父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引,根據父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼,將派生得到的子公鑰作為第二子公鑰;
步驟1-3、對所述第二子公鑰進行編碼,得到數字貨幣收取地址。
本方法中,所述根據父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼,可以具體包括:
步驟C1、將父公鑰與子密鑰索引順序拼接得到第三拼接數據;用父鏈碼作為哈希密鑰,根據預設算法計算所述第三拼接數據的哈希值;
步驟C2、對所述第三拼接數據的哈希值進行截取,得到子鏈碼和第三數據,對所述預設橢圓曲線的基點和所述第三數據進行ECC點乘運算,對父公鑰和ECC點乘運算結果做ECC加法運算;
步驟C3、判斷ECC加法運算的結果是否為預設值,是則將子密鑰索引遞增,根據父公鑰、父鏈碼和遞增后的子密鑰索引重新派生子公鑰和子鏈碼;否則將ECC加法運算的結果作為子公鑰。
所述步驟C1之前還可以包括:比較子密鑰索引和預設值,當子密鑰索引小于所述預設值時,執行步驟C1,否則提示失敗。
所述步驟C3中,當判斷ECC加法運算的結果不為預設值時,還包括:將子密鑰索引的當前值保存為數字貨幣收取地址索引;
相應地,所述方法還可以包括:
步驟2-1、分別以數字貨幣賬戶的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引,根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,將派生得到的子私鑰、子公鑰和子鏈碼分別作為第一子私鑰、第一子公鑰和第一子鏈碼;
步驟2-2、分別以所述第一子私鑰、第一子公鑰和第一子鏈碼為父私鑰、父公鑰和父鏈碼,將各已保存的數字貨幣收取地址索引依次作為子密鑰索引,根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,將派生得到的子公鑰作為第二子公鑰;
步驟2-3、對各第二子公鑰分別進行編碼,得到各數字貨幣收取地址;
步驟2-4、依次查詢和累加各數字貨幣收取地址中的數字貨幣的數量,得到數字貨幣賬戶的數字貨幣量。
進一步地,所述方法還可以包括:
步驟3-1、分別以數字貨幣賬戶的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引,根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,將派生得到的子私鑰、子公鑰和子鏈碼分別作為第一子私鑰、第一子公鑰和第一子鏈碼;
步驟3-2、分別以所述第一子私鑰、第一子公鑰和第一子鏈碼為父私鑰、父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引,根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,得到預設數目的第二子私鑰、第二子公鑰和第二子鏈碼;
步驟3-3、對各第二子公鑰分別進行編碼,得到預設數目的數字貨幣收取地址;
步驟3-4、依次查詢各數字貨幣收取地址中是否有數字貨幣,若均沒有則將已查詢到的有數字貨幣的數字貨幣收取地址中的數據貨幣數量依次相加,得到數字貨幣賬戶的數字貨幣量;否則返回步驟3-2得到新的預設數目的第二子私鑰、第二子公鑰和第二子鏈碼,然后執行步驟3-3。
所述裝置包括:
第一獲取模塊,用于分別以數字貨幣錢包的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第一子密鑰索引作為子密鑰索引;
第一派生模塊,用于根據所述第一獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
賬戶密鑰生成模塊,用于將所述第一派生模塊派生的子私鑰、子公鑰和子鏈碼分別作為數字貨幣賬戶的主私鑰、主公鑰和主鏈碼。
一方面,本裝置中,所述第一派生模塊可以具體包括:
第一拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第一拼接數據;
第一哈希單元,用于用父鏈碼作為哈希密鑰,根據預設算法計算所述第一拼接單元得到的第一拼接數據的哈希值;
第一截取單元,用于對所述第一哈希單元得到的第一拼接數據的哈希值進行截取,得到子鏈碼和第一數據;
第一運算單元,用于以預設橢圓曲線的基點的階為模數,對父私鑰和所述第一截取單元得到的第一數據做ECC加法模運算,得到第一運算結果;
第一判斷單元,用于判斷所述第一運算單元得到的第一運算結果是否為預設值;
遞增單元,用于當所述第一判斷單元的判斷結果為是時,將子密鑰索引遞增;
第一密鑰獲取單元,用于當所述第一判斷單元的判斷結果為否時,將所述第一運算單元得到的第一運算結果作為子私鑰,對子私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到子公鑰;
所述父私鑰和所述父公鑰均為所述預設橢圓曲線上的點。
另一方面,所述第一派生模塊,可以具體包括:
第一比較子模塊,用于比較子密鑰索引和預設值;
第一派生子模塊,用于當所述第一比較子模塊確定子密鑰索引小于預設值時,根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
第二派生子模塊,用于當所述第一比較子模塊確定子密鑰索引大于或者等于預設值時,根據父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
所述第二派生子模塊可以具體包括:
第二拼接單元,用于對父私鑰進行高位端補位,將補位后的父私鑰與子密鑰索引順序拼接得到第二拼接數據;
第二哈希單元,用于用父鏈碼作為哈希密鑰,根據預設算法計算所述第二拼接單元得到的第二拼接數據的哈希值;
第二截取單元,用于對所述第二哈希單元得到的哈希值進行截取,得到子鏈碼和第二數據;
第二運算單元,用于以所述預設橢圓曲線的基點的階為模數,對補位前的父私鑰和所述第二截取單元得到的第二數據做ECC加法模運算,得到第二運算結果;
第二判斷單元,用于判斷第二運算單元得到的第二運算結果是否為預設值;
第二遞增單元,用于當所述第二判斷單元的判斷結果為是時,將子密鑰索引遞增;
第二密鑰獲取單元,用于當所述第二判斷單元的判斷結果為否時,將所述第二運算單元得到的第二運算結果作為子私鑰,對子私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到子公鑰。
進一步地,所述裝置還可以包括:錢包密鑰生成模塊,用于獲取密鑰種子和數字貨幣種子,用所述數字貨幣種子作為哈希密鑰,根據預設算法計算所述密鑰種子的哈希值;對所述密鑰種子的哈希值進行截取,得到數字貨幣錢包的主私鑰和主鏈碼;對所述數字貨幣錢包的主私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到數字貨幣錢包的主公鑰。
所述裝置還可以包括:第二獲取模塊,用于分別以數字貨幣賬戶的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引;
相應地,所述第一派生模塊,還用于根據所述第二獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
所述裝置還包括:第三獲取模塊、第二派生模塊和貨幣收取地址生成模塊;
所述第三獲取模塊,用于將所述第一派生模塊根據所述第二獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的子公鑰和子鏈碼分別作為父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引;
所述第二派生模塊,用于根據所述第三獲取模塊獲取的父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼;
所述貨幣收取地址生成模塊,用于對所述第二派生模塊派生的子公鑰進行編碼,得到數字貨幣收取地址。
一方面,所述第二派生模塊,可以具體包括:
第三拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第三拼接數據;
第三哈希單元,用于用父鏈碼作為哈希密鑰,根據預設算法計算所述第三拼接單元得到的第三拼接數據的哈希值;
第三截取單元,用于對所述第三哈希單元得到的第三拼接數據的哈希值進行截取,得到子鏈碼和第三數據;
第三運算單元,用于對所述橢圓曲線的基點和所述第三截取單元得到的第三數據進行ECC點乘運算,對父公鑰和ECC點乘運算結果做ECC加法運算;
第三判斷單元,用于判斷第三運算單元得到的ECC加法運算結果是否為預設值;
第三遞增單元,用于當所述第三判斷單元的判斷結果為是時,將子密鑰索引遞增;
第三密鑰獲取單元,用于當所述第三判斷單元的判斷結果為否時,將所述第三運算單元得到的ECC加法運算結果作為子公鑰。
另一方面,所述第二派生模塊可以具體包括:
第二比較子模塊,用于比較所述第三獲取模塊獲取的子密鑰索引和預設值;
提示子模塊,用于當所述第二比較子模塊確定所述第三獲取模塊獲取的子密鑰索引大于或者等于預設值時,提示失敗;
派生子模塊,用于當所述第二比較子模塊確定所述第三獲取模塊獲取的子密鑰索引小于預設值時,根據所述第三獲取模塊獲取的父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
進一步地,所述第三密鑰獲取單元還用于:將子密鑰索引的當前值保存為數字貨幣收取地址索引;相應地:
所述裝置還包括:第四獲取模塊,用于將所述第一派生模塊根據所述第二獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的子私鑰、子公鑰和子鏈碼分別作為父私鑰、父公鑰和父鏈碼,將所述第三密鑰獲取單元中保存的各數字貨幣收取地址索引依次作為子密鑰索引;
所述第一派生模塊還用于:根據所述第四獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
所述裝置還包括:賬戶貨幣查詢模塊,用于將所述第一派生模塊根據所述第四獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的各子公鑰分別進行編碼,得到各數字貨幣收取地址,依次查詢和累加各數字貨幣收取地址中的數字貨幣的數量,得到數字貨幣賬戶的數字貨幣量;
或者,進一步地:
所述裝置還包括:第二獲取模塊,用于以數字貨幣賬戶的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引;
所述第一派生模塊,還用于根據所述第二獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
所述裝置還包括:第三獲取模塊,用于將所述第一派生模塊根據所述第二獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的子公鑰和子鏈碼分別作為父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引;
所述第一派生模塊,還用于根據所述第三獲取模塊獲取的父公鑰、父鏈碼和子密鑰索引派生預設數目的子私鑰、子公鑰和子鏈碼;
所述裝置還包括:貨幣收取地址生成模塊,用于對所述第一派生模塊根據所述第三獲取模塊獲取的父公鑰、父鏈碼和子密鑰索引派生的預設數目的子私鑰分別進行編碼,得到預設數目的數字貨幣收取地址,依次查詢各數字貨幣收取地址中是否有數字貨幣,當均沒有時將已查詢到的有數字貨幣的數字貨幣收取地址中的數據貨幣數量依次相加,得到數字貨幣賬戶的數字貨幣量。
本發明的有益效果在于:采用本發明提供的技術方案,根據密鑰種子能夠衍生出全部密鑰,因此只需要備份密鑰種子,而不需要備份根據密鑰種子派生出的子密鑰,所述備份體積不會隨密鑰的增多而變大,易于管理,并且能夠避免密鑰損壞給用戶造成損失。進一步地有益效果是,可以在不暴露私鑰的前提下實現子公鑰的派生,提高了密鑰使用的安全性。
附圖說明
為了更清楚的說明本發明實施例或現有技術中的技術方案,下面將對實施例或現有技術描述中所需要使用的附圖作簡單的介紹,顯而易見地,下面描述中的附圖僅僅是本發明的一些實施例,對于本領域普通技術人員來講,在不付出創造性勞動的前提下,還可以根據這些附圖獲得其他的附圖。
圖1為本發明實施例1中提供的主密鑰和主鏈碼的生成方法的流程圖;
圖2為本發明實施例1中提供的子私鑰、子公鑰和子鏈碼的生成方法的流程圖;
圖3為本發明實施例1中提供的子公鑰和子鏈碼的生成方法的流程圖;
圖4為查詢數字貨幣賬戶的數字貨幣量的一種方法流程圖;
圖5為查詢數字貨幣賬戶的數字貨幣量的另一種方法流程圖;
圖6為本發明實施例2提供的一種適用于數字貨幣的密鑰派生裝置的方框圖;
圖7為本發明實施例3提供的一種適用于數字貨幣的密鑰派生裝置的方框圖。
具體實施方式
下面將結合本發明實施例中的附圖,對本發明實施例中的技術方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發明一部分實施例,而不是全部的實施例。基于本發明中的實施例,本領域技術人員在沒有做出創造性勞動前提下所獲得的所有其他實施例,都屬于本發明保護的范圍。
在進行具體說明之前,對ECC和HMAC進行簡單的說明,如下:
ECC(Elliptic Curve Cryptography,橢圓曲線密碼學)是基于橢圓曲線數學的一種公鑰密碼的方法。密碼學中,描述一條橢圓曲線,常用到六個參量:T=(p,a,b,G,n,h),其中p、a、b用于確定一條橢圓曲線,G為橢圓曲線的基點,n為G的階(即nG=0(無窮遠點)),h是橢圓曲線上所有點的個數m與n相除所得結果的整數部分。
HMAC(Hash-based Message Authentication Code,密鑰相關的哈希運算消息認證碼)運算運用哈希算法,以一個密鑰和一個消息為輸入,生成一個消息摘要作為輸出,當運用的哈希算法具體為SHA512時,HMAC記作HMAC-SHA512。
實施例1
本實施例提供一種適用于數字貨幣的密鑰派生方法,采用本實施例提供的方法派生出的密鑰呈樹狀結構,樹的根部為主密鑰和主鏈碼,以主密鑰為父密鑰、主鏈碼為父鏈碼生成的子密鑰和子鏈碼為樹的第一級密鑰和第一級鏈碼,以第一級密鑰為父密鑰、第一級鏈碼為父鏈碼生成的子密鑰和子鏈碼為樹的第二級密鑰和第二級鏈碼,以此類推。
根據父密鑰生成子密鑰時引入子密鑰索引,根據不同的子密鑰索引生成不同的子密鑰,子密鑰索引與子密鑰是一一對應的。
所述方法具體包括:
1、主私鑰、主公鑰和主鏈碼的派生過程,如圖1所示,包括:
步驟101、使用偽隨機數生成器生成一個偽隨機數作為密鑰種子。
例如,偽隨機數生成器生成的偽隨機數為5d 1c 8c 8d 5c b3 d0 46 d7 2f ee bd 48 77 ec 85 d3 51 42 06 a9 ef a1 42 23 d9 b0 07 c7 c1 82 0a c2 35 89 84 0e 67 67 9b 76 29 08 81 df 31 d4 7d 79 80 95 cd 71 c4 b9 70 fb cb ef 58 58 63 dc a6,將其作為密鑰種子,得到密鑰種子如下:
5d 1c 8c 8d 5c b3 d0 46 d7 2f ee bd 48 77 ec 85 d3 51 42 06 a9 ef a1 42 23 d9 b0 07 c7 c1 82 0a c2 35 89 84 0e 67 67 9b 76 29 08 81 df 31 d4 7d 79 80 95 cd 71 c4 b9 70 fb cb ef 58 58 63 dc a6。
步驟102、使用預設字符串作為哈希密鑰,根據預設算法計算密鑰種子的哈希值;
本實施例中,預設算法優選為HMAC-SHA512算法。
例如,預設字符串為“Bitcoin seed”的ASCII編碼,密鑰種子如步驟101中的例舉,為5d 1c 8c 8d 5c b3 d0 46 d7 2f ee bd 48 77 ec 85 d3 51 42 06 a9 ef a1 42 23 d9 b0 07 c7 c1 82 0a c2 35 89 84 0e 67 67 9b 76 29 08 81 df 31 d4 7d 79 80 95 cd 71 c4 b9 70 fb cb ef 58 58 63 dc a6,則計算得到的哈希值如下:
0d 39 a1 7e c1 44 3c 14 95 45 29 b1 58 d6 c2 fa 7e 43 0e 1a 2f 9e f3 dc 29 f8 ee 82 53 e7 47 2f e4 9c f6 c0 03 7b 1c 18 01 74 13 1c 1b 49 96 1f dc cf c0 b4 f6 91 5d 37 d5 a8 5d 27 97 6d 44 3c。
步驟103、將計算得到的哈希值的高位端預設長度的數據作為主私鑰,低位端預設長度的數據作為主鏈碼;
本實施例中,高位端預設長度的數據優選為高256比特的數據,低位端預設長度的數據優選為低256比特的數據。
例如,計算得到的哈希值如步驟102中的例舉,為0d 39 a1 7e c1 44 3c 14 95 45 29 b1 58 d6 c2 fa 7e 43 0e 1a 2f 9e f3 dc 29 f8 ee 82 53 e7 47 2f e4 9c f6 c0 03 7b 1c 18 01 74 13 1c 1b 49 96 1f dc cf c0 b4 f6 91 5d 37 d5 a8 5d 27 97 6d 44 3c,則將其高256比特作為主私鑰,低256比特作為主鏈碼,得到:
主私鑰——0d 39 a1 7e c1 44 3c 14 95 45 29 b1 58 d6 c2 fa 7e 43 0e 1a 2f 9e f3 dc 29 f8 ee 82 53 e7 47 2f;
主鏈碼——e4 9c f6 c0 03 7b 1c 18 01 74 13 1c 1b 49 96 1f dc cf c0 b4 f6 91 5d 37 d5 a8 5d 27 97 6d 44 3c。
步驟104、對主私鑰和橢圓曲線基點做ECC點乘運算,將ECC點乘運算結果作為主公鑰。
即本實施例中,主公鑰=主私鑰*橢圓曲線基點。
例如,主私鑰如步驟103中的例舉,為0d 39 a1 7e c1 44 3c 14 95 45 29 b1 58 d6 c2 fa 7e 43 0e 1a 2f 9e f3 dc 29 f8 ee 82 53 e7 47 2f,橢圓曲線基點為79 be 66 7e f9 dc bb ac 55 a0 62 95 ce 87 0b 07 02 9b fc db 2d ce 28 d9 59 f2 81 5b 16 f8 17 98 48 3a da 77 26 a3 c4 65 5d a4 fb fc 0e 11 08 a8 fd 17 b4 48 a6 85 54 19 9c 47 d0 8f fb 10 d4 b8,則對主私鑰和橢圓曲線基點做ECC點乘運算,得到的ECC點乘運算結果如下:
11 ef a5 b3 85 94 70 ff 35 b2 ea 23 3c e7 3a e5 f4 f5 ac 75 b2 d4 3e ed c2 3a 10 2a a7 03 2e 11 73 b9 14 34 38 59 75 07 6a e9 4f 29 4c cb 98 a0 5e a5 0c 9b a4 f2 18 d2 5d c8 ec d3 58 ea 34 89。
本實施例中的公鑰采用未壓縮格式,即將ECC點乘運算結果作為主公鑰時,需在ECC點乘運算結果前添加一個字節04,用于表示主公鑰的格式為未壓縮;
例如,ECC點乘運算結果如上例舉,為11 ef a5 b3 85 94 70 ff 35 b2 ea 23 3c e7 3a e5 f4 f5 ac 75 b2 d4 3e ed c2 3a 10 2a a7 03 2e 11 73 b9 14 34 38 59 75 07 6a e9 4f 29 4c cb 98 a0 5e a5 0c 9b a4 f2 18 d2 5d c8 ec d3 58 ea 34 89,則將其作為主公鑰,得到的主公鑰如下:
04 11 ef a5 b3 85 94 70 ff 35 b2 ea 23 3c e7 3a e5 f4 f5 ac 75 b2 d4 3e ed c2 3a 10 2a a7 03 2e 11 73 b9 14 34 38 59 75 07 6a e9 4f 29 4c cb 98 a0 5e a5 0c 9b a4 f2 18 d2 5d c8 ec d3 58 ea 34 89。
2、子私鑰、子公鑰和子鏈碼的派生過程:
1)派生子私鑰、子公鑰和子鏈碼,如圖2所示,包括:
步驟201、比較當前子密鑰索引和預設值,若當前子密鑰索引小于預設值則執行步驟202,否則執行步驟208;
具體地,子密鑰索引的長度為32比特,初始值為00 00 00 00,每根據子密鑰索引進行一次計算,將子密鑰索引遞增,例如加1。
本實施例中,預設值優選為80 00 00 00。
步驟202、將父公鑰和當前子密鑰索引分別作為高位端數據和低位端數據進行拼接;
例如,父公鑰為04 11 ef a5 b3 85 94 70 ff 35 b2 ea 23 3c e7 3a e5 f4 f5 ac 75 b2 d4 3e ed c2 3a 10 2a a7 03 2e 11 73 b9 14 34 38 59 75 07 6a e9 4f 29 4c cb 98 a0 5e a5 0c 9b a4 f2 18 d2 5d c8 ec d3 58 ea 34 89,子密鑰索引為00 00 00 00,則將父公鑰和當前子密鑰索引分別作為高位端數據和低位端數據進行拼接,拼接得到的數據如下:
04 11 ef a5 b3 85 94 70 ff 35 b2 ea 23 3c e7 3a e5 f4 f5 ac 75 b2 d4 3e ed c2 3a 10 2a a7 03 2e 11 73 b9 14 34 38 59 75 07 6a e9 4f 29 4c cb 98 a0 5e a5 0c 9b a4 f2 18 d2 5d c8 ec d3 58 ea 34 89 00 00 00 00。
步驟203、用父鏈碼作為哈希密鑰,根據預設算法計算拼接得到的數據的哈希值;
本實施例中,預設算法優選為HMAC-SHA512算法。
例如,父鏈碼為e4 9c f6 c0 03 7b 1c 18 01 74 13 1c 1b 49 96 1f dc cf c0 b4 f6 91 5d 37 d5 a8 5d 27 97 6d 44 3c,拼接得到的數據如步驟202中的例舉,為04 11 ef a5 b3 85 94 70 ff 35 b2 ea 23 3c e7 3a e5 f4 f5 ac 75 b2 d4 3e ed c2 3a 10 2a a7 03 2e 11 73 b9 14 34 38 59 75 07 6a e9 4f 29 4c cb 98 a0 5e a5 0c 9b a4 f2 18 d2 5d c8 ec d3 58 ea 34 89 00 00 00 00,則用父鏈碼作密鑰,根據HMAC-SHA512算法計算拼接得到的數據的哈希值,得到:
b1 85 93 8d 8e 60 c9 19 da 3a 4a c3 9d d7 37 1d f0 cb b5 4b d1 aa 4a d1 92 ff d7 a1 48 63 91 0e 13 25 c2 ca 52 e1 7b d9 6b ae 7e 6e 64 3f 47 cc 71 6d 68 64 10 58 2f 24 65 11 e5 d6 2f d0 7c 04。
步驟204、將計算得到的哈希值的低位端預設長度的數據作為子鏈碼,以橢圓曲線基點的階為模對父私鑰和計算得到的哈希值的告我段預設長度的數據做ECC加法模運算;
本實施例中,高位端預設長度的數據優選為高256比特的數據,低位端預設長度的數據優選為低256比特的數據。
例如,計算得到的哈希值如步驟203中的例舉,為b1 85 93 8d 8e 60 c9 19 da 3a 4a c3 9d d7 37 1d f0 cb b5 4b d1 aa 4a d1 92 ff d7 a1 48 63 91 0e 13 25 c2 ca 52 e1 7b d9 6b ae 7e 6e 64 3f 47 cc 71 6d 68 64 10 58 2f 24 65 11 e5 d6 2f d0 7c 04,橢圓曲線基點的階為FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE BA AE DC E6 AF 48 A0 3B BF D2 5E 8C D0 36 41 41,父私鑰為0d 39 a1 7e c1 44 3c 14 95 45 29 b1 58 d6 c2 fa 7e 43 0e 1a 2f 9e f3 dc 29 f8 ee 82 53 e7 47 2f,則:
將計算得到的哈希值的低256比特作為子鏈碼,得到的子鏈碼為13 25 c2 ca 52 e1 7b d9 6b ae 7e 6e 64 3f 47 cc 71 6d 68 64 10 58 2f 24 65 11 e5 d6 2f d0 7c 04;
以橢圓曲線基點的階為模對父私鑰和計算得到的哈希值的高256比特做ECC加法模運算,得到的ECC加法模運算為be bf 35 0c 4f a5 05 2e 6f 7f 74 74 f6 ad fa 18 6f 0e c3 66 01 49 3e ad bc f8 c6 23 9c 4a d8 3d。
步驟205、判斷ECC加法模運算的結果是否為預設值,是則執行步驟206,否則執行步驟207;
即本實施例中,判斷(父私鑰+left hash)%n的結果是否為預設值,其中,left hash為計算得到的哈希值的高256比特,n為橢圓曲線基點的階。
本實施例中,預設值優選為0。
步驟206、將當前子密鑰索引遞增,返回步驟201;
具體地,將當前子密鑰索引自加1。
步驟207、將ECC加法模運算的結果作為子私鑰,對子私鑰和橢圓曲線基點做ECC點乘運算,將運算結果作為子公鑰。
即本實施例中,子公鑰=子私鑰*橢圓曲線基點。
例如,ECC加法模運算的結果如步驟204中的例舉,為be bf 35 0c 4f a5 05 2e 6f 7f 74 74 f6 ad fa 18 6f 0e c3 66 01 49 3e ad bc f8 c6 23 9c 4a d8 3d,則將ECC加法模運算的結果作為子私鑰,得到的子私鑰如下:
be bf 35 0c 4f a5 05 2e 6f 7f 74 74 f6 ad fa 18 6f 0e c3 66 01 49 3e ad bc f8 c6 23 9c 4a d8 3d。
例如,子私鑰如上例舉,為be bf 35 0c 4f a5 05 2e 6f 7f 74 74 f6 ad fa 18 6f 0e c3 66 01 49 3e ad bc f8 c6 23 9c 4a d8 3d,橢圓曲線基點為79 be 66 7e f9 dc bb ac 55 a0 62 95 ce 87 0b 07 02 9b fc db 2d ce 28 d9 59 f2 81 5b 16 f8 17 98 48 3a da 77 26 a3 c4 65 5d a4 fb fc 0e 11 08 a8 fd 17 b4 48 a6 85 54 19 9c 47 d0 8f fb 10 d4 b8,則對子私鑰和橢圓曲線基點做ECC點乘運算,得到的ECC點乘運算結果如下:
3d 08 74 22 e8 12 ab e5 b8 84 a4 e6 08 85 4d df 91 c3 1e 58 67 06 69 54 24 c2 24 b0 ee 56 16 5e b0 fb 85 b3 41 55 27 1a 85 d3 8f 29 2e 19 d9 dd d6 4e 88 bf b4 54 56 ca 13 37 73 28 10 0a 8e 4e。
本實施例中的公鑰采用未壓縮格式,即將ECC點乘運算結果作為子公鑰時,需在ECC點乘運算結果前添加一個字節04,用于表示子公鑰的格式為未壓縮;
例如,ECC點乘運算結果如上例舉,為3d 08 74 22 e8 12 ab e5 b8 84 a4 e6 08 85 4d df 91 c3 1e 58 67 06 69 54 24 c2 24 b0 ee 56 16 5e b0 fb 85 b3 41 55 27 1a 85 d3 8f 29 2e 19 d9 dd d6 4e 88 bf b4 54 56 ca 13 37 73 28 10 0a 8e 4e,則將ECC點乘運算結果作為子公鑰,得到的子公鑰如下:
04 3d 08 74 22 e8 12 ab e5 b8 84 a4 e6 08 85 4d df 91 c3 1e 58 67 06 69 54 24 c2 24 b0 ee 56 16 5e b0 fb 85 b3 41 55 27 1a 85 d3 8f 29 2e 19 d9 dd d6 4e 88 bf b4 54 56 ca 13 37 73 28 10 0a 8e 4e。
步驟208、在父私鑰的高位端補位;
本實施例中,補位數據優選為00;
例如,父私鑰為0d 39 a1 7e c1 44 3c 14 95 45 29 b1 58 d6 c2 fa 7e 43 0e 1a 2f 9e f3 dc 29 f8 ee 82 53 e7 47 2f,補位數據為00,則在父私鑰的高位端補位,得到的補位后的父私鑰如下:
00 0d 39 a1 7e c1 44 3c 14 95 45 29 b1 58 d6 c2 fa 7e 43 0e 1a 2f 9e f3 dc 29 f8 ee 82 53 e7 47 2f。
步驟209、將補位后的父私鑰和當前子密鑰索引分別作為高位端數據和低位端數據進行拼接;
例如,補位后的父私鑰如步驟208中的例舉,為00 0d 39 a1 7e c1 44 3c 14 95 45 29 b1 58 d6 c2 fa 7e 43 0e 1a 2f 9e f3 dc 29 f8 ee 82 53 e7 47 2f,當前子密鑰索引為80 00 00 00,則將補位后的父私鑰和當前子密鑰索引分別作為高位端數據和低位端數據進行拼接,拼接得到的數據如下:
00 0d 39 a1 7e c1 44 3c 14 95 45 29 b1 58 d6 c2 fa 7e 43 0e 1a 2f 9e f3 dc 29 f8 ee 82 53 e7 47 2f 80 00 00 00。
步驟210、使用父鏈碼作為哈希密鑰,根據預設算法計算拼接得到的數據的哈希值;
本實施例中,預設算法優選為HMAC-SHA512。
例如,父鏈碼為e4 9c f6 c0 03 7b 1c 18 01 74 13 1c 1b 49 96 1f dc cf c0 b4 f6 91 5d 37 d5 a8 5d 27 97 6d 44 3c,拼接得到的數據如步驟209中的例舉,為00 0d 39 a1 7e c1 44 3c 14 95 45 29 b1 58 d6 c2 fa 7e 43 0e 1a 2f 9e f3 dc 29 f8 ee 82 53 e7 47 2f 80 00 00 00,則使用父鏈碼作為哈希密鑰,根據HMAC-SHA512算法計算拼接得到的數據的哈希值,得到的哈希值如下:
a9 9b 65 8d 13 50 ef 0e 61 2d c4 a2 03 be 90 09 45 19 9c 28 66 96 dd 18 85 f8 01 90 ec 83 ae 92 8f 91 8e 03 75 ff 5e ac fd 2f 77 ce b6 f8 36 e0 47 93 73 3e aa 50 7a b4 46 3c 86 2e b7 d9 0b 5f。
步驟211、將計算得到的哈希值的低位端預設長度的數據作為子鏈碼,以橢圓曲線基點的階為模對補位前的父私鑰和計算得到的哈希值的高位端預設長度的數據做ECC加法模運算;
本實施例中,高位端預設長度的數據優選為高256比特的數據,低位端預設長度的數據優選為低256比特的數據。
例如,計算得到的哈希值如步驟210中的例舉,為a9 9b 65 8d 13 50 ef 0e 61 2d c4 a2 03 be 90 09 45 19 9c 28 66 96 dd 18 85 f8 01 90 ec 83 ae 92 8f 91 8e 03 75 ff 5e ac fd 2f 77 ce b6 f8 36 e0 47 93 73 3e aa 50 7a b4 46 3c 86 2e b7 d9 0b 5f,則:
將計算得到的哈希值的低256比特作為子鏈碼,得到的子鏈碼為8f 91 8e 03 75 ff 5e ac fd 2f 77 ce b6 f8 36 e0 47 93 73 3e aa 50 7a b4 46 3c 86 2e b7 d9 0b 5f;
計算得到的哈希值的高256比特為a9 9b 65 8d 13 50 ef 0e 61 2d c4 a2 03 be 90 09 45 19 9c 28 66 96 dd 18 85 f8 01 90 ec 83 ae 92。
例如,橢圓曲線基點的階為FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FE BA AE DC E6 AF 48 A0 3B BF D2 5E 8C D0 36 41 41,補位前的父私鑰如步驟208中的例舉,為0d 39 a1 7e c1 44 3c 14 95 45 29 b1 58 d6 c2 fa 7e 43 0e 1a 2f 9e f3 dc 29 f8 ee 82 53 e7 47 2f,計算得到的哈希值的高256比特如上例舉,為a9 9b 65 8d 13 50 ef 0e 61 2d c4 a2 03 be 90 09 45 19 9c 28 66 96 dd 18 85 f8 01 90 ec 83 ae 92,則以橢圓曲線基點的階為模對補位前的父私鑰和計算得到的哈希值的高256比特做ECC加法模運算,得到的ECC加法模運算的結果如下:
b6 d5 07 0b d4 95 2b 22 f6 72 ee 53 5c 95 53 03 c3 5c aa 42 96 35 d0 f4 af f0 f0 13 40 6a f5 c1。
步驟212、判斷ECC加法模運算的結果是否為預設值,是則執行步驟213,否則執行步驟214;
即本實施例中,判斷(補位前的父私鑰+left hash)%n的結果是否為預設值,其中,left hash為計算得到的哈希值的高256比特,n為橢圓曲線基點的階。
本實施例中,預設值優選為0。
步驟213、將當前子密鑰索引遞增,返回步驟209;
具體地,將當前子密鑰索引自加1。
步驟214、將ECC加法模運算的結果作為子私鑰,對子私鑰和橢圓曲線基點做ECC點乘運算,將ECC點乘運算結果作為子公鑰。
即本實施例中,子公鑰=子私鑰*橢圓曲線基點。
例如,ECC加法模運算的結果如步驟211中的例舉,為b6 d5 07 0b d4 95 2b 22 f6 72 ee 53 5c 95 53 03 c3 5c aa 42 96 35 d0 f4 af f0 f0 13 40 6a f5 c1,橢圓曲線基點為79 be 66 7e f9 dc bb ac 55 a0 62 95 ce 87 0b 07 02 9b fc db 2d ce 28 d9 59 f2 81 5b 16 f8 17 98 48 3a da 77 26 a3 c4 65 5d a4 fb fc 0e 11 08 a8 fd 17 b4 48 a6 85 54 19 9c 47 d0 8f fb 10 d4 b8則:
將ECC加法模運算的結果作為子私鑰,得到子私鑰為b6 d5 07 0b d4 95 2b 22 f6 72 ee 53 5c 95 53 03 c3 5c aa 42 96 35 d0 f4 af f0 f0 13 40 6a f5 c1;
對子私鑰和橢圓曲線基點做ECC點乘運算,得到的ECC點乘運算結果為8e 95 b6 f6 21 33 07 77 11 4c 0d 79 a5 18 0b 45 21 55 ef 09 8c 9e 66 50 d3 2f d7 68 61 0c 8f 9e e7 38 c2 9a 44 da a1 93 fc fb 22 d4 0c 0a b9 d2 85 97 5b 75 a8 05 0b b6 c2 ba 20 a7 e0 82 3f 12。
本實施例中的公鑰采用未壓縮格式,即將ECC點乘運算結果作為子公鑰時,需在ECC點乘運算結果前添加一個字節04,用于表示子公鑰的格式為未壓縮;
例如,ECC點乘運算結果如上例舉,為8e 95 b6 f6 21 33 07 77 11 4c 0d 79 a5 18 0b 45 21 55 ef 09 8c 9e 66 50 d3 2f d7 68 61 0c 8f 9e e7 38 c2 9a 44 da a1 93 fc fb 22 d4 0c 0a b9 d2 85 97 5b 75 a8 05 0b b6 c2 ba 20 a7 e0 82 3f 12,則將ECC點乘運算結果作為子公鑰,得到子公鑰如下:
04 8e 95 b6 f6 21 33 07 77 11 4c 0d 79 a5 18 0b 45 21 55 ef 09 8c 9e 66 50 d3 2f d7 68 61 0c 8f 9e e7 38 c2 9a 44 da a1 93 fc fb 22 d4 0c 0a b9 d2 85 97 5b 75 a8 05 0b b6 c2 ba 20 a7 e0 82 3f 12。
2)派生子公鑰和子鏈碼,如圖3所示,包括:
步驟301、比較當前子密鑰索引和預設值,若當前子密鑰索引小于預設值則執行步驟302,否則提示失敗;
本實施例中,預設值優選為80 00 00 00。
步驟302、將父公鑰和當前子密鑰索引分別作為高位端數據和低位端數據進行拼接;
例如,父公鑰為04 11 ef a5 b3 85 94 70 ff 35 b2 ea 23 3c e7 3a e5 f4 f5 ac 75 b2 d4 3e ed c2 3a 10 2a a7 03 2e 11 73 b9 14 34 38 59 75 07 6a e9 4f 29 4c cb 98 a0 5e a5 0c 9b a4 f2 18 d2 5d c8 ec d3 58 ea 34 89,當前子密鑰索引為00 00 00 00,則將父公鑰和當前子密鑰索引分別作為高位端數據和低位端數據進行拼接,拼接得到的數據如下:
04 11 ef a5 b3 85 94 70 ff 35 b2 ea 23 3c e7 3a e5 f4 f5 ac 75 b2 d4 3e ed c2 3a 10 2a a7 03 2e 11 73 b9 14 34 38 59 75 07 6a e9 4f 29 4c cb 98 a0 5e a5 0c 9b a4 f2 18 d2 5d c8 ec d3 58 ea 34 89 00 00 00 00。
步驟303、使用父鏈碼作為哈希密鑰,根據預設算法計算拼接得到的數據的哈希值;
本實施例中,預設算法優選為HMAC-SHA512算法。
例如,父鏈碼為e4 9c f6 c0 03 7b 1c 18 01 74 13 1c 1b 49 96 1f dc cf c0 b4 f6 91 5d 37 d5 a8 5d 27 97 6d 44 3c,拼接得到的數據如步驟302中的例舉,為04 11 ef a5 b3 85 94 70 ff 35 b2 ea 23 3c e7 3a e5 f4 f5 ac 75 b2 d4 3e ed c2 3a 10 2a a7 03 2e 11 73 b9 14 34 38 59 75 07 6a e9 4f 29 4c cb 98 a0 5e a5 0c 9b a4 f2 18 d2 5d c8 ec d3 58 ea 34 89 00 00 00 00,則使用父鏈碼作為哈希密鑰,根據HMAC-SHA512算法計算拼接得到的數據的哈希值,計算得到的哈希值如下:
b1 85 93 8d 8e 60 c9 19 da 3a 4a c3 9d d7 37 1d f0 cb b5 4b d1 aa 4a d1 92 ff d7 a1 48 63 91 0e 13 25 c2 ca 52 e1 7b d9 6b ae 7e 6e 64 3f 47 cc 71 6d 68 64 10 58 2f 24 65 11 e5 d6 2f d0 7c 04。
步驟304、將計算得到的哈希值的低位端預設長度的數據作為子鏈碼;
本實施例中,低位端預設長度的數據優選為低256比特的數據。
例如,計算得到的哈希值如步驟303中的例舉,為b1 85 93 8d 8e 60 c9 19 da 3a 4a c3 9d d7 37 1d f0 cb b5 4b d1 aa 4a d1 92 ff d7 a1 48 63 91 0e 13 25 c2 ca 52 e1 7b d9 6b ae 7e 6e 64 3f 47 cc 71 6d 68 64 10 58 2f 24 65 11 e5 d6 2f d0 7c 04,則將計算得到的哈希值的低256比特作為子鏈碼,得到的子鏈碼如下:
13 25 c2 ca 52 e1 7b d9 6b ae 7e 6e 64 3f 47 cc 71 6d 68 64 10 58 2f 24 65 11 e5 d6 2f d0 7c 04。
步驟305、對橢圓曲線基點和計算得到的哈希值的高位端預設長度的數據做ECC點乘運算,對父公鑰和ECC點乘運算結果做ECC加法運算;
本實施例中,高位端預設長度的數據優選為高256比特的數據。
例如,橢圓曲線基點為79 be 66 7e f9 dc bb ac 55 a0 62 95 ce 87 0b 07 02 9b fc db 2d ce 28 d9 59 f2 81 5b 16 f8 17 98 48 3a da 77 26 a3 c4 65 5d a4 fb fc 0e 11 08 a8 fd 17 b4 48 a6 85 54 19 9c 47 d0 8f fb 10 d4 b8,計算得到的哈希值如步驟303中的例舉,為b1 85 93 8d 8e 60 c9 19 da 3a 4a c3 9d d7 37 1d f0 cb b5 4b d1 aa 4a d1 92 ff d7 a1 48 63 91 0e 13 25 c2 ca 52 e1 7b d9 6b ae 7e 6e 64 3f 47 cc 71 6d 68 64 10 58 2f 24 65 11 e5 d6 2f d0 7c 04,則:
計算得到的哈希值的高256比特為b1 85 93 8d 8e 60 c9 19 da 3a 4a c3 9d d7 37 1d f0 cb b5 4b d1 aa 4a d1 92 ff d7 a1 48 63 91 0e;
對橢圓曲線基點和計算得到的哈希值的高256比特做ECC點乘運算,對父公鑰和ECC點乘運算結果做ECC加法運算,得到的ECC加法運算結果為3d 08 74 22 e8 12 ab e5 b8 84 a4 e6 08 85 4d df 91 c3 1e 58 67 06 69 54 24 c2 24 b0 ee 56 16 5e b0 fb 85 b3 41 55 27 1a 85 d3 8f 29 2e 19 d9 dd d6 4e 88 bf b4 54 56 ca 13 37 73 28 10 0a 8e 4e。
步驟306、判斷ECC加法運算的結果是否為預設值,是則執行步驟307,否則執行步驟308;
即本實施例中,判斷父公鑰+G*left hash的結果是否為預設值,其中,G為橢圓曲線基點,left hash為計算得到的哈希值的高256比特。
本實施例中,預設值優選為0。
步驟307、將當前子密鑰索引遞增,返回步驟301;
具體地,將當前子密鑰索引自加1。
步驟308、將ECC加法運算的結果作為子公鑰。
本實施例中的公鑰采用未壓縮格式,即將ECC點乘運算結果作為子公鑰時,需在ECC點乘運算結果前添加一個字節04,用于表示子公鑰的格式為未壓縮;
例如,ECC加法運算結果如步驟305中的例舉,為3d 08 74 22 e8 12 ab e5 b8 84 a4 e6 08 85 4d df 91 c3 1e 58 67 06 69 54 24 c2 24 b0 ee 56 16 5e b0 fb 85 b3 41 55 27 1a 85 d3 8f 29 2e 19 d9 dd d6 4e 88 bf b4 54 56 ca 13 37 73 28 10 0a 8e 4e,則將ECC加法運算的結果作為子公鑰,得到的子公鑰如下:
04 3d 08 74 22 e8 12 ab e5 b8 84 a4 e6 08 85 4d df 91 c3 1e 58 67 06 69 54 24 c2 24 b0 ee 56 16 5e b0 fb 85 b3 41 55 27 1a 85 d3 8f 29 2e 19 d9 dd d6 4e 88 bf b4 54 56 ca 13 37 73 28 10 0a 8e 4e。
本實施例中,使用方法1)和2)根據相同的父密鑰、父鏈碼、子密鑰索引派生得到的子公鑰相同。
本實施例以數字貨幣交易為應用場景,提供一種具體實施方式,具體包括:
初始化數字貨幣錢包(以下將數字貨幣錢包簡稱為錢包):
步驟401、獲取密鑰種子和數字貨幣種子;
步驟402、用數字貨幣種子作為哈希密鑰,根據HMAC-SHA512算法計算密鑰種子的哈希值,將密鑰種子的哈希值的高256比特作為錢包的主私鑰,低256比特作為錢包的主鏈碼;
步驟403、對錢包的主私鑰和橢圓曲線基點做ECC點乘運算,將ECC點乘運算結果作為錢包的主公鑰;
步驟404、分別將錢包的主私鑰、主公鑰和主鏈碼作為父私鑰、父公鑰和父鏈碼,將第一子密鑰索引作為子密鑰索引,派生子私鑰、子公鑰和子鏈碼,將派生得到的子私鑰、子公鑰和子鏈碼分別作為錢包中數字貨幣賬戶的主私鑰、主公鑰和主鏈碼;
本實施例中,數字貨幣錢包中可以有多個數字貨幣賬戶,對應不同類型的數字貨幣。
具體地,本實施例步驟404中,采用上述方法1)派生子私鑰、子公鑰和子鏈碼。
步驟405、分別將錢包比特幣賬戶的主私鑰、主公鑰和主鏈碼作為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引,派生子私鑰、子公鑰和子鏈碼,將派生得到的子私鑰、子公鑰和子鏈碼分別作為錢包數字貨幣賬戶的第一子私鑰、第一子公鑰和第一子鏈碼。
具體地,本實施例步驟405中,采用上述方法1)派生子私鑰、子公鑰和子鏈碼。
生成數字貨幣收取地址:
步驟501、獲取錢包數字貨幣賬戶的第一子公鑰和第一子鏈碼;
步驟502、分別將數字貨幣賬戶的第一子公鑰和第一子鏈碼作為父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引,派生子公鑰和子鏈碼,對派生得到的子公鑰進行編碼,得到數字貨幣收取地址。
具體地,本實施例中,第三子密鑰索引為一個變化的值,其初始值為00 00 0000,每根據第三子密鑰索引進行一次計算,將第三子密鑰索引的值加1;
本實施例步驟502中,采用上述方法2)派生子公鑰和子鏈碼。
本實施例中,對子公鑰進行編碼,得到數字貨幣收取地址可以優選地包括:
步驟1、對子公鑰進行一次或多次哈希轉換,得到哈希轉換結果;
本實施例中,步驟1可以優選為:對子公鑰依次進行SHA256哈希轉換和RIPEMD160哈希轉換;
步驟2、根據哈希轉換結果計算校驗值,根據校驗值和哈希轉換結果獲取待編碼數據;
本實施例中,步驟2可以優選為:在哈希轉換結果前添加版本號,對添加了版本號的哈希轉換結果進行兩次SHA256哈希轉換,取結果的前4個字節作為校驗值,將添加了版本號的哈希轉換結果與校驗值順序拼接,得到待編碼數據;
步驟3、對待編碼數據進行編碼得到數字貨幣收取地址。
本實施例中,步驟3可以優選為:對待編碼數據進行Base58編碼,得到數字貨幣收取地址。
例如,子公鑰為04 3d 08 74 22 e8 12 ab e5 b8 84 a4 e6 08 85 4d df 91 c3 1e 58 67 06 69 54 24 c2 24 b0 ee 56 16 5e b0 fb 85 b3 41 55 27 1a 85 d3 8f 29 2e 19 d9 dd d6 4e 88 bf b4 54 56 ca 13 37 73 28 10 0a 8e 4e,版本號為00,對子公鑰依次進行SHA256哈希轉換和RIPEMD160哈希轉換,得到的哈希轉換結果為c7 63 e9 93 54 96 64 69 1e 08 33 c8 5d 4c e5 61 81 08 36 91,添加了版本號的哈希轉換結果為00 c7 63 e9 93 54 96 64 69 1e 08 33 c8 5d 4c e5 61 81 08 36 91,對添加了版本號的哈希轉換結果進行兩次SHA256哈希轉換得到的結果為be 5f bb 5d de 28 31 29 96 24 dd b6 74 e2 ba 1d ec 9a 9f 22 84 da dd bf 44 16 18 e1 be 23 85 44,取結果的前4個字節得到的校驗值為be 5f bb 5d,將添加了版本號的哈希轉換結果與校驗值順序拼接得到的待編碼數據為00 c7 63 e9 93 54 96 64 69 1e 08 33 c8 5d 4c e5 61 81 08 36 91 be 5f bb 5d,對待編碼數據進行Base58編碼,得到的數字貨幣收取地址為1KBHADAoC4ys586g2LP1Jy1QBBaR9cofKJ。
查詢錢包數字貨幣賬戶的數字貨幣量,如圖4所示:
步驟601、分別將錢包數字貨幣賬戶的第一子私鑰、第一子公鑰和第一子鏈碼作為父私鑰、父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引,派生子私鑰、子公鑰和子鏈碼,得到預設數目的第二子私鑰、第二子公鑰和第二子鏈碼;
具體地,本實施例步驟601中,采用上述方法1)派生子私鑰、子公鑰和子鏈碼。
預設數目可優選為20個。
步驟602、對各第二子公鑰分別進行預設編碼,得到預設數目的數字貨幣收取地址;
步驟603、在數字貨幣網絡中依次查詢各數字貨幣收取地址中是否有數字貨幣,若均沒有則執行步驟604,否則返回步驟601;
步驟604、將已查詢到的有數字貨幣的數字貨幣收取地址中的數字貨幣數量依次相加,得到錢包數字貨幣賬戶的數字貨幣量。
進一步地,步驟502中,得到數字貨幣收取地址之后,還包括將第三子密鑰索引的當前值作為數字貨幣收取地址索引保存到錢包中;
相應地,查詢錢包數字貨幣賬戶的數字貨幣量還可以如圖5所示,具體包括:
步驟701、分別將錢包數字貨幣賬戶的第一子私鑰、第一子公鑰和第一子鏈碼作為父私鑰、父公鑰和父鏈碼,將錢包中保存的各數字貨幣收取地址索引依次作為子密鑰索引,派生子私鑰、子公鑰和子鏈碼;
具體地,本實施例步驟701中,采用上述方法1)派生子私鑰、子公鑰和子鏈碼。
步驟702、對派生得到的各子公鑰分別進行預設編碼,得到各數字貨幣收取地址;
步驟703、在數字貨幣網絡中依次查詢各數字貨幣收取地址中的數字貨幣的數量,將各數字貨幣收取地址中的數字貨幣的數量依次相加,得到錢包數字貨幣賬戶的數字貨幣量。
根據本實施例提供的方法,只需要備份密鑰種子,不需要備份每筆交易對應的密鑰,因此備份體積不會隨交易次數的增多而變大,易于管理;根據備份的密鑰種子即可衍生出全部密鑰,以此可以防止密鑰損壞給用戶造成損失。進一步地有益效果是,用戶可以在不暴露私鑰的前提下實現數字貨幣的接收,提高了數字貨幣交易的安全性。
實施例2
本實施例提供一種適用于數字貨幣的密鑰派生裝置,采用本實施例提供的裝置派生出的密鑰呈樹狀結構,樹的根部為主密鑰和主鏈碼,以主密鑰為父密鑰、主鏈碼為父鏈碼生成的子密鑰和子鏈碼為樹的第一級密鑰和第一級鏈碼,以第一級密鑰為父密鑰、第一級鏈碼為父鏈碼生成的子密鑰和子鏈碼為樹的第二級密鑰和第二級鏈碼,以此類推。
根據父密鑰生成子密鑰時引入子密鑰索引,根據不同的子密鑰索引生成不同的子密鑰,子密鑰索引與子密鑰是一一對應的。
本實施例提供的裝置如圖6所示,包括:
第一派生模塊81,用于根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
本實施例中,第一派生模塊81可以具體用于:將主私鑰、主公鑰和主鏈碼分別作為父私鑰、父公鑰和父鏈碼,或者將上一級子私鑰、上一級子公鑰和上一級子鏈碼分別作為父私鑰、父公鑰和父鏈碼,根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
具體地,第一派生模塊81可以進一步包括:
第一拼接單元811,用于將父公鑰與子密鑰索引順序拼接得到第一拼接數據;
第一哈希單元812,用于用父鏈碼作為哈希密鑰,根據預設算法計算第一拼接單元811得到的第一拼接數據的哈希值;
第一截取單元813,用于對第一哈希單元812得到的第一拼接數據的哈希值進行截取,得到子鏈碼和第一數據;
第一運算單元814,用于以預設橢圓曲線的基點的階為模數,對父私鑰和第一截取單元813得到的第一數據做ECC加法模運算,得到第一運算結果;
第一判斷單元815,用于判斷第一運算單元814得到的第一運算結果是否為預設值;
第一遞增單元816,用于當第一判斷單元815的判斷結果為是時,將子密鑰索引遞增;
第一密鑰獲取單元817,用于當第一判斷單元815的判斷結果為否時,將第一運算單元814得到的第一運算結果作為子私鑰,對子私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到子公鑰。
其中,第一截取單元813可以具體用于:截取第一哈希單元812得到的哈希值的低位端預設長度的數據作為子鏈碼,高位端預設長度的數據作為第一數據。
本實施例中,所述裝置還可以包括:
第一比較模塊82,用于比較子密鑰索引和預設值;
第二派生模塊83,用于當第一比較模塊82確定子密鑰索引大于或者等于預設值時,根據父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
相應地,第一派生模塊81,具體用于當第一比較模塊82確定子密鑰索引小于預設值時,根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
具體地,第二派生模塊83可以進一步包括:
第二拼接單元,用于對父私鑰進行高位端補位,將補位后的父私鑰與子密鑰索引順序拼接得到第二拼接數據;
第二哈希單元,用于用父鏈碼作為哈希密鑰,根據預設算法計算所述第二拼接單元得到的第二拼接數據的哈希值;
第二截取單元,用于對所述第二哈希單元得到的哈希值進行截取,得到子鏈碼和第二數據;
第二運算單元,用于以所述預設橢圓曲線的基點的階為模數,對補位前的父私鑰和所述第二截取單元得到的第二數據做ECC加法模運算,得到第二運算結果;
第二判斷單元,用于判斷所述第二運算單元得到的第二運算結果是否為預設值;
第二遞增單元,用于當所述第二判斷單元的判斷結果為是時,將子密鑰索引遞增;
第二密鑰獲取單元,用于當所述第二判斷單元的判斷結果為否時,將所述第二運算單元得到的第二運算結果作為子私鑰,對子私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到子公鑰。
其中,第二截取單元可以具體用于:截取所述第二哈希單元得到的第二拼接數據的哈希值的低位端預設長度的數據作為子鏈碼,高位端預設長度的數據作為第二數據。
本實施例中,所述裝置還可以包括:第三派生模塊,用于根據父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
具體地,第三派生模塊可以進一步包括:
第三拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第三拼接數據;
第三哈希單元,用于用父鏈碼作為哈希密鑰,根據預設算法計算所述第三拼接單元得到的第三拼接數據的哈希值;
第三截取單元,用于對所述第三哈希單元得到的第三拼接數據的哈希值進行截取,得到子鏈碼和第三數據;
第三運算單元,用于對所述預設橢圓曲線的基點和所述第三截取單元得到的第三數據進行ECC點乘運算,對父公鑰和ECC點乘運算結果做ECC加法運算;
第三判斷單元,用于判斷第三運算單元得到的ECC加法運算結果是否為預設值;
第三遞增單元,用于當所述第三判斷單元的判斷結果為是時,將子密鑰索引遞增;
第三密鑰獲取單元,用于當所述第三判斷單元的判斷結果為否時,將所述第三運算單元得到的ECC加法運算結果作為子公鑰。
其中,第三截取單元可以具體用于:截取所述第三哈希單元得到的第三拼接數據的哈希值的低位端預設長度的數據作為子鏈碼,高位端預設長度的數據作為第三數據。
更進一步地,所述裝置還可以包括:
第二比較模塊,用于比較子密鑰索引和預設值;
提示模塊,用于當第二比較模塊確定子密鑰索引大于或者等于預設值時,提示失敗;
相應地,第三派生模塊,具體用于當第二比較模塊確定子密鑰索引小于預設值時,根據父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
本實施例中,所述裝置還可以包括:生成模塊,用于生成主私鑰、主公鑰和主鏈碼。
具體地,生成模塊可以進一步包括:
第四哈希單元,用于獲取一個偽隨機數作為密鑰種子,用預設字符串作為哈希密鑰,根據預設算法計算所述密鑰種子的哈希值;
第四截取單元,用于對所述第四哈希單元得到的密鑰種子的哈希值進行截取,得到主鏈碼和主私鑰;
第四運算單元,用于對所述第四截取單元得到的主私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到主公鑰。
其中,第四截取單元可以具體用于:截取所述第四哈希單元得到的密鑰種子的哈希值的低位端預設長度的數據作為主鏈碼,高位端預設長度的數據作為主私鑰。
實施例3
本實施例提供一種適用于數字貨幣的密鑰派生裝置,如圖7所示,包括:
第一獲取模塊91,用于分別以數字貨幣錢包的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第一子密鑰索引作為子密鑰索引;
第一派生模塊92,用于根據第一獲取模塊91獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
賬戶密鑰生成模塊93,用于將第一派生模塊92派生的子私鑰、子公鑰和子鏈碼分別作為數字貨幣賬戶的主私鑰、主公鑰和主鏈碼。
一方面,第一派生模塊92可以進一步包括:
第一拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第一拼接數據;
第一哈希單元,用于用父鏈碼作為哈希密鑰,根據預設算法計算所述第一拼接單元得到的第一拼接數據的哈希值;
第一截取單元,用于對所述第一哈希單元得到的第一拼接數據的哈希值進行截取,得到子鏈碼和第一數據;
第一運算單元,用于以預設橢圓曲線的基點的階為模數,對父私鑰和所述第一截取單元得到的第一數據做ECC加法模運算,得到第一運算結果;
第一判斷單元,用于判斷所述第一運算單元得到的第一運算結果是否為預設值;
遞增單元,用于當所述第一判斷單元的判斷結果為是時,將子密鑰索引遞增;
第一密鑰獲取單元,用于當所述第一判斷單元的判斷結果為否時,將所述第一運算單元得到的第一運算結果作為子私鑰,對子私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到子公鑰;
所述父私鑰和所述父公鑰均為所述預設橢圓曲線上的點。
另一方面,第一派生模塊92可以具體包括:
第一比較子模塊,用于比較子密鑰索引和預設值;
第一派生子模塊,用于當所述第一比較子模塊確定子密鑰索引小于預設值時,根據父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
第二派生子模塊,用于當所述第一比較子模塊確定子密鑰索引大于或者等于預設值時,根據父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
其中,第二派生子模塊可以具體包括:
第二拼接單元,用于對父私鑰進行高位端補位,將補位后的父私鑰與子密鑰索引順序拼接得到第二拼接數據;
第二哈希單元,用于用父鏈碼作為哈希密鑰,根據預設算法計算所述第二拼接單元得到的第二拼接數據的哈希值;
第二截取單元,用于對所述第二哈希單元得到的哈希值進行截取,得到子鏈碼和第二數據;
第二運算單元,用于以所述預設橢圓曲線的基點的階為模數,對補位前的父私鑰和所述第二截取單元得到的第二數據做ECC加法模運算,得到第二運算結果;
第二判斷單元,用于判斷第二運算單元得到的第二運算結果是否為預設值;
第二遞增單元,用于當所述第二判斷單元的判斷結果為是時,將子密鑰索引遞增;
第二密鑰獲取單元,用于當所述第二判斷單元的判斷結果為否時,將所述第二運算單元得到的第二運算結果作為子私鑰,對子私鑰和所述預設橢圓曲線的基點做ECC點乘運算,得到子公鑰。
本實施例中,所述裝置還可以包括:錢包密鑰生成模塊94,用于獲取密鑰種子和數字貨幣種子,用所述數字貨幣種子作為哈希密鑰,根據預設算法計算所述密鑰種子的哈希值;對所述密鑰種子的哈希值進行截取,得到數字貨幣錢包的主私鑰和主鏈碼;對所述數字貨幣錢包的主私鑰和所述橢圓曲線的基點做ECC點乘運算,得到數字貨幣錢包的主公鑰。
本實施例中,所述裝置還可以包括:第二獲取模塊95,用于分別以數字貨幣賬戶的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引;相應地:
第一派生模塊92,還用于根據第二獲取模塊95獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
所述裝置還包括:
第三獲取模塊96,用于將第一派生模塊92根據第二獲取模塊95獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的子公鑰和子鏈碼分別作為父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引;
第二派生模塊97,用于根據第三獲取模塊96獲取的父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼;
貨幣收取地址生成模塊98,用于對第二派生模塊97派生的子公鑰進行編碼,得到數字貨幣收取地址。
一方面,第二派生模塊97可以進一步包括:
第三拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第三拼接數據;
第三哈希單元,用于用父鏈碼作為哈希密鑰,根據預設算法計算所述第三拼接單元得到的第三拼接數據的哈希值;
第三截取單元,用于對所述第三哈希單元得到的第三拼接數據的哈希值進行截取,得到子鏈碼和第三數據;
第三運算單元,用于對所述橢圓曲線的基點和所述第三截取單元得到的第三數據進行ECC點乘運算,對父公鑰和ECC點乘運算結果做ECC加法運算;
第三判斷單元,用于判斷第三運算單元得到的ECC加法運算結果是否為預設值;
第三遞增單元,用于當所述第三判斷單元的判斷結果為是時,將子密鑰索引遞增;
第三密鑰獲取單元,用于當所述第三判斷單元的判斷結果為否時,將所述第三運算單元得到的ECC加法運算結果作為子公鑰。
另一方面,第二派生模塊97可以具體包括:
第二比較子模塊,用于比較第三獲取模塊96獲取的子密鑰索引和預設值;
提示子模塊,用于當所述第二比較子模塊確定第三獲取模塊96獲取的子密鑰索引大于或者等于預設值時,提示失敗;
派生子模塊,用于當所述第二比較子模塊確定第三獲取模塊96獲取的子密鑰索引小于預設值時,根據第三獲取模塊96獲取的父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
本實施例中,第三密鑰獲取單元,還可以用于:將子密鑰索引的當前值保存為數字貨幣收取地址索引;相應地:
所述裝置還包括:第四獲取模塊910,用于將第一派生模塊92根據第二獲取模塊95獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的子私鑰、子公鑰和子鏈碼分別作為父私鑰、父公鑰和父鏈碼,將第三密鑰獲取單元中保存的各數字貨幣收取地址索引依次作為子密鑰索引;
第一派生模塊92還用于:根據第四獲取模塊910獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
所述裝置還包括:賬戶貨幣查詢模塊99,用于將第一派生模塊92根據第四獲取模塊910獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的各子公鑰分別進行編碼,得到各數字貨幣收取地址,依次查詢和累加各數字貨幣收取地址中的數字貨幣的數量,得到數字貨幣賬戶的數字貨幣量;
或者,本實施例中,第一派生模塊92,還用于根據第三獲取模塊96獲取的父公鑰、父鏈碼和子密鑰索引派生預設數目的子私鑰、子公鑰和子鏈碼;相應地:
所述裝置還包括:賬戶貨幣查詢模塊99,用于對第一派生模塊92根據第三獲取模塊96獲取的父公鑰、父鏈碼和子密鑰索引派生的預設數目的子私鑰分別進行編碼,得到預設數目的數字貨幣收取地址,依次查詢各數字貨幣收取地址中是否有數字貨幣,當均沒有時將已查詢到的有數字貨幣的數字貨幣收取地址中的數據貨幣數量依次相加,得到數字貨幣賬戶的數字貨幣量。
以上所述的實施例只是本發明較優選的具體實施方式,本領域的技術人員在本發明技術方案范圍內進行的通常變化和替換都應包含在本發明的保護范圍內。