本發(fā)明涉及信息安全領(lǐng)域,尤其涉及適用于數(shù)字貨幣的密鑰派生方法及裝置。
背景技術(shù):
數(shù)字貨幣是電子貨幣形式的替代貨幣,它采用P2P形式,不依靠特定貨幣機構(gòu)發(fā)行,而是依據(jù)特定算法通過大量的計算產(chǎn)生。數(shù)字貨幣經(jīng)濟使用整個P2P網(wǎng)絡(luò)中眾多節(jié)點構(gòu)成的分布式數(shù)據(jù)庫來確認并記錄所有的交易行為,并使用密碼學的設(shè)計來確保貨幣流通各個環(huán)節(jié)的安全性,基于密鑰學的設(shè)計可以使數(shù)字貨幣只能被真實的擁有者轉(zhuǎn)移或支付,確保了貨幣所有權(quán)與流通交易的匿名性。由于數(shù)字貨幣交易的匿名性,用戶每次使用不同的地址接收數(shù)字貨幣,通常地址用ECC公鑰表示,用戶擁有一個錢包,每進行一筆數(shù)字貨幣交易,需要在錢包中保存與該筆交易對應(yīng)的ECC密鑰,然而錢包的空間是有限的,所以需要及時備份錢包中的ECC密鑰。
發(fā)明人在實現(xiàn)本發(fā)明的過程中發(fā)現(xiàn),現(xiàn)有技術(shù)中至少存在以下缺陷:
1、隨著交易次數(shù)的增多,密鑰的備份體積越來越大,不易管理;
2、密鑰損壞后不能恢復(fù),若密鑰數(shù)據(jù)損壞,則與密鑰數(shù)據(jù)對應(yīng)的交易中的數(shù)字貨幣也將無法再消費。
技術(shù)實現(xiàn)要素:
本發(fā)明的目的是克服現(xiàn)有技術(shù)的缺陷,提供適用于數(shù)字貨幣的密鑰派生方法及裝置。
本發(fā)明是通過下述技術(shù)方案實現(xiàn)的:
首先,本發(fā)明提供一種適用于數(shù)字貨幣的密鑰派生方法及裝置。
所述方法包括:根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
所述根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼可以具體包括:
步驟A1、將父公鑰與子密鑰索引順序拼接得到第一拼接數(shù)據(jù);用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第一拼接數(shù)據(jù)的哈希值;
步驟A2、對所述第一拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第一數(shù)據(jù),以預(yù)設(shè)橢圓曲線的基點的階為模數(shù),對父私鑰和所述第一數(shù)據(jù)做ECC加法模運算,得到第一運算結(jié)果;
步驟A3、判斷所述第一運算結(jié)果是否為預(yù)設(shè)值,是則將子密鑰索引遞增,根據(jù)父私鑰、父公鑰、父鏈碼和遞增后的子密鑰索引重新派生子私鑰、子公鑰和子鏈碼;否則將所述第一運算結(jié)果作為子私鑰,對子私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到子公鑰;
所述父私鑰和所述父公鑰均為所述預(yù)設(shè)橢圓曲線上的點。
進一步地,所述步驟A1之前還可以包括:比較子密鑰索引和預(yù)設(shè)值,當子密鑰索引小于所述預(yù)設(shè)值時,執(zhí)行步驟A1,否則根據(jù)父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
所述根據(jù)父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼可以具體包括:
步驟B1、對父私鑰進行高位端補位,將補位后的父私鑰與子密鑰索引順序拼接得到第二拼接數(shù)據(jù);用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第二拼接數(shù)據(jù)的哈希值;
步驟B2、對所述第二拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第二數(shù)據(jù),以所述預(yù)設(shè)橢圓曲線的基點的階為模數(shù),對補位前的父私鑰和所述第二數(shù)據(jù)做ECC加法模運算,得到第二運算結(jié)果;
步驟B3、判斷所述第二運算結(jié)果是否為預(yù)設(shè)值,是則將子密鑰索引遞增,根據(jù)父私鑰、父鏈碼和遞增后的子密鑰索引重新派生子私鑰、子公鑰和子鏈碼;否則將所述第二運算結(jié)果作為子私鑰,對子私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到子公鑰。
進一步地,所述方法還可以包括:根據(jù)父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
所述根據(jù)父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼可以具體包括:
步驟C1、將父公鑰與子密鑰索引順序拼接得到第三拼接數(shù)據(jù);用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第三拼接數(shù)據(jù)的哈希值;
步驟C2、對所述第三拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第三數(shù)據(jù),對所述預(yù)設(shè)橢圓曲線的基點和所述第三數(shù)據(jù)進行ECC點乘運算,對父公鑰和ECC點乘運算結(jié)果做ECC加法運算;
步驟C3、判斷ECC加法運算結(jié)果是否為預(yù)設(shè)值,是則將子密鑰索引遞增,根據(jù)父公鑰、父鏈碼和遞增后的子密鑰索引重新派生子公鑰和子鏈碼;否則將所述ECC加法運算結(jié)果作為子公鑰。
所述步驟C1之前還可以包括:比較子密鑰索引和預(yù)設(shè)值,當子密鑰索引小于所述預(yù)設(shè)值時,執(zhí)行步驟C1,否則提示失敗。
本方法中,所述父私鑰為主私鑰或上一級子私鑰;所述父公鑰為主公鑰或上一級子公鑰;所述父鏈碼為主鏈碼或上一級子鏈碼。
進一步地,所述方法中還可以包括:生成主私鑰、主公鑰和主鏈碼。
所述生成主私鑰、主公鑰和主鏈碼可以具體包括:
步驟D1、獲取一個偽隨機數(shù)作為密鑰種子,用預(yù)設(shè)字符串作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述密鑰種子的哈希值;
步驟D2、對所述密鑰種子的哈希值進行截取,得到主鏈碼和主私鑰;
步驟D3、對所述主私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到主公鑰。
所述裝置,包括:第一派生模塊,用于根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
所述第一派生模塊可以具體包括:
第一拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第一拼接數(shù)據(jù);
第一哈希單元,用于用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第一拼接單元得到的第一拼接數(shù)據(jù)的哈希值;
第一截取單元,用于對所述第一哈希單元得到的第一拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第一數(shù)據(jù);
第一運算單元,用于以預(yù)設(shè)橢圓曲線的基點的階為模數(shù),對父私鑰和所述第一截取單元得到的第一數(shù)據(jù)做ECC加法模運算,得到第一運算結(jié)果;
第一判斷單元,用于判斷所述第一運算單元得到的第一運算結(jié)果是否為預(yù)設(shè)值;
第一遞增單元,用于當所述第一判斷單元的判斷結(jié)果為是時,將子密鑰索引遞增;
第一密鑰獲取單元,用于當所述第一判斷單元的判斷結(jié)果為否時,將所述第一運算單元得到的第一運算結(jié)果作為子私鑰,對子私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到子公鑰。
所述父私鑰和所述父公鑰均為所述預(yù)設(shè)橢圓曲線上的點。
進一步地,所述裝置還可以包括:
第一比較模塊,用于比較子密鑰索引和預(yù)設(shè)值;
第二派生模塊,用于當所述第一比較模塊確定子密鑰索引大于或者等于預(yù)設(shè)值時,根據(jù)父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
相應(yīng)地,所述第一派生模塊,具體用于當所述第一比較模塊確定子密鑰索引小于預(yù)設(shè)值時,根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
所述第二派生模塊可以具體包括:
第二拼接單元,用于對父私鑰進行高位端補位,將補位后的父私鑰與子密鑰索引順序拼接得到第二拼接數(shù)據(jù);
第二哈希單元,用于用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第二拼接單元得到的第二拼接數(shù)據(jù)的哈希值;
第二截取單元,用于對所述第二哈希單元得到的哈希值進行截取,得到子鏈碼和第二數(shù)據(jù);
第二運算單元,用于以所述預(yù)設(shè)橢圓曲線的基點的階為模數(shù),對補位前的父私鑰和所述第二截取單元得到的第二數(shù)據(jù)做ECC加法模運算,得到第二運算結(jié)果;
第二判斷單元,用于判斷所述第二運算單元得到的第二運算結(jié)果是否為預(yù)設(shè)值;
第二遞增單元,用于當所述第二判斷單元的判斷結(jié)果為是時,將子密鑰索引遞增;
第二密鑰獲取單元,用于當所述第二判斷單元的判斷結(jié)果為否時,將所述第二運算單元得到的第二運算結(jié)果作為子私鑰,對子私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到子公鑰。
進一步地,所述裝置還可以包括:第三派生模塊,用于根據(jù)父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
所述第三派生模塊可以具體包括:
第三拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第三拼接數(shù)據(jù);
第三哈希單元,用于用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第三拼接單元得到的第三拼接數(shù)據(jù)的哈希值;
第三截取單元,用于對所述第三哈希單元得到的第三拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第三數(shù)據(jù);
第三運算單元,用于對所述預(yù)設(shè)橢圓曲線的基點和所述第三截取單元得到的第三數(shù)據(jù)進行ECC點乘運算,對父公鑰和ECC點乘運算結(jié)果做ECC加法運算;
第三判斷單元,用于判斷第三運算單元得到的ECC加法運算結(jié)果是否為預(yù)設(shè)值;
第三遞增單元,用于當所述第三判斷單元的判斷結(jié)果為是時,將子密鑰索引遞增;
第三密鑰獲取單元,用于當所述第三判斷單元的判斷結(jié)果為否時,將所述第三運算單元得到的ECC加法運算結(jié)果作為子公鑰。
更進一步地,所述裝置還可以包括:
第二比較模塊,用于比較子密鑰索引和預(yù)設(shè)值;
提示模塊,用于當所述第二比較模塊確定子密鑰索引大于或者等于預(yù)設(shè)值時,提示失敗;
相應(yīng)地,所述第三派生模塊,具體用于當所述第二比較模塊確定子密鑰索引小于預(yù)設(shè)值時,根據(jù)父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
本裝置中,所述第一派生模塊可以具體用于:將主私鑰、主公鑰和主鏈碼分別作為父私鑰、父公鑰和父鏈碼,或者將上一級子私鑰、上一級子公鑰和上一級子鏈碼分別作為父私鑰、父公鑰和父鏈碼,根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
進一步地,所述裝置還可以包括:生成模塊,用于生成主私鑰、主公鑰和主鏈碼。
所述生成模塊,可以具體包括:
第四哈希單元,用于獲取一個偽隨機數(shù)作為密鑰種子,用預(yù)設(shè)字符串作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述密鑰種子的哈希值;
第四截取單元,用于對所述第四哈希單元得到的密鑰種子的哈希值進行截取,得到主鏈碼和主私鑰;
第四運算單元,用于對所述第四截取單元得到的主私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到主公鑰。
其次,本發(fā)明提供另一種適用于數(shù)字貨幣的密鑰派生方法及裝置。
所述方法包括:分別以數(shù)字貨幣錢包的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第一子密鑰索引作為子密鑰索引,根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,將派生得到的子私鑰、子公鑰和子鏈碼分別作為數(shù)字貨幣賬戶的主私鑰、主公鑰和主鏈碼。
本方法中,所述根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,可以具體包括:
步驟A1、將父公鑰與子密鑰索引順序拼接得到第一拼接數(shù)據(jù);用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第一拼接數(shù)據(jù)的哈希值;
步驟A2、對所述第一拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第一數(shù)據(jù),以預(yù)設(shè)橢圓曲線的基點的階為模數(shù),對父私鑰和所述第一數(shù)據(jù)做ECC加法模運算,得到第一運算結(jié)果;
步驟A3、判斷所述第一運算結(jié)果是否為預(yù)設(shè)值,是則將子密鑰索引遞增,根據(jù)父私鑰、父公鑰、父鏈碼和遞增后的子密鑰索引重新派生子私鑰、子公鑰和子鏈碼;否則將所述第一運算結(jié)果作為子私鑰,對子私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到子公鑰;
所述父私鑰和所述父公鑰均為所述預(yù)設(shè)橢圓曲線上的點。
所述步驟A1之前還可以包括:比較子密鑰索引和預(yù)設(shè)值,當子密鑰索引小于所述預(yù)設(shè)值時,執(zhí)行步驟A1,否則根據(jù)父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
所述根據(jù)父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼可以具體包括:
步驟B1、對父私鑰進行高位端補位,將補位后的父私鑰與子密鑰索引順序拼接得到第二拼接數(shù)據(jù);用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第二拼接數(shù)據(jù)的哈希值;
步驟B2、對所述第二拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第二數(shù)據(jù),以所述預(yù)設(shè)橢圓曲線的基點的階為模數(shù),對補位前的父私鑰和所述第二數(shù)據(jù)做ECC加法模運算,得到第二運算結(jié)果;
步驟B3、判斷所述第二運算結(jié)果是否為預(yù)設(shè)值,是則將子密鑰索引遞增,根據(jù)父私鑰、父鏈碼和遞增后的子密鑰索引重新派生子私鑰、子公鑰和子鏈碼;否則將所述第二運算結(jié)果作為子私鑰,對子私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到子公鑰。
進一步地,所述方法還可以包括:獲取密鑰種子和數(shù)字貨幣種子,用所述數(shù)字貨幣種子作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述密鑰種子的哈希值;對所述密鑰種子的哈希值進行截取,得到數(shù)字貨幣錢包的主私鑰和主鏈碼;對所述數(shù)字貨幣錢包的主私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到數(shù)字貨幣錢包的主公鑰。
所述方法還可以包括:
步驟1-1、分別以數(shù)字貨幣賬戶的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引,根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,將派生得到的子私鑰、子公鑰和子鏈碼分別作為第一子私鑰、第一子公鑰和第一子鏈碼;
步驟1-2、分別以所述第一子公鑰和所述第一子鏈碼為父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引,根據(jù)父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼,將派生得到的子公鑰作為第二子公鑰;
步驟1-3、對所述第二子公鑰進行編碼,得到數(shù)字貨幣收取地址。
本方法中,所述根據(jù)父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼,可以具體包括:
步驟C1、將父公鑰與子密鑰索引順序拼接得到第三拼接數(shù)據(jù);用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第三拼接數(shù)據(jù)的哈希值;
步驟C2、對所述第三拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第三數(shù)據(jù),對所述預(yù)設(shè)橢圓曲線的基點和所述第三數(shù)據(jù)進行ECC點乘運算,對父公鑰和ECC點乘運算結(jié)果做ECC加法運算;
步驟C3、判斷ECC加法運算的結(jié)果是否為預(yù)設(shè)值,是則將子密鑰索引遞增,根據(jù)父公鑰、父鏈碼和遞增后的子密鑰索引重新派生子公鑰和子鏈碼;否則將ECC加法運算的結(jié)果作為子公鑰。
所述步驟C1之前還可以包括:比較子密鑰索引和預(yù)設(shè)值,當子密鑰索引小于所述預(yù)設(shè)值時,執(zhí)行步驟C1,否則提示失敗。
所述步驟C3中,當判斷ECC加法運算的結(jié)果不為預(yù)設(shè)值時,還包括:將子密鑰索引的當前值保存為數(shù)字貨幣收取地址索引;
相應(yīng)地,所述方法還可以包括:
步驟2-1、分別以數(shù)字貨幣賬戶的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引,根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,將派生得到的子私鑰、子公鑰和子鏈碼分別作為第一子私鑰、第一子公鑰和第一子鏈碼;
步驟2-2、分別以所述第一子私鑰、第一子公鑰和第一子鏈碼為父私鑰、父公鑰和父鏈碼,將各已保存的數(shù)字貨幣收取地址索引依次作為子密鑰索引,根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,將派生得到的子公鑰作為第二子公鑰;
步驟2-3、對各第二子公鑰分別進行編碼,得到各數(shù)字貨幣收取地址;
步驟2-4、依次查詢和累加各數(shù)字貨幣收取地址中的數(shù)字貨幣的數(shù)量,得到數(shù)字貨幣賬戶的數(shù)字貨幣量。
進一步地,所述方法還可以包括:
步驟3-1、分別以數(shù)字貨幣賬戶的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引,根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,將派生得到的子私鑰、子公鑰和子鏈碼分別作為第一子私鑰、第一子公鑰和第一子鏈碼;
步驟3-2、分別以所述第一子私鑰、第一子公鑰和第一子鏈碼為父私鑰、父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引,根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼,得到預(yù)設(shè)數(shù)目的第二子私鑰、第二子公鑰和第二子鏈碼;
步驟3-3、對各第二子公鑰分別進行編碼,得到預(yù)設(shè)數(shù)目的數(shù)字貨幣收取地址;
步驟3-4、依次查詢各數(shù)字貨幣收取地址中是否有數(shù)字貨幣,若均沒有則將已查詢到的有數(shù)字貨幣的數(shù)字貨幣收取地址中的數(shù)據(jù)貨幣數(shù)量依次相加,得到數(shù)字貨幣賬戶的數(shù)字貨幣量;否則返回步驟3-2得到新的預(yù)設(shè)數(shù)目的第二子私鑰、第二子公鑰和第二子鏈碼,然后執(zhí)行步驟3-3。
所述裝置包括:
第一獲取模塊,用于分別以數(shù)字貨幣錢包的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第一子密鑰索引作為子密鑰索引;
第一派生模塊,用于根據(jù)所述第一獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
賬戶密鑰生成模塊,用于將所述第一派生模塊派生的子私鑰、子公鑰和子鏈碼分別作為數(shù)字貨幣賬戶的主私鑰、主公鑰和主鏈碼。
一方面,本裝置中,所述第一派生模塊可以具體包括:
第一拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第一拼接數(shù)據(jù);
第一哈希單元,用于用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第一拼接單元得到的第一拼接數(shù)據(jù)的哈希值;
第一截取單元,用于對所述第一哈希單元得到的第一拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第一數(shù)據(jù);
第一運算單元,用于以預(yù)設(shè)橢圓曲線的基點的階為模數(shù),對父私鑰和所述第一截取單元得到的第一數(shù)據(jù)做ECC加法模運算,得到第一運算結(jié)果;
第一判斷單元,用于判斷所述第一運算單元得到的第一運算結(jié)果是否為預(yù)設(shè)值;
遞增單元,用于當所述第一判斷單元的判斷結(jié)果為是時,將子密鑰索引遞增;
第一密鑰獲取單元,用于當所述第一判斷單元的判斷結(jié)果為否時,將所述第一運算單元得到的第一運算結(jié)果作為子私鑰,對子私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到子公鑰;
所述父私鑰和所述父公鑰均為所述預(yù)設(shè)橢圓曲線上的點。
另一方面,所述第一派生模塊,可以具體包括:
第一比較子模塊,用于比較子密鑰索引和預(yù)設(shè)值;
第一派生子模塊,用于當所述第一比較子模塊確定子密鑰索引小于預(yù)設(shè)值時,根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
第二派生子模塊,用于當所述第一比較子模塊確定子密鑰索引大于或者等于預(yù)設(shè)值時,根據(jù)父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
所述第二派生子模塊可以具體包括:
第二拼接單元,用于對父私鑰進行高位端補位,將補位后的父私鑰與子密鑰索引順序拼接得到第二拼接數(shù)據(jù);
第二哈希單元,用于用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第二拼接單元得到的第二拼接數(shù)據(jù)的哈希值;
第二截取單元,用于對所述第二哈希單元得到的哈希值進行截取,得到子鏈碼和第二數(shù)據(jù);
第二運算單元,用于以所述預(yù)設(shè)橢圓曲線的基點的階為模數(shù),對補位前的父私鑰和所述第二截取單元得到的第二數(shù)據(jù)做ECC加法模運算,得到第二運算結(jié)果;
第二判斷單元,用于判斷第二運算單元得到的第二運算結(jié)果是否為預(yù)設(shè)值;
第二遞增單元,用于當所述第二判斷單元的判斷結(jié)果為是時,將子密鑰索引遞增;
第二密鑰獲取單元,用于當所述第二判斷單元的判斷結(jié)果為否時,將所述第二運算單元得到的第二運算結(jié)果作為子私鑰,對子私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到子公鑰。
進一步地,所述裝置還可以包括:錢包密鑰生成模塊,用于獲取密鑰種子和數(shù)字貨幣種子,用所述數(shù)字貨幣種子作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述密鑰種子的哈希值;對所述密鑰種子的哈希值進行截取,得到數(shù)字貨幣錢包的主私鑰和主鏈碼;對所述數(shù)字貨幣錢包的主私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到數(shù)字貨幣錢包的主公鑰。
所述裝置還可以包括:第二獲取模塊,用于分別以數(shù)字貨幣賬戶的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引;
相應(yīng)地,所述第一派生模塊,還用于根據(jù)所述第二獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
所述裝置還包括:第三獲取模塊、第二派生模塊和貨幣收取地址生成模塊;
所述第三獲取模塊,用于將所述第一派生模塊根據(jù)所述第二獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的子公鑰和子鏈碼分別作為父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引;
所述第二派生模塊,用于根據(jù)所述第三獲取模塊獲取的父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼;
所述貨幣收取地址生成模塊,用于對所述第二派生模塊派生的子公鑰進行編碼,得到數(shù)字貨幣收取地址。
一方面,所述第二派生模塊,可以具體包括:
第三拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第三拼接數(shù)據(jù);
第三哈希單元,用于用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第三拼接單元得到的第三拼接數(shù)據(jù)的哈希值;
第三截取單元,用于對所述第三哈希單元得到的第三拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第三數(shù)據(jù);
第三運算單元,用于對所述橢圓曲線的基點和所述第三截取單元得到的第三數(shù)據(jù)進行ECC點乘運算,對父公鑰和ECC點乘運算結(jié)果做ECC加法運算;
第三判斷單元,用于判斷第三運算單元得到的ECC加法運算結(jié)果是否為預(yù)設(shè)值;
第三遞增單元,用于當所述第三判斷單元的判斷結(jié)果為是時,將子密鑰索引遞增;
第三密鑰獲取單元,用于當所述第三判斷單元的判斷結(jié)果為否時,將所述第三運算單元得到的ECC加法運算結(jié)果作為子公鑰。
另一方面,所述第二派生模塊可以具體包括:
第二比較子模塊,用于比較所述第三獲取模塊獲取的子密鑰索引和預(yù)設(shè)值;
提示子模塊,用于當所述第二比較子模塊確定所述第三獲取模塊獲取的子密鑰索引大于或者等于預(yù)設(shè)值時,提示失敗;
派生子模塊,用于當所述第二比較子模塊確定所述第三獲取模塊獲取的子密鑰索引小于預(yù)設(shè)值時,根據(jù)所述第三獲取模塊獲取的父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
進一步地,所述第三密鑰獲取單元還用于:將子密鑰索引的當前值保存為數(shù)字貨幣收取地址索引;相應(yīng)地:
所述裝置還包括:第四獲取模塊,用于將所述第一派生模塊根據(jù)所述第二獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的子私鑰、子公鑰和子鏈碼分別作為父私鑰、父公鑰和父鏈碼,將所述第三密鑰獲取單元中保存的各數(shù)字貨幣收取地址索引依次作為子密鑰索引;
所述第一派生模塊還用于:根據(jù)所述第四獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
所述裝置還包括:賬戶貨幣查詢模塊,用于將所述第一派生模塊根據(jù)所述第四獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的各子公鑰分別進行編碼,得到各數(shù)字貨幣收取地址,依次查詢和累加各數(shù)字貨幣收取地址中的數(shù)字貨幣的數(shù)量,得到數(shù)字貨幣賬戶的數(shù)字貨幣量;
或者,進一步地:
所述裝置還包括:第二獲取模塊,用于以數(shù)字貨幣賬戶的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引;
所述第一派生模塊,還用于根據(jù)所述第二獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
所述裝置還包括:第三獲取模塊,用于將所述第一派生模塊根據(jù)所述第二獲取模塊獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的子公鑰和子鏈碼分別作為父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引;
所述第一派生模塊,還用于根據(jù)所述第三獲取模塊獲取的父公鑰、父鏈碼和子密鑰索引派生預(yù)設(shè)數(shù)目的子私鑰、子公鑰和子鏈碼;
所述裝置還包括:貨幣收取地址生成模塊,用于對所述第一派生模塊根據(jù)所述第三獲取模塊獲取的父公鑰、父鏈碼和子密鑰索引派生的預(yù)設(shè)數(shù)目的子私鑰分別進行編碼,得到預(yù)設(shè)數(shù)目的數(shù)字貨幣收取地址,依次查詢各數(shù)字貨幣收取地址中是否有數(shù)字貨幣,當均沒有時將已查詢到的有數(shù)字貨幣的數(shù)字貨幣收取地址中的數(shù)據(jù)貨幣數(shù)量依次相加,得到數(shù)字貨幣賬戶的數(shù)字貨幣量。
本發(fā)明的有益效果在于:采用本發(fā)明提供的技術(shù)方案,根據(jù)密鑰種子能夠衍生出全部密鑰,因此只需要備份密鑰種子,而不需要備份根據(jù)密鑰種子派生出的子密鑰,所述備份體積不會隨密鑰的增多而變大,易于管理,并且能夠避免密鑰損壞給用戶造成損失。進一步地有益效果是,可以在不暴露私鑰的前提下實現(xiàn)子公鑰的派生,提高了密鑰使用的安全性。
附圖說明
為了更清楚的說明本發(fā)明實施例或現(xiàn)有技術(shù)中的技術(shù)方案,下面將對實施例或現(xiàn)有技術(shù)描述中所需要使用的附圖作簡單的介紹,顯而易見地,下面描述中的附圖僅僅是本發(fā)明的一些實施例,對于本領(lǐng)域普通技術(shù)人員來講,在不付出創(chuàng)造性勞動的前提下,還可以根據(jù)這些附圖獲得其他的附圖。
圖1為本發(fā)明實施例1中提供的主密鑰和主鏈碼的生成方法的流程圖;
圖2為本發(fā)明實施例1中提供的子私鑰、子公鑰和子鏈碼的生成方法的流程圖;
圖3為本發(fā)明實施例1中提供的子公鑰和子鏈碼的生成方法的流程圖;
圖4為查詢數(shù)字貨幣賬戶的數(shù)字貨幣量的一種方法流程圖;
圖5為查詢數(shù)字貨幣賬戶的數(shù)字貨幣量的另一種方法流程圖;
圖6為本發(fā)明實施例2提供的一種適用于數(shù)字貨幣的密鑰派生裝置的方框圖;
圖7為本發(fā)明實施例3提供的一種適用于數(shù)字貨幣的密鑰派生裝置的方框圖。
具體實施方式
下面將結(jié)合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術(shù)方案進行清楚、完整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例。基于本發(fā)明中的實施例,本領(lǐng)域技術(shù)人員在沒有做出創(chuàng)造性勞動前提下所獲得的所有其他實施例,都屬于本發(fā)明保護的范圍。
在進行具體說明之前,對ECC和HMAC進行簡單的說明,如下:
ECC(Elliptic Curve Cryptography,橢圓曲線密碼學)是基于橢圓曲線數(shù)學的一種公鑰密碼的方法。密碼學中,描述一條橢圓曲線,常用到六個參量:T=(p,a,b,G,n,h),其中p、a、b用于確定一條橢圓曲線,G為橢圓曲線的基點,n為G的階(即nG=0(無窮遠點)),h是橢圓曲線上所有點的個數(shù)m與n相除所得結(jié)果的整數(shù)部分。
HMAC(Hash-based Message Authentication Code,密鑰相關(guān)的哈希運算消息認證碼)運算運用哈希算法,以一個密鑰和一個消息為輸入,生成一個消息摘要作為輸出,當運用的哈希算法具體為SHA512時,HMAC記作HMAC-SHA512。
實施例1
本實施例提供一種適用于數(shù)字貨幣的密鑰派生方法,采用本實施例提供的方法派生出的密鑰呈樹狀結(jié)構(gòu),樹的根部為主密鑰和主鏈碼,以主密鑰為父密鑰、主鏈碼為父鏈碼生成的子密鑰和子鏈碼為樹的第一級密鑰和第一級鏈碼,以第一級密鑰為父密鑰、第一級鏈碼為父鏈碼生成的子密鑰和子鏈碼為樹的第二級密鑰和第二級鏈碼,以此類推。
根據(jù)父密鑰生成子密鑰時引入子密鑰索引,根據(jù)不同的子密鑰索引生成不同的子密鑰,子密鑰索引與子密鑰是一一對應(yīng)的。
所述方法具體包括:
1、主私鑰、主公鑰和主鏈碼的派生過程,如圖1所示,包括:
步驟101、使用偽隨機數(shù)生成器生成一個偽隨機數(shù)作為密鑰種子。
例如,偽隨機數(shù)生成器生成的偽隨機數(shù)為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、使用預(yù)設(shè)字符串作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算密鑰種子的哈希值;
本實施例中,預(yù)設(shè)算法優(yōu)選為HMAC-SHA512算法。
例如,預(yù)設(shè)字符串為“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、將計算得到的哈希值的高位端預(yù)設(shè)長度的數(shù)據(jù)作為主私鑰,低位端預(yù)設(shè)長度的數(shù)據(jù)作為主鏈碼;
本實施例中,高位端預(yù)設(shè)長度的數(shù)據(jù)優(yōu)選為高256比特的數(shù)據(jù),低位端預(yù)設(shè)長度的數(shù)據(jù)優(yōu)選為低256比特的數(shù)據(jù)。
例如,計算得到的哈希值如步驟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點乘運算結(jié)果作為主公鑰。
即本實施例中,主公鑰=主私鑰*橢圓曲線基點。
例如,主私鑰如步驟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點乘運算結(jié)果如下:
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點乘運算結(jié)果作為主公鑰時,需在ECC點乘運算結(jié)果前添加一個字節(jié)04,用于表示主公鑰的格式為未壓縮;
例如,ECC點乘運算結(jié)果如上例舉,為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、比較當前子密鑰索引和預(yù)設(shè)值,若當前子密鑰索引小于預(yù)設(shè)值則執(zhí)行步驟202,否則執(zhí)行步驟208;
具體地,子密鑰索引的長度為32比特,初始值為00 00 00 00,每根據(jù)子密鑰索引進行一次計算,將子密鑰索引遞增,例如加1。
本實施例中,預(yù)設(shè)值優(yōu)選為80 00 00 00。
步驟202、將父公鑰和當前子密鑰索引分別作為高位端數(shù)據(jù)和低位端數(shù)據(jù)進行拼接;
例如,父公鑰為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,則將父公鑰和當前子密鑰索引分別作為高位端數(shù)據(jù)和低位端數(shù)據(jù)進行拼接,拼接得到的數(shù)據(jù)如下:
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、用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算拼接得到的數(shù)據(jù)的哈希值;
本實施例中,預(yù)設(shè)算法優(yōu)選為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,拼接得到的數(shù)據(jù)如步驟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,則用父鏈碼作密鑰,根據(jù)HMAC-SHA512算法計算拼接得到的數(shù)據(jù)的哈希值,得到:
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、將計算得到的哈希值的低位端預(yù)設(shè)長度的數(shù)據(jù)作為子鏈碼,以橢圓曲線基點的階為模對父私鑰和計算得到的哈希值的告我段預(yù)設(shè)長度的數(shù)據(jù)做ECC加法模運算;
本實施例中,高位端預(yù)設(shè)長度的數(shù)據(jù)優(yōu)選為高256比特的數(shù)據(jù),低位端預(yù)設(shè)長度的數(shù)據(jù)優(yōu)選為低256比特的數(shù)據(jù)。
例如,計算得到的哈希值如步驟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加法模運算的結(jié)果是否為預(yù)設(shè)值,是則執(zhí)行步驟206,否則執(zhí)行步驟207;
即本實施例中,判斷(父私鑰+left hash)%n的結(jié)果是否為預(yù)設(shè)值,其中,left hash為計算得到的哈希值的高256比特,n為橢圓曲線基點的階。
本實施例中,預(yù)設(shè)值優(yōu)選為0。
步驟206、將當前子密鑰索引遞增,返回步驟201;
具體地,將當前子密鑰索引自加1。
步驟207、將ECC加法模運算的結(jié)果作為子私鑰,對子私鑰和橢圓曲線基點做ECC點乘運算,將運算結(jié)果作為子公鑰。
即本實施例中,子公鑰=子私鑰*橢圓曲線基點。
例如,ECC加法模運算的結(jié)果如步驟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加法模運算的結(jié)果作為子私鑰,得到的子私鑰如下:
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點乘運算結(jié)果如下:
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點乘運算結(jié)果作為子公鑰時,需在ECC點乘運算結(jié)果前添加一個字節(jié)04,用于表示子公鑰的格式為未壓縮;
例如,ECC點乘運算結(jié)果如上例舉,為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點乘運算結(jié)果作為子公鑰,得到的子公鑰如下:
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、在父私鑰的高位端補位;
本實施例中,補位數(shù)據(jù)優(yōu)選為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,補位數(shù)據(jù)為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、將補位后的父私鑰和當前子密鑰索引分別作為高位端數(shù)據(jù)和低位端數(shù)據(jù)進行拼接;
例如,補位后的父私鑰如步驟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,則將補位后的父私鑰和當前子密鑰索引分別作為高位端數(shù)據(jù)和低位端數(shù)據(jù)進行拼接,拼接得到的數(shù)據(jù)如下:
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、使用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算拼接得到的數(shù)據(jù)的哈希值;
本實施例中,預(yù)設(shè)算法優(yōu)選為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,拼接得到的數(shù)據(jù)如步驟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,則使用父鏈碼作為哈希密鑰,根據(jù)HMAC-SHA512算法計算拼接得到的數(shù)據(jù)的哈希值,得到的哈希值如下:
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、將計算得到的哈希值的低位端預(yù)設(shè)長度的數(shù)據(jù)作為子鏈碼,以橢圓曲線基點的階為模對補位前的父私鑰和計算得到的哈希值的高位端預(yù)設(shè)長度的數(shù)據(jù)做ECC加法模運算;
本實施例中,高位端預(yù)設(shè)長度的數(shù)據(jù)優(yōu)選為高256比特的數(shù)據(jù),低位端預(yù)設(shè)長度的數(shù)據(jù)優(yōu)選為低256比特的數(shù)據(jù)。
例如,計算得到的哈希值如步驟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加法模運算的結(jié)果如下:
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加法模運算的結(jié)果是否為預(yù)設(shè)值,是則執(zhí)行步驟213,否則執(zhí)行步驟214;
即本實施例中,判斷(補位前的父私鑰+left hash)%n的結(jié)果是否為預(yù)設(shè)值,其中,left hash為計算得到的哈希值的高256比特,n為橢圓曲線基點的階。
本實施例中,預(yù)設(shè)值優(yōu)選為0。
步驟213、將當前子密鑰索引遞增,返回步驟209;
具體地,將當前子密鑰索引自加1。
步驟214、將ECC加法模運算的結(jié)果作為子私鑰,對子私鑰和橢圓曲線基點做ECC點乘運算,將ECC點乘運算結(jié)果作為子公鑰。
即本實施例中,子公鑰=子私鑰*橢圓曲線基點。
例如,ECC加法模運算的結(jié)果如步驟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加法模運算的結(jié)果作為子私鑰,得到子私鑰為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點乘運算結(jié)果為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點乘運算結(jié)果作為子公鑰時,需在ECC點乘運算結(jié)果前添加一個字節(jié)04,用于表示子公鑰的格式為未壓縮;
例如,ECC點乘運算結(jié)果如上例舉,為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點乘運算結(jié)果作為子公鑰,得到子公鑰如下:
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、比較當前子密鑰索引和預(yù)設(shè)值,若當前子密鑰索引小于預(yù)設(shè)值則執(zhí)行步驟302,否則提示失?。?/p>
本實施例中,預(yù)設(shè)值優(yōu)選為80 00 00 00。
步驟302、將父公鑰和當前子密鑰索引分別作為高位端數(shù)據(jù)和低位端數(shù)據(jù)進行拼接;
例如,父公鑰為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,則將父公鑰和當前子密鑰索引分別作為高位端數(shù)據(jù)和低位端數(shù)據(jù)進行拼接,拼接得到的數(shù)據(jù)如下:
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、使用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算拼接得到的數(shù)據(jù)的哈希值;
本實施例中,預(yù)設(shè)算法優(yōu)選為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,拼接得到的數(shù)據(jù)如步驟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,則使用父鏈碼作為哈希密鑰,根據(jù)HMAC-SHA512算法計算拼接得到的數(shù)據(jù)的哈希值,計算得到的哈希值如下:
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、將計算得到的哈希值的低位端預(yù)設(shè)長度的數(shù)據(jù)作為子鏈碼;
本實施例中,低位端預(yù)設(shè)長度的數(shù)據(jù)優(yōu)選為低256比特的數(shù)據(jù)。
例如,計算得到的哈希值如步驟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、對橢圓曲線基點和計算得到的哈希值的高位端預(yù)設(shè)長度的數(shù)據(jù)做ECC點乘運算,對父公鑰和ECC點乘運算結(jié)果做ECC加法運算;
本實施例中,高位端預(yù)設(shè)長度的數(shù)據(jù)優(yōu)選為高256比特的數(shù)據(jù)。
例如,橢圓曲線基點為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點乘運算結(jié)果做ECC加法運算,得到的ECC加法運算結(jié)果為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加法運算的結(jié)果是否為預(yù)設(shè)值,是則執(zhí)行步驟307,否則執(zhí)行步驟308;
即本實施例中,判斷父公鑰+G*left hash的結(jié)果是否為預(yù)設(shè)值,其中,G為橢圓曲線基點,left hash為計算得到的哈希值的高256比特。
本實施例中,預(yù)設(shè)值優(yōu)選為0。
步驟307、將當前子密鑰索引遞增,返回步驟301;
具體地,將當前子密鑰索引自加1。
步驟308、將ECC加法運算的結(jié)果作為子公鑰。
本實施例中的公鑰采用未壓縮格式,即將ECC點乘運算結(jié)果作為子公鑰時,需在ECC點乘運算結(jié)果前添加一個字節(jié)04,用于表示子公鑰的格式為未壓縮;
例如,ECC加法運算結(jié)果如步驟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加法運算的結(jié)果作為子公鑰,得到的子公鑰如下:
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)根據(jù)相同的父密鑰、父鏈碼、子密鑰索引派生得到的子公鑰相同。
本實施例以數(shù)字貨幣交易為應(yīng)用場景,提供一種具體實施方式,具體包括:
初始化數(shù)字貨幣錢包(以下將數(shù)字貨幣錢包簡稱為錢包):
步驟401、獲取密鑰種子和數(shù)字貨幣種子;
步驟402、用數(shù)字貨幣種子作為哈希密鑰,根據(jù)HMAC-SHA512算法計算密鑰種子的哈希值,將密鑰種子的哈希值的高256比特作為錢包的主私鑰,低256比特作為錢包的主鏈碼;
步驟403、對錢包的主私鑰和橢圓曲線基點做ECC點乘運算,將ECC點乘運算結(jié)果作為錢包的主公鑰;
步驟404、分別將錢包的主私鑰、主公鑰和主鏈碼作為父私鑰、父公鑰和父鏈碼,將第一子密鑰索引作為子密鑰索引,派生子私鑰、子公鑰和子鏈碼,將派生得到的子私鑰、子公鑰和子鏈碼分別作為錢包中數(shù)字貨幣賬戶的主私鑰、主公鑰和主鏈碼;
本實施例中,數(shù)字貨幣錢包中可以有多個數(shù)字貨幣賬戶,對應(yīng)不同類型的數(shù)字貨幣。
具體地,本實施例步驟404中,采用上述方法1)派生子私鑰、子公鑰和子鏈碼。
步驟405、分別將錢包比特幣賬戶的主私鑰、主公鑰和主鏈碼作為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引,派生子私鑰、子公鑰和子鏈碼,將派生得到的子私鑰、子公鑰和子鏈碼分別作為錢包數(shù)字貨幣賬戶的第一子私鑰、第一子公鑰和第一子鏈碼。
具體地,本實施例步驟405中,采用上述方法1)派生子私鑰、子公鑰和子鏈碼。
生成數(shù)字貨幣收取地址:
步驟501、獲取錢包數(shù)字貨幣賬戶的第一子公鑰和第一子鏈碼;
步驟502、分別將數(shù)字貨幣賬戶的第一子公鑰和第一子鏈碼作為父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引,派生子公鑰和子鏈碼,對派生得到的子公鑰進行編碼,得到數(shù)字貨幣收取地址。
具體地,本實施例中,第三子密鑰索引為一個變化的值,其初始值為00 00 0000,每根據(jù)第三子密鑰索引進行一次計算,將第三子密鑰索引的值加1;
本實施例步驟502中,采用上述方法2)派生子公鑰和子鏈碼。
本實施例中,對子公鑰進行編碼,得到數(shù)字貨幣收取地址可以優(yōu)選地包括:
步驟1、對子公鑰進行一次或多次哈希轉(zhuǎn)換,得到哈希轉(zhuǎn)換結(jié)果;
本實施例中,步驟1可以優(yōu)選為:對子公鑰依次進行SHA256哈希轉(zhuǎn)換和RIPEMD160哈希轉(zhuǎn)換;
步驟2、根據(jù)哈希轉(zhuǎn)換結(jié)果計算校驗值,根據(jù)校驗值和哈希轉(zhuǎn)換結(jié)果獲取待編碼數(shù)據(jù);
本實施例中,步驟2可以優(yōu)選為:在哈希轉(zhuǎn)換結(jié)果前添加版本號,對添加了版本號的哈希轉(zhuǎn)換結(jié)果進行兩次SHA256哈希轉(zhuǎn)換,取結(jié)果的前4個字節(jié)作為校驗值,將添加了版本號的哈希轉(zhuǎn)換結(jié)果與校驗值順序拼接,得到待編碼數(shù)據(jù);
步驟3、對待編碼數(shù)據(jù)進行編碼得到數(shù)字貨幣收取地址。
本實施例中,步驟3可以優(yōu)選為:對待編碼數(shù)據(jù)進行Base58編碼,得到數(shù)字貨幣收取地址。
例如,子公鑰為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哈希轉(zhuǎn)換和RIPEMD160哈希轉(zhuǎn)換,得到的哈希轉(zhuǎn)換結(jié)果為c7 63 e9 93 54 96 64 69 1e 08 33 c8 5d 4c e5 61 81 08 36 91,添加了版本號的哈希轉(zhuǎn)換結(jié)果為00 c7 63 e9 93 54 96 64 69 1e 08 33 c8 5d 4c e5 61 81 08 36 91,對添加了版本號的哈希轉(zhuǎn)換結(jié)果進行兩次SHA256哈希轉(zhuǎn)換得到的結(jié)果為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,取結(jié)果的前4個字節(jié)得到的校驗值為be 5f bb 5d,將添加了版本號的哈希轉(zhuǎn)換結(jié)果與校驗值順序拼接得到的待編碼數(shù)據(jù)為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,對待編碼數(shù)據(jù)進行Base58編碼,得到的數(shù)字貨幣收取地址為1KBHADAoC4ys586g2LP1Jy1QBBaR9cofKJ。
查詢錢包數(shù)字貨幣賬戶的數(shù)字貨幣量,如圖4所示:
步驟601、分別將錢包數(shù)字貨幣賬戶的第一子私鑰、第一子公鑰和第一子鏈碼作為父私鑰、父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引,派生子私鑰、子公鑰和子鏈碼,得到預(yù)設(shè)數(shù)目的第二子私鑰、第二子公鑰和第二子鏈碼;
具體地,本實施例步驟601中,采用上述方法1)派生子私鑰、子公鑰和子鏈碼。
預(yù)設(shè)數(shù)目可優(yōu)選為20個。
步驟602、對各第二子公鑰分別進行預(yù)設(shè)編碼,得到預(yù)設(shè)數(shù)目的數(shù)字貨幣收取地址;
步驟603、在數(shù)字貨幣網(wǎng)絡(luò)中依次查詢各數(shù)字貨幣收取地址中是否有數(shù)字貨幣,若均沒有則執(zhí)行步驟604,否則返回步驟601;
步驟604、將已查詢到的有數(shù)字貨幣的數(shù)字貨幣收取地址中的數(shù)字貨幣數(shù)量依次相加,得到錢包數(shù)字貨幣賬戶的數(shù)字貨幣量。
進一步地,步驟502中,得到數(shù)字貨幣收取地址之后,還包括將第三子密鑰索引的當前值作為數(shù)字貨幣收取地址索引保存到錢包中;
相應(yīng)地,查詢錢包數(shù)字貨幣賬戶的數(shù)字貨幣量還可以如圖5所示,具體包括:
步驟701、分別將錢包數(shù)字貨幣賬戶的第一子私鑰、第一子公鑰和第一子鏈碼作為父私鑰、父公鑰和父鏈碼,將錢包中保存的各數(shù)字貨幣收取地址索引依次作為子密鑰索引,派生子私鑰、子公鑰和子鏈碼;
具體地,本實施例步驟701中,采用上述方法1)派生子私鑰、子公鑰和子鏈碼。
步驟702、對派生得到的各子公鑰分別進行預(yù)設(shè)編碼,得到各數(shù)字貨幣收取地址;
步驟703、在數(shù)字貨幣網(wǎng)絡(luò)中依次查詢各數(shù)字貨幣收取地址中的數(shù)字貨幣的數(shù)量,將各數(shù)字貨幣收取地址中的數(shù)字貨幣的數(shù)量依次相加,得到錢包數(shù)字貨幣賬戶的數(shù)字貨幣量。
根據(jù)本實施例提供的方法,只需要備份密鑰種子,不需要備份每筆交易對應(yīng)的密鑰,因此備份體積不會隨交易次數(shù)的增多而變大,易于管理;根據(jù)備份的密鑰種子即可衍生出全部密鑰,以此可以防止密鑰損壞給用戶造成損失。進一步地有益效果是,用戶可以在不暴露私鑰的前提下實現(xiàn)數(shù)字貨幣的接收,提高了數(shù)字貨幣交易的安全性。
實施例2
本實施例提供一種適用于數(shù)字貨幣的密鑰派生裝置,采用本實施例提供的裝置派生出的密鑰呈樹狀結(jié)構(gòu),樹的根部為主密鑰和主鏈碼,以主密鑰為父密鑰、主鏈碼為父鏈碼生成的子密鑰和子鏈碼為樹的第一級密鑰和第一級鏈碼,以第一級密鑰為父密鑰、第一級鏈碼為父鏈碼生成的子密鑰和子鏈碼為樹的第二級密鑰和第二級鏈碼,以此類推。
根據(jù)父密鑰生成子密鑰時引入子密鑰索引,根據(jù)不同的子密鑰索引生成不同的子密鑰,子密鑰索引與子密鑰是一一對應(yīng)的。
本實施例提供的裝置如圖6所示,包括:
第一派生模塊81,用于根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
本實施例中,第一派生模塊81可以具體用于:將主私鑰、主公鑰和主鏈碼分別作為父私鑰、父公鑰和父鏈碼,或者將上一級子私鑰、上一級子公鑰和上一級子鏈碼分別作為父私鑰、父公鑰和父鏈碼,根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
具體地,第一派生模塊81可以進一步包括:
第一拼接單元811,用于將父公鑰與子密鑰索引順序拼接得到第一拼接數(shù)據(jù);
第一哈希單元812,用于用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算第一拼接單元811得到的第一拼接數(shù)據(jù)的哈希值;
第一截取單元813,用于對第一哈希單元812得到的第一拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第一數(shù)據(jù);
第一運算單元814,用于以預(yù)設(shè)橢圓曲線的基點的階為模數(shù),對父私鑰和第一截取單元813得到的第一數(shù)據(jù)做ECC加法模運算,得到第一運算結(jié)果;
第一判斷單元815,用于判斷第一運算單元814得到的第一運算結(jié)果是否為預(yù)設(shè)值;
第一遞增單元816,用于當?shù)谝慌袛鄦卧?15的判斷結(jié)果為是時,將子密鑰索引遞增;
第一密鑰獲取單元817,用于當?shù)谝慌袛鄦卧?15的判斷結(jié)果為否時,將第一運算單元814得到的第一運算結(jié)果作為子私鑰,對子私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到子公鑰。
其中,第一截取單元813可以具體用于:截取第一哈希單元812得到的哈希值的低位端預(yù)設(shè)長度的數(shù)據(jù)作為子鏈碼,高位端預(yù)設(shè)長度的數(shù)據(jù)作為第一數(shù)據(jù)。
本實施例中,所述裝置還可以包括:
第一比較模塊82,用于比較子密鑰索引和預(yù)設(shè)值;
第二派生模塊83,用于當?shù)谝槐容^模塊82確定子密鑰索引大于或者等于預(yù)設(shè)值時,根據(jù)父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
相應(yīng)地,第一派生模塊81,具體用于當?shù)谝槐容^模塊82確定子密鑰索引小于預(yù)設(shè)值時,根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
具體地,第二派生模塊83可以進一步包括:
第二拼接單元,用于對父私鑰進行高位端補位,將補位后的父私鑰與子密鑰索引順序拼接得到第二拼接數(shù)據(jù);
第二哈希單元,用于用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第二拼接單元得到的第二拼接數(shù)據(jù)的哈希值;
第二截取單元,用于對所述第二哈希單元得到的哈希值進行截取,得到子鏈碼和第二數(shù)據(jù);
第二運算單元,用于以所述預(yù)設(shè)橢圓曲線的基點的階為模數(shù),對補位前的父私鑰和所述第二截取單元得到的第二數(shù)據(jù)做ECC加法模運算,得到第二運算結(jié)果;
第二判斷單元,用于判斷所述第二運算單元得到的第二運算結(jié)果是否為預(yù)設(shè)值;
第二遞增單元,用于當所述第二判斷單元的判斷結(jié)果為是時,將子密鑰索引遞增;
第二密鑰獲取單元,用于當所述第二判斷單元的判斷結(jié)果為否時,將所述第二運算單元得到的第二運算結(jié)果作為子私鑰,對子私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到子公鑰。
其中,第二截取單元可以具體用于:截取所述第二哈希單元得到的第二拼接數(shù)據(jù)的哈希值的低位端預(yù)設(shè)長度的數(shù)據(jù)作為子鏈碼,高位端預(yù)設(shè)長度的數(shù)據(jù)作為第二數(shù)據(jù)。
本實施例中,所述裝置還可以包括:第三派生模塊,用于根據(jù)父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
具體地,第三派生模塊可以進一步包括:
第三拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第三拼接數(shù)據(jù);
第三哈希單元,用于用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第三拼接單元得到的第三拼接數(shù)據(jù)的哈希值;
第三截取單元,用于對所述第三哈希單元得到的第三拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第三數(shù)據(jù);
第三運算單元,用于對所述預(yù)設(shè)橢圓曲線的基點和所述第三截取單元得到的第三數(shù)據(jù)進行ECC點乘運算,對父公鑰和ECC點乘運算結(jié)果做ECC加法運算;
第三判斷單元,用于判斷第三運算單元得到的ECC加法運算結(jié)果是否為預(yù)設(shè)值;
第三遞增單元,用于當所述第三判斷單元的判斷結(jié)果為是時,將子密鑰索引遞增;
第三密鑰獲取單元,用于當所述第三判斷單元的判斷結(jié)果為否時,將所述第三運算單元得到的ECC加法運算結(jié)果作為子公鑰。
其中,第三截取單元可以具體用于:截取所述第三哈希單元得到的第三拼接數(shù)據(jù)的哈希值的低位端預(yù)設(shè)長度的數(shù)據(jù)作為子鏈碼,高位端預(yù)設(shè)長度的數(shù)據(jù)作為第三數(shù)據(jù)。
更進一步地,所述裝置還可以包括:
第二比較模塊,用于比較子密鑰索引和預(yù)設(shè)值;
提示模塊,用于當?shù)诙容^模塊確定子密鑰索引大于或者等于預(yù)設(shè)值時,提示失敗;
相應(yīng)地,第三派生模塊,具體用于當?shù)诙容^模塊確定子密鑰索引小于預(yù)設(shè)值時,根據(jù)父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
本實施例中,所述裝置還可以包括:生成模塊,用于生成主私鑰、主公鑰和主鏈碼。
具體地,生成模塊可以進一步包括:
第四哈希單元,用于獲取一個偽隨機數(shù)作為密鑰種子,用預(yù)設(shè)字符串作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述密鑰種子的哈希值;
第四截取單元,用于對所述第四哈希單元得到的密鑰種子的哈希值進行截取,得到主鏈碼和主私鑰;
第四運算單元,用于對所述第四截取單元得到的主私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到主公鑰。
其中,第四截取單元可以具體用于:截取所述第四哈希單元得到的密鑰種子的哈希值的低位端預(yù)設(shè)長度的數(shù)據(jù)作為主鏈碼,高位端預(yù)設(shè)長度的數(shù)據(jù)作為主私鑰。
實施例3
本實施例提供一種適用于數(shù)字貨幣的密鑰派生裝置,如圖7所示,包括:
第一獲取模塊91,用于分別以數(shù)字貨幣錢包的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第一子密鑰索引作為子密鑰索引;
第一派生模塊92,用于根據(jù)第一獲取模塊91獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
賬戶密鑰生成模塊93,用于將第一派生模塊92派生的子私鑰、子公鑰和子鏈碼分別作為數(shù)字貨幣賬戶的主私鑰、主公鑰和主鏈碼。
一方面,第一派生模塊92可以進一步包括:
第一拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第一拼接數(shù)據(jù);
第一哈希單元,用于用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第一拼接單元得到的第一拼接數(shù)據(jù)的哈希值;
第一截取單元,用于對所述第一哈希單元得到的第一拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第一數(shù)據(jù);
第一運算單元,用于以預(yù)設(shè)橢圓曲線的基點的階為模數(shù),對父私鑰和所述第一截取單元得到的第一數(shù)據(jù)做ECC加法模運算,得到第一運算結(jié)果;
第一判斷單元,用于判斷所述第一運算單元得到的第一運算結(jié)果是否為預(yù)設(shè)值;
遞增單元,用于當所述第一判斷單元的判斷結(jié)果為是時,將子密鑰索引遞增;
第一密鑰獲取單元,用于當所述第一判斷單元的判斷結(jié)果為否時,將所述第一運算單元得到的第一運算結(jié)果作為子私鑰,對子私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到子公鑰;
所述父私鑰和所述父公鑰均為所述預(yù)設(shè)橢圓曲線上的點。
另一方面,第一派生模塊92可以具體包括:
第一比較子模塊,用于比較子密鑰索引和預(yù)設(shè)值;
第一派生子模塊,用于當所述第一比較子模塊確定子密鑰索引小于預(yù)設(shè)值時,根據(jù)父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
第二派生子模塊,用于當所述第一比較子模塊確定子密鑰索引大于或者等于預(yù)設(shè)值時,根據(jù)父私鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼。
其中,第二派生子模塊可以具體包括:
第二拼接單元,用于對父私鑰進行高位端補位,將補位后的父私鑰與子密鑰索引順序拼接得到第二拼接數(shù)據(jù);
第二哈希單元,用于用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第二拼接單元得到的第二拼接數(shù)據(jù)的哈希值;
第二截取單元,用于對所述第二哈希單元得到的哈希值進行截取,得到子鏈碼和第二數(shù)據(jù);
第二運算單元,用于以所述預(yù)設(shè)橢圓曲線的基點的階為模數(shù),對補位前的父私鑰和所述第二截取單元得到的第二數(shù)據(jù)做ECC加法模運算,得到第二運算結(jié)果;
第二判斷單元,用于判斷第二運算單元得到的第二運算結(jié)果是否為預(yù)設(shè)值;
第二遞增單元,用于當所述第二判斷單元的判斷結(jié)果為是時,將子密鑰索引遞增;
第二密鑰獲取單元,用于當所述第二判斷單元的判斷結(jié)果為否時,將所述第二運算單元得到的第二運算結(jié)果作為子私鑰,對子私鑰和所述預(yù)設(shè)橢圓曲線的基點做ECC點乘運算,得到子公鑰。
本實施例中,所述裝置還可以包括:錢包密鑰生成模塊94,用于獲取密鑰種子和數(shù)字貨幣種子,用所述數(shù)字貨幣種子作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述密鑰種子的哈希值;對所述密鑰種子的哈希值進行截取,得到數(shù)字貨幣錢包的主私鑰和主鏈碼;對所述數(shù)字貨幣錢包的主私鑰和所述橢圓曲線的基點做ECC點乘運算,得到數(shù)字貨幣錢包的主公鑰。
本實施例中,所述裝置還可以包括:第二獲取模塊95,用于分別以數(shù)字貨幣賬戶的主私鑰、主公鑰和主鏈碼為父私鑰、父公鑰和父鏈碼,將第二子密鑰索引作為子密鑰索引;相應(yīng)地:
第一派生模塊92,還用于根據(jù)第二獲取模塊95獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
所述裝置還包括:
第三獲取模塊96,用于將第一派生模塊92根據(jù)第二獲取模塊95獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的子公鑰和子鏈碼分別作為父公鑰和父鏈碼,將第三子密鑰索引作為子密鑰索引;
第二派生模塊97,用于根據(jù)第三獲取模塊96獲取的父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼;
貨幣收取地址生成模塊98,用于對第二派生模塊97派生的子公鑰進行編碼,得到數(shù)字貨幣收取地址。
一方面,第二派生模塊97可以進一步包括:
第三拼接單元,用于將父公鑰與子密鑰索引順序拼接得到第三拼接數(shù)據(jù);
第三哈希單元,用于用父鏈碼作為哈希密鑰,根據(jù)預(yù)設(shè)算法計算所述第三拼接單元得到的第三拼接數(shù)據(jù)的哈希值;
第三截取單元,用于對所述第三哈希單元得到的第三拼接數(shù)據(jù)的哈希值進行截取,得到子鏈碼和第三數(shù)據(jù);
第三運算單元,用于對所述橢圓曲線的基點和所述第三截取單元得到的第三數(shù)據(jù)進行ECC點乘運算,對父公鑰和ECC點乘運算結(jié)果做ECC加法運算;
第三判斷單元,用于判斷第三運算單元得到的ECC加法運算結(jié)果是否為預(yù)設(shè)值;
第三遞增單元,用于當所述第三判斷單元的判斷結(jié)果為是時,將子密鑰索引遞增;
第三密鑰獲取單元,用于當所述第三判斷單元的判斷結(jié)果為否時,將所述第三運算單元得到的ECC加法運算結(jié)果作為子公鑰。
另一方面,第二派生模塊97可以具體包括:
第二比較子模塊,用于比較第三獲取模塊96獲取的子密鑰索引和預(yù)設(shè)值;
提示子模塊,用于當所述第二比較子模塊確定第三獲取模塊96獲取的子密鑰索引大于或者等于預(yù)設(shè)值時,提示失??;
派生子模塊,用于當所述第二比較子模塊確定第三獲取模塊96獲取的子密鑰索引小于預(yù)設(shè)值時,根據(jù)第三獲取模塊96獲取的父公鑰、父鏈碼和子密鑰索引派生子公鑰和子鏈碼。
本實施例中,第三密鑰獲取單元,還可以用于:將子密鑰索引的當前值保存為數(shù)字貨幣收取地址索引;相應(yīng)地:
所述裝置還包括:第四獲取模塊910,用于將第一派生模塊92根據(jù)第二獲取模塊95獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的子私鑰、子公鑰和子鏈碼分別作為父私鑰、父公鑰和父鏈碼,將第三密鑰獲取單元中保存的各數(shù)字貨幣收取地址索引依次作為子密鑰索引;
第一派生模塊92還用于:根據(jù)第四獲取模塊910獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生子私鑰、子公鑰和子鏈碼;
所述裝置還包括:賬戶貨幣查詢模塊99,用于將第一派生模塊92根據(jù)第四獲取模塊910獲取的父私鑰、父公鑰、父鏈碼和子密鑰索引派生的各子公鑰分別進行編碼,得到各數(shù)字貨幣收取地址,依次查詢和累加各數(shù)字貨幣收取地址中的數(shù)字貨幣的數(shù)量,得到數(shù)字貨幣賬戶的數(shù)字貨幣量;
或者,本實施例中,第一派生模塊92,還用于根據(jù)第三獲取模塊96獲取的父公鑰、父鏈碼和子密鑰索引派生預(yù)設(shè)數(shù)目的子私鑰、子公鑰和子鏈碼;相應(yīng)地:
所述裝置還包括:賬戶貨幣查詢模塊99,用于對第一派生模塊92根據(jù)第三獲取模塊96獲取的父公鑰、父鏈碼和子密鑰索引派生的預(yù)設(shè)數(shù)目的子私鑰分別進行編碼,得到預(yù)設(shè)數(shù)目的數(shù)字貨幣收取地址,依次查詢各數(shù)字貨幣收取地址中是否有數(shù)字貨幣,當均沒有時將已查詢到的有數(shù)字貨幣的數(shù)字貨幣收取地址中的數(shù)據(jù)貨幣數(shù)量依次相加,得到數(shù)字貨幣賬戶的數(shù)字貨幣量。
以上所述的實施例只是本發(fā)明較優(yōu)選的具體實施方式,本領(lǐng)域的技術(shù)人員在本發(fā)明技術(shù)方案范圍內(nèi)進行的通常變化和替換都應(yīng)包含在本發(fā)明的保護范圍內(nèi)。