一种利用硬件实现数字货币钱包的方法及硬件钱包转让专利

申请号 : CN201710690690.1

文献号 : CN107480986B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陆舟于华章

申请人 : 飞天诚信科技股份有限公司

摘要 :

本发明涉及数字货币领域,特别涉及一种利用硬件实现数字货币钱包的方法及硬件钱包,该方法包括:硬件钱包等待接收来自上位机的指令,当接收到查询余额指令时,硬件钱包根据安全存储区中的主密钥和预置的子密钥索引通过密钥派生算法生成子密钥对,并根据子密钥对中的子公钥生成账户地址,将账户地址与子密钥索引绑定并返回给上位机;当接收到交易指令时,硬件钱包根据安全存储区中的主密钥和交易指令中的子密钥索引通过密钥派生算法生成子密钥对,并使用子密钥对中的子私钥对交易指令中的交易数据进行签名得到签名结果,根据子密钥对中的子公钥和所述签名结果生成交易凭据,并将交易凭据返回上位机,本方法解决了密钥保存的安全性问题。

权利要求 :

1.一种利用硬件实现数字货币钱包的方法,其特征在于,包括:

步骤S1、硬件钱包等待接收来自上位机的指令,当接收到查询余额指令时,执行步骤S2;当接收到交易指令时,执行步骤S3;

步骤S2、所述硬件钱包根据安全存储区中的主密钥和预置的子密钥索引通过密钥派生算法生成子密钥对,并根据所述子密钥对中的子公钥生成账户地址,将所述账户地址与所述子密钥索引绑定并返回给上位机;

步骤S3、所述硬件钱包根据所述安全存储区中的主密钥和所述交易指令中的子密钥索引通过密钥派生算法生成子密钥对,并使用所述子密钥对中的子私钥对所述交易指令中的交易数据进行签名得到签名结果,根据所述子密钥对中的子公钥和所述签名结果生成交易凭据,并将所述交易凭据返回上位机;

所述步骤S1中还包括:当接收到创建硬件钱包指令时,执行步骤S4;当接收到恢复硬件钱包指令时执行步骤S5;

步骤S4、所述硬件钱包生成随机数作为密钥种子,将所述密钥种子通过预设字典转换为助记短语,将所述密钥种子通过第一预设算法生成主密钥,将所述主密钥存储在安全存储区,并将所述助记短语返回给上位机;

步骤S5、所述硬件钱包将所述恢复硬件钱包指令中的助记短语根据所述预设字典转换为密钥种子,将所述密钥种子通过所述第一预设算法生成主密钥,将所述主密钥存储在所述安全存储区;

所述硬件钱包生成随机数作为密钥种子,将密钥种子通过预设字典转换为助记短语具体包括:步骤101、所述硬件钱包生成第一预设长度的随机数,并将所述随机数作为密钥种子;

步骤102、所述硬件钱包根据所述密钥种子通过第二预设算法得到第一校验值;将所述密钥种子与所述第一校验值拼接得到助记短语标识;将所述助记短语标识根据预设字典转换为助记短语。

2.如权利要求1所述的方法,其特征在于,所述步骤S1具体为:当硬件钱包接收到来自上位机的指令后,获取所述指令的第一预设字段上的数据,并将其作为指令类型标识,根据所述指令类型标识判断指令的类型,若指令类型标识为第一预设指令类型标识时,判断出指令类型为所述创建硬件钱包指令,执行步骤S4;若指令类型标识为第二预设指令类型标识时,判断出指令的类型为所述恢复硬件钱包指令,执行步骤S5;若指令类型标识为第三预设指令类型标识时,判断出指令的类型为所述查询余额指令,执行步骤S2;若指令类型标识为第四预设指令类型标识时,判断出指令的类型为所述交易指令,执行步骤S3。

3.如权利要求1所述的方法,其特征在于,所述创建硬件钱包指令中包括硬件钱包密码;

所述当接收到所述创建硬件钱包指令之后,执行步骤S4之前还包括:所述硬件钱包从所述创建硬件钱包指令中获取所述硬件钱包密码,判断所述硬件钱包密码是否合法,是则执行步骤S4,否则提示密码错误,结束。

4.如权利要求1所述的方法,其特征在于,所述步骤102具体为:所述硬件钱包根据所述密钥种子通过所述第二预设算法得到计算结果,根据所述第一预设长度计算校验值长度,从所述计算结果中顺序截取长度为校验值长度的数据作为第一校验值;将所述密钥种子与所述第一校验值拼接得到助记短语标识。

5.如权利要求1所述的方法,其特征在于,所述创建硬件钱包指令中包括助记短语长度;所述硬件钱包生成随机数作为密钥种子,将密钥种子通过预设字典转换为助记短语具体包括:步骤201、所述硬件钱包根据所述助记短语长度计算密钥种子长度,生成数据长度为密钥种子长度的随机数,并将所述随机数作为密钥种子;

步骤202、所述硬件钱包根据所述密钥种子通过第二预设算法得到第一校验值;将所述密钥种子与所述第一校验值拼接得到助记短语标识;将所述助记短语标识根据预设字典转换为助记短语。

6.如权利要求5所述的方法,其特征在于,

所述步骤201具体为:所述硬件钱包根据助记短语长度计算密钥种子长度和校验值长度,生成数据长度为密钥种子长度的随机数,并将所述随机数作为密钥种子;

所述步骤202具体为:所述硬件钱包根据所述密钥种子通过所述第二预设算法得到计算结果,从所述计算结果中截取前校验值长度的数据作为第一校验值;将所述密钥种子与所述第一校验值拼接得到助记短语标识;将所述助记短语标识根据预设字典转换为助记短语。

7.如权利要求1或5所述的方法,其特征在于,所述将所述助记短语标识根据预设字典转换为助记短语具体包括:所述硬件钱包依次在所述助记短语标识中截取第二预设长度的数据作为助记单词标识,并在预设字典中查找与截取到的助记单词标识对应的助记单词,再将助记单词依次组合得到助记短语。

8.如权利要求1或5所述的方法,其特征在于,所述将密钥种子通过第一预设算法生成主密钥具体包括:所述硬件钱包使用预设字符串作为哈希密钥,根据所述第二预设算法计算所述密钥种子的哈希值;将计算得到的所述哈希值的高位端第二预设长度的数据作为主密钥。

9.如权利要求1所述的方法,其特征在于,所述创建硬件钱包指令中还包括:助记短语的语言类型;

所述步骤S4具体为:硬件钱包生成随机数作为密钥种子,将所述主密钥通过与所述助记短语的语言类型对应的字典转换为助记短语,将助记短语返回给上位机。

10.如权利要求1所述的方法,其特征在于,当接收到恢复硬件钱包指令之后,执行步骤S5之前还包括:所述硬件钱包判断所述恢复硬件钱包指令中的助记短语中的助记单词的数量是否不大于第三预设值,是则执行步骤S5,否则向上位机返回失败响应。

11.如权利要求1所述的方法,其特征在于,当接收到所述恢复硬件钱包指令之后,执行步骤S5之前还包括:硬件钱包根据助记短语确定助记短语的语言类型,判断助记短语的语言类型是否在预设语言种类范围内,是则执行步骤S5,否则向上位机返回失败响应。

12.如权利要求11所述的方法,其特征在于,硬件钱包根据助记短语确定助记短语的语言类型具体包括:硬件钱包获取助记短语中的一个助记单词,根据助记单词的unicode码确定助记短语的语言类型。

13.如权利要求1所述的方法,其特征在于,所述硬件钱包将所述恢复硬件钱包指令中的助记短语根据所述预设字典转换为密钥种子具体包括:硬件钱包将所述助记短语根据所述预设字典转换为助记短语标识;根据助记短语标识长度计算对密钥种子长度,从助记短语标识中的顺序获取长度为密钥种子长度的数据作为密钥种子。

14.如权利要求1所述的方法,其特征在于,所述硬件钱包将所述恢复硬件钱包指令中的助记短语根据所述预设字典转换为密钥种子具体包括:硬件钱包将所述恢复硬件钱包指令中的助记短语根据所述预设字典转换为助记短语标识,从助记短语标识中获取密钥种子和第二校验值;

所述从助记短语标识中获取密钥种子和第二校验值之后,所述将所述密钥种子通过所述第一预设算法生成主密钥之前还包括:所述硬件钱包根据所述密钥种子生成第三校验值,并判断所述第三校验值和所述第二校验值是否匹配,是则执行所述将所述密钥种子通过所述第一预设算法生成主密钥,否则向上位机返回失败响应。

15.如权利要求14所述的方法,其特征在于,所述从助记短语标识中获取密钥种子和第二校验值具体为:所述硬件钱包根据助记短语标识长度计算密钥种子长度,从所述助记短语标识中顺序获取长度为密钥种子长度的数据作为密钥种子,将所述助记短语标识中剩余的数据作为第二校验值。

16.如权利要求15所述的方法,其特征在于,所述硬件钱包根据所述密钥种子生成第三校验值具体包括,所述硬件钱包使用第二预设算法对密钥种子进行运算得到计算结果,顺序截取计算结果中长度为校验值长度的数据作为第三校验值。

17.如权利要求1所述的方法,其特征在于,当接收到所述查询余额指令时,执行步骤S2之前,还包括:硬件钱包判断所述安全存储区中是否存在所述主密钥,是则执行步骤S2;否则向上位机返回失败响应。

18.如权利要求1所述的方法,其特征在于,所述硬件钱包根据所述安全存储区中的主密钥和预置的子密钥索引通过密钥派生算法生成子密钥对具体包括:步骤401、硬件钱包根据安全存储区中的主密钥生成公钥,并设置当前子密钥索引为预设值;

步骤402、所述硬件钱包根据所述公钥和所述当前子密钥索引通过密钥派生算法派生出所述子密钥对;

步骤403、所述硬件钱包根据所述子密钥对中的子公钥通过预设算法生成账户地址,将所述账户地址和所述当前子密钥索引绑定写入子密钥索引列表;

步骤404、所述硬件钱包更新当前子密钥索引,并判断所述当前子密钥索引是否小于预设值,是则返回步骤402,否则向上位机返回子密钥索引列表。

19.如权利要求1所述的方法,其特征在于,所述根据所述子密钥对中的子公钥生成账户地址具体包括:所述硬件钱包将子公钥依次经过SHA256和RIPEMD160运算及编码运算后生成的第一数据作为账户地址。

20.如权利要求1所述的方法,其特征在于,当接收到所述交易指令时,执行步骤S3之前,还包括:硬件钱包判断所述安全存储区中是否存在所述主密钥,是则执行步骤S3;否则向上位机返回失败响应。

21.如权利要求1所述的方法,其特征在于,所述硬件钱包根据安全存储区中的主密钥和所述交易指令中的子密钥索引通过密钥派生算法生成子密钥对具体为:所述硬件钱包根据安全存储区中的主密钥生成公钥,硬件钱包根据公钥和子密钥索引通过密钥派生算法派生出子密钥对。

22.如权利要求1所述的方法,其特征在于,根据所述子密钥对中的子公钥和所述签名结果生成交易凭据具体包括:所述硬件钱包根据子密钥对中的子公钥长度、子公钥、签名结果长度和签名结果计算得到交易凭据长度;并将交易凭据长度、子公钥长度、子公钥、签名结果长度和签名结果顺序拼接生成交易凭据。

23.一种硬件钱包,其特征在于,包括:

接收模块,用于接收来自上位机的指令;

安全存储模块,用于存储主密钥;

第一子密钥对生成模块,用于当所述接收模块接收到所述上位机发送的查询余额指令时,根据所述安全存储模块中保存的主密钥和预置的子密钥索引通过密钥派生算法生成子密钥对;

账户地址生成模块,用于根据所述第一子密钥对生成模块生成的子密钥对中的子公钥生成账户地址;

第二子密钥对生成模块,用于当所述接收模块接收到所述上位机发送的交易指令时,根据所述交易指令中的子密钥索引和所述安全存储模块中存储的主密钥通过密钥派生算法生成子密钥对;

签名模块,用于使用所述第二子密钥对生成模块生成的子私钥对所述接收模块接收到的所述交易指令中的交易数据进行签名得到签名结果;

交易凭据生成模块,用于使用所述第二子密钥对生成模块生成的所述子密钥对中的子公钥和所述签名模块生成的所述签名结果生成交易凭据;

发送模块,用于将所述账户地址生成模块生成的所述账户地址与所述预置的子密钥索引绑定发送给所述上位机;还用于将所述交易凭据生成模块生成的所述交易凭据发送给所述上位机;

所述的硬件钱包还包括:

随机数生成模块,用于当所述接收模块接收到来自上位机的创建硬件钱包指令时生成随机数,将所述随机数作为密钥种子;

转换模块,用于将所述随机数生成模块生成的密钥种子通过预设字典转换为助记短语;还用于当所述接收模块接收到恢复硬件钱包指令时,将所述恢复硬件钱包指令中的助记短语根据所述预设字典转换为密钥种子;

主密钥生成模块,用于将所述随机数生成模块生成的所述密钥种子通过第一预设算法生成主密钥;还用于将所述转换模块生成的所述密钥种子通过所述第一预设算法生成主密钥;

所述安全存储模块,具体用于存储所述主密钥生成模块生成的所述主密钥;

所述发送模块,还用于将所述转换模块生成的所述助记短语发送给所述上位机;

所述随机数生成模块,具体用于当所述接收模块接收到来自上位机的创建硬件钱包指令时生成第一预设长度的随机数,将所述随机数作为密钥种子;

所述转换模块具体包括:

助记短语标识生成子模块,用于根据所述随机数生成模块生成的所述密钥种子通过第二预设算法得到第一校验值,将所述密钥种子与所述第一校验值拼接得到助记短语标识;

转换子模块,用于将所述助记短语标识生成子模块生成的所述助记短语标识通过预设字典转换成助记短语。

24.如权利要求23所述的硬件钱包,其特征在于,所述接收模块,具体用于,接收所述上位机发送的指令,当接收到指令后,获取所述指令的第一预设字段上的数据,并将其作为指令类型标识,根据所述指令类型标识判断指令的类型,若指令类型标识为第一预设指令类型标识时,判定出指令类型为所述创建硬件钱包指令;若指令类型标识为第二预设指令类型标识时,判定指令的类型为所述恢复硬件钱包指令;若指令类型标识为第三预设指令类型标识时,判定指令的类型为所述查询账户余额指令;若指令类型标识为第四预设指令类型标识时,判定指令的类型为所述交易指令。

25.如权利要求23所述的硬件钱包,其特征在于,所述创建硬件钱包指令中包括硬件钱包密码;

所述硬件钱包还包括:

第一判断模块,用于当所述接收模块接收到所述上位机发送的创建硬件钱包指令时,判断所述创建硬件钱包指令中的硬件钱包密码是否合法;

所述随机数生成模块,具体用于当所述第一判断模块判定所述创建硬件钱包指令中的硬件钱包密码合法时生成随机数,将所述随机数作为密钥种子;

错误提示模块,用于当所述第一判断模块判定所述创建硬件钱包指令中的硬件钱包密码不合法时提示密码错误。

26.如权利要求23所述的硬件钱包,其特征在于,所述助记短语标识生成子模块,具体用于根据所述随机数生成模块生成的所述密钥种通过所述第二预设算法计算得到计算结果,根据所述第一预设长度计算校验值长度,从所述计算结果中顺序截取长度为校验值长度的数据作为第一校验值,将所述密钥种子与所述第一校验值拼接得到助记短语标识。

27.如权利要求23所述的硬件钱包,其特征在于,所述创建硬件钱包指令中包括助记短语长度;

所述随机数生成模块,具体用于根据所述创建硬件钱包指令中的所述助记短语长度计算密钥种子长度,生成数据长度为密钥种子长度的随机数,将所述随机数作为密钥种子;

所述转换模块具体包括:

助记短语标识生成子模块,用于根据所述随机数生成模块生成的所述密钥种子通过第二预设算法得到第一校验值,将所述密钥种子与所述第一校验值拼接得到助记短语标识;

转换子模块,用于将所述助记短语标识生成子模块生成的所述助记短语标识通过预设字典转换成助记短语。

28.如权利要求27所述的硬件钱包,其特征在于,

所述随机数生成模块,具体用于根据所述创建硬件钱包指令中的所述助记短语长度计算密钥种子长度和校验值长度,生成数据长度为密钥种子长度的随机数,将所述随机数作为密钥种子;

所述转换模块具体包括:

助记短语标识生成子模块,用于根据所述随机数生成模块生成的所述密钥种子通过第二预设算法计算得到的计算结果,从所述计算结果中顺序截取长度为校验值长度的数据作为第一校验值,将所述密钥种子与所述第一校验值拼接得到助记短语标识;

转换子模块,用于将所述助记短语标识生成子模块生成的所述助记短语标识通过预设字典转换成助记短语。

29.如权利要求23或27所述的硬件钱包,其特征在于,所述转换子模块,具体用于依次在所述助记短语标识生成子模块生成的所述助记短语标识中截取第二预设长度的数据作为助记单词标识,并在预设字典中查找与截取到的助记单词标识对应的助记单词,再将助记单词依次组合成助记短语。

30.如权利要求23或者27所述的硬件钱包,其特征在于,所述主密钥生成模块,具体用于使用预设字符串作为哈希密钥,根据所述第二预设算法计算所述随机数生成模块生成的所述密钥种子的哈希值,将计算得到的哈希值的高位段第二预设长度的数据作为主密钥。

31.如权利要求23所述的硬件钱包,其特征在于,所述创建硬件钱包指令中还包括:助记短语的语言类型;

转换模块,具体用于将所述随机数生成模块生成的密钥种子通过与所述助记短语的语言类型对应的字典转换为助记短语。

32.如权利要求23所述的硬件钱包,其特征在于,还包括:

第二判断模块,用于当所述接收模块接收到所述恢复硬件钱包指令时,判断所述恢复硬件钱包指令中的助记短语的助记单词的数量是否不大于第三预设值;

所述转换模块,用于将所述随机数生成模块生成的密钥种子通过预设字典转换为助记短语;还用于当所述第二判断模块判定所述助记短语的助记单词的数量不大于第三预设值时将所述恢复硬件钱包指令中的助记短语通过所述预设字典转换为密钥种子;

所述发送模块,具体用于当所述第二判断模块判定所述助记短语的助记单词的数量大于第三预设值时向所述上位机发送错误响应。

33.如权利要求23所述的硬件钱包,其特征在于,还包括:

第三判断模块,用于当所述接收模块接收到所述恢复硬件钱包指令时,根据所述恢复硬件钱包指令中的所述助记短语确定助记短语的语言类型,并判断所述助记短语的语言类型是否在预设语言种类范围内;

转换模块,用于将所述随机数生成模块生成的密钥种子通过预设字典转换为助记短语;还用于当所述第三判断模块判定所述助记短语的语言类型在所述预设语言种类范围内时将所述恢复硬件钱包指令中的助记短语通过所述预设字典转换为密钥种子;

所述发送模块,具体用于当所述第三判断模块判定所述助记短语的语言类型不在所述预设语言种类范围内时向所述上位机发送错误响应。

34.如权利要求33所述的硬件钱包,所述第三判断模块具体包括:

确定语言类型子模块,用于当所述接收模块接收到所述恢复硬件钱包指令时,根据所述恢复硬件钱包指令中的所述助记短语中的一个助记单词,根据助记单词的unicode码确定助记短语的语言类型;

所述第三判断模块,具体用于判断所述确定语言类型子模块确定的所述助记短语的语言类型是否在预设语言种类范围内。

35.如权利要求23所述的硬件钱包,其特征在于,

所述转换模块,具体用于将所述随机数生成模块生成的密钥种子通过预设字典转换为助记短语;还用于当所述接收模块接收到所述恢复硬件钱包指令时,将所述助记短语根据所述预设字典转换为助记短语标识;根据助记短语标识长度计算对密钥种子长度,从助记短语标识中顺序获取长度为密钥种子长度的数据作为密钥种子。

36.如权利要求23所述的硬件钱包,其特征在于,

所述转换模块,用于将所述随机数生成模块生成的密钥种子通过预设字典转换为助记短语;还用有当所述接收模块接收到所述恢复硬件钱包指令时,将所述助记短语根据所述预设字典转换为助记短语标识;从所述助记短语标识中获取密钥种子和第二校验值;

所述硬件钱包还包括:

校验值生成模块,用于根据所述转换模块得到的所述密钥种子生成第三校验值;

第四判断模块,用于判断所述转换模块从所述助记短语标识中获取到的第二校验值与所述校验值生成模块生成的所述第三校验值是否匹配;

主密钥生成模块,用于将所述随机数生成模块生成的所述密钥种子通过第一预设算法生成主密钥;还用于当所述第四判断模块判定所述第二校验值与所述第三校验值匹配时,将所述转换模块中从所述助记短语标识中获取到的密钥种子通过第一预设算法生成主密钥。

37.如权利要求36所述的硬件钱包,其特征在于,所述转换模块具体用于将所述随机数生成模块生成的密钥种子通过预设字典转换为助记短语;还用于当所述接收模块接收到所述恢复硬件钱包指令时,将所述助记短语根据所述预设字典转换为助记短语标识;用于根据助记短语标识长度计算密钥种子长度,从所述助记短语标识中顺序获取长度为密钥种子长度的数据作为密钥种子,将所述助记短语标识中剩余的数据作为第二校验值。

38.如权利要求37所述的硬件钱包,其特征在于,所述校验值生成模块,用于使用第二预设算法对从所述助记短语标识中获取到的密钥种子进行计算得到计算结果,顺序截取计算结果中的长度为校验值长度的数据作为第三校验值。

39.如权利要求23所述的硬件钱包,其特征在于,还包括:

第五判断模块,用于当所述接收模块接收到所述上位机发送的查询余额指令时判断安全存储区中是否存在主密钥;

第一子密钥对生成模块,用于当所述第五判断模块判定所述安全存储模块中存在主密钥时根据所述安全存储模块中保存的主密钥和预置的子密钥索引通过密钥派生算法生成子密钥对;

所述发送模块,还用于当所述第五判断模块判定所述安全存储模块中不存在主密钥时向所述上位机发送失败响应。

40.如权利要求23所述的硬件钱包,其特征在于,所述第一子密钥生成模块具体包括:公钥生成子模块,用于根据所述安全存储模块中存储的主密钥生成公钥;

设置子模块,用于设置当前子密钥索引为预设值;

子密钥对派生子模块,用于根据所述设置模块设置的子密钥索引和所述安全存储模块存储的主密钥通过密钥派生算法派生出子密钥对;还用于当判断子模块判定更新模块更新后的所述子密钥索引小于预设值时所述根据所述更新模块更新后的子密钥索引和所述安全存储模块存储的主密钥通过密钥派生算法派生出子密钥对;

账户地址生成子模块,用于根据所述子密钥对派生子模块生成的子密钥对中的子公钥通过预设算法生成账户地址;

绑定子模块,用于将所述账户地址生成子模块生成的所述账户地址与所述子密钥索引进行绑定写入子密钥索引列表;

更新子模块,用于更新当前子密钥索引;

判断子模块,用于判断更新模块更新后的所述子密钥索引是否小于预设值;

所述发送模块,还用于当所述判断更新模块更新后的所述子密钥索引不小于预设值时向所述上位机返回子密钥索引列表。

41.如权利要求40所述的硬件钱包,其特征在于,所述账户地址生成子模块,具体用于根据所述子密钥对派生子模块生成的子公钥依次经过SHA256和RIPEMD160运算及编码运算后生成的第一数据作为账户地址。

42.如权利要求23所述的硬件钱包,其特征在于,还包括:

第六判断模块,用于当所述接收模块接收到所述上位机发送的交易指令时,判断所述安全存储模块中是否存在主密钥;

第二子密钥对生成模块,用于当所述第六判断模块中判定所述安全存储模块中保存的主密钥时根据所述交易指令中的子密钥索引和所述安全存储模块中存储的主密钥通过密钥派生算法生成子密钥对;

所述发送模块,还用于当所述第六判断模块判定所述安全存储模块中不存在主密钥时向所述上位机发送失败响应。

43.如权利要求23所述的硬件钱包,其特征在于,所述第二子密钥对生成模块,具体用于当所述接收模块接收到所述上位机发送的交易指令时,根据所述安全存储模块中存储的主密钥生成公钥,根据所述公钥和所述交易指令中的子密钥索引通过密钥派生算法生成子密钥对。

44.如权利要求23所述的硬件钱包,其特征在于,所述交易凭据生成模块,具体用于根据所述子密钥对生成模块生成的子密钥对中的子公钥、子公钥长度、所述签名模块中生成的签名结果、签名结果长度计算交易凭据长度,并将交易凭据长度、子公钥长度、子公钥、签名结果长度和签名结果顺序拼接生成交易凭据。

说明书 :

一种利用硬件实现数字货币钱包的方法及硬件钱包

技术领域

[0001] 本发明涉及数字货币领域,特别涉及一种利用硬件实现数字货币钱包的方法及硬件钱包。

背景技术

[0002] 现有的数字货币钱包均为软件形式,密钥保存在电脑或者手机上,很容易被攻击并获取,数字货币被盗的风险很大。而且当手机丢失或者电脑数据损坏时,无法恢复密钥。

发明内容

[0003] 本发明提供了一种利用硬件一种利用硬件实现数字货币钱包的方法,具体包括:
[0004] 步骤S1、硬件钱包等待接收来自上位机的指令,当接收到查询余额指令时,执行步骤S2;当接收到交易指令时,执行步骤S3;
[0005] 步骤S2、硬件钱包根据安全存储区中的主密钥和预置的子密钥索引通过密钥派生算法生成子密钥对,并根据子密钥对中的子公钥生成账户地址,将账户地址与子密钥索引绑定并返回给上位机;
[0006] 步骤S3、硬件钱包根据安全存储区中的主密钥和交易指令中的子密钥索引通过密钥派生算法生成子密钥对,并使用子密钥对中的子私钥对交易指令中的交易数据进行签名得到签名结果,根据子密钥对中的子公钥和签名结果生成交易凭据,并将交易凭据返回上位机。
[0007] 本发明提供了一种硬件钱包,具体包括:
[0008] 接收模块,用于接收来自上位机的指令;
[0009] 安全存储模块,用于存储主密钥生成模块生成的主密钥;
[0010] 第一子密钥对生成模块,用于当接收模块接收到所述上位机发送的查询余额指令时,根据安全存储区中保存的主密钥和预置的子密钥索引通过密钥派生算法生成子密钥对;
[0011] 账户地址生成模块,用于根据子密钥对生成模块生成的子密钥对中的子公钥生成账户地址;
[0012] 第二子密钥对生成模块,用于当接收模块接收到上位机发送的交易指令时,根据交易指令中的子密钥索引和安全存储模块中存储的主密钥通过密钥派生算法生成子密钥对;
[0013] 签名模块,用于使用第二子密钥对生成模块生成的子私钥对接收模块接收到的所述交易指令中的交易数据进行签名得到签名结果;
[0014] 交易凭据生成模块,用于使用第二子密钥对生成模块生成的子密钥对中的子公钥和签名模块生成的签名结果生成交易凭据;
[0015] 发送模块,用于将所述账户地址生成模块生成的账户地址与所述预置的子密钥索引绑定发送给所述上位机;还用于将交易凭据生成模块生成的交易凭据发送给所述上位机。
[0016] 本发明的有益效果为数字货币私钥在硬件钱包的内部保存,解决了密钥保存的安全性问题。数字货币私钥参与的所有运算均在硬件内部执行,使私钥不出硬件钱包,解决了私钥在使用过程中的安全性问题。

附图说明

[0017] 图1为本发明实施例1提供的一种利用硬件实现数字货币的方法的流程图;
[0018] 图2-图3为本发明实施例2提供的一种利用硬件实现数字货币钱包的方法的流程图;
[0019] 图4为本发明实施例3提供的一种硬件钱包的方框图。
[0020] 具体实施方法
[0021] 下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有做出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
[0022] 实施例1
[0023] 本实施例提供一种利用硬件实现数字货币钱包的方法,参见图1,包括:
[0024] 步骤S1、硬件钱包等待接收来自上位机的指令,当接收到查询余额指令时,执行步骤S2;当接收到交易指令时,执行步骤S3;当接收到创建硬件钱包指令时,执行步骤S4;当接收到恢复硬件钱包指令时执行步骤S5;
[0025] 具体的,步骤S1具体为:当硬件钱包接收到来自上位机的指令后,获取指令的第一预设字段上的数据,并将其作为指令类型标识,根据指令类型标识判断指令的类型,若指令类型标识为第一预设指令类型标识时,判断出指令类型为创建硬件钱包指令,执行步骤S4;若指令类型标识为第二预设指令类型标识时,判断出指令的类型为恢复硬件钱包指令,执行步骤S5;若指令类型标识为第三预设指令类型标识时,判断出指令的类型为查询余额指令,执行步骤S2;若指令类型标识为第四预设指令类型标识时,判断出指令的类型为交易指令,执行步骤S3。
[0026] 步骤S2、硬件钱包根据安全存储区中的主密钥和预置的子密钥索引通过密钥派生算法生成子密钥对,并根据子密钥对中的子公钥生成账户地址,将账户地址与子密钥索引绑定并返回给上位机;
[0027] 当接收到查询余额指令时,执行步骤S2之前,还包括:硬件钱包判断安全存储区中是否存在主密钥,是则执行步骤S2;否则向上位机返回失败响应。
[0028] 具体的,本实施例上述步骤S2中,硬件钱包根据安全存储区中的主密钥和预置的子密钥索引通过密钥派生算法生成子密钥对具体包括:
[0029] 步骤401、硬件钱包根据安全存储区中的主密钥生成公钥,并设置当前子密钥索引为预设值;
[0030] 步骤402、硬件钱包根据公钥和当前子密钥索引通过密钥派生算法派生出子密钥对;
[0031] 步骤403、硬件钱包根据子密钥对中的子公钥通过预设算法生成账户地址,将账户地址和当前子密钥索引绑定写入子密钥索引列表;
[0032] 步骤404、硬件钱包更新当前子密钥索引,并判断当前子密钥索引是否小于预设值,是则向上位机返回子密钥索引列表,否则向上位机返回失败响应。
[0033] 具体的,步骤403中,根据子密钥对中的子公钥生成账户地址具体包括:硬件钱包将子公钥依次经过SHA256和RIPEMD160运算及编码运算后生成的第一数据作为账户地址。
[0034] 步骤S3、硬件钱包根据安全存储区中的主密钥和交易指令中的子密钥索引通过密钥派生算法生成子密钥对,并使用子密钥对中的子私钥对交易指令中的交易数据进行签名得到签名结果,根据子密钥对中的子公钥和签名结果生成交易凭据,并将交易凭据返回上位机。
[0035] 优选的,当接收到交易指令时,执行步骤S3之前,还包括:硬件钱包判断安全存储区中是否存在主密钥,是则执行步骤S3;否则向上位机返回失败响应。
[0036] 具体的,步骤S3中,硬件钱包根据安全存储区中的主密钥和交易指令中的子密钥索引通过密钥派生算法生成子密钥对具体为:硬件钱包根据安全存储区中的主密钥生成公钥,硬件钱包根据公钥和子密钥索引通过密钥派生算法派生出子密钥对。
[0037] 具体的,步骤S3中,根据子密钥对中的子公钥和签名结果生成交易凭据具体包括:硬件钱包根据子密钥对中的子公钥长度、子公钥、签名结果长度和签名结果计算得到交易凭据长度;并将交易凭据长度、子公钥长度、子公钥、签名结果长度和签名结果顺序拼接生成交易凭据。
[0038] 步骤S4、硬件钱包生成随机数作为密钥种子,将密钥种子通过预设字典转换为助记短语,将密钥种子通过第一预设算法生成主密钥,将主密钥存储在安全存储区,并将助记短语返回给上位机;
[0039] 进一步的,当创建硬件钱包指令中包括硬件钱包密码时,
[0040] 当接收到创建硬件钱包指令之后,执行步骤S4之前还包括:硬件钱包从创建硬件钱包指令中获取硬件钱包密码,判断硬件钱包密码是否合法,是则执行步骤S4,否则提示密码错误,结束。
[0041] 具体的,步骤S4中,硬件钱包生成随机数作为密钥种子,将密钥种子通过预设字典转换为助记短语具体包括:
[0042] 步骤101、硬件钱包生成第一预设长度的随机数,并将随机数作为密钥种子;
[0043] 步骤102、硬件钱包根据密钥种子通过第二预设算法得到第一校验值;将密钥种子与第一校验值拼接得到助记短语标识;将助记短语标识根据预设字典转换为助记短语。
[0044] 更进一步的,步骤102具体为:硬件钱包根据密钥种子通过第二预设算法得到计算结果,根据第一预设长度计算校验值长度,从计算结果中顺序截取长度为校验值长度的数据作为第一校验值;将密钥种子与第一校验值拼接得到助记短语标识。
[0045] 当创建硬件钱包指令中包括助记短语长度时,步骤S4中,硬件钱包生成随机数作为密钥种子,将密钥种子通过预设字典转换为助记短语具体包括:
[0046] 步骤201、硬件钱包根据助记短语长度计算密钥种子长度,生成数据长度为密钥种子长度的随机数,并将随机数作为密钥种子;
[0047] 更为详细的,步骤201具体为:硬件钱包根据助记短语长度计算密钥种子长度和校验值长度,生成数据长度为密钥种子长度的随机数,并将随机数作为密钥种子;
[0048] 步骤202、硬件钱包根据密钥种子通过第二预设算法得到第一校验值;将密钥种子与第一校验值拼接得到助记短语标识;将助记短语标识根据预设字典转换为助记短语。
[0049] 更为详细的,步骤202具体为:硬件钱包根据密钥种子通过第二预设算法得到计算结果,从计算结果中顺序截取长度为校验值长度的数据作为第一校验值;将密钥种子与第一校验值拼接得到助记短语标识;将助记短语标识根据预设字典转换为助记短语。
[0050] 更进一步的,步骤102或者步骤202中,将助记短语标识根据预设字典转换为助记短语具体包括:硬件钱包依次在助记短语标识中截取第二预设长度的数据作为助记单词标识,并在预设字典中查找与截取到的助记单词标识对应的助记单词,再将助记单词依次组合得到助记短语。
[0051] 相应的,步骤S4中,将密钥种子通过第一预设算法生成主密钥具体包括:硬件钱包使用预设字符串作为哈希密钥,根据第二预设算法计算密钥种子的哈希值;将计算得到的哈希值的高位端第二预设长度的数据作为主密钥。
[0052] 当创建硬件钱包指令中还包括:助记短语的语言类型时:
[0053] 相应地,上述步骤S4具体为:硬件钱包生成随机数作为密钥种子,将主密钥通过与助记短语的语言类型对应的字典转换为助记短语,将助记短语返回给上位机。
[0054] 步骤S5、硬件钱包将恢复硬件钱包指令中的助记短语根据预设字典转换为密钥种子,将密钥种子通过第一预设算法生成主密钥,将主密钥存储在安全存储区。
[0055] 具体的,硬件钱包根据助记短语确定助记短语的语言类型具体包括:硬件钱包获取助记短语中的一个助记单词,根据助记单词的unicode码确定助记短语的语言类型。
[0056] 具体的,步骤S5中硬件钱包将恢复硬件钱包指令中的助记短语根据预设字典转换为密钥种子具体包括:硬件钱包将助记短语根据预设字典转换为助记短语标识;根据助记短语标识长度计算对密钥种子长度,从助记短语标识中顺序获取长度为密钥种子长度的数据作为密钥种子。
[0057] 具体的,步骤S5中硬件钱包将恢复硬件钱包指令中的助记短语根据预设字典转换为密钥种子具体包括:硬件钱包将恢复硬件钱包指令中的助记短语根据预设字典转换为助记短语标识,从助记短语标识中获取密钥种子和第二校验值;
[0058] 更为详细的,从助记短语标识中获取密钥种子和第二校验值具体为:根据助记短语标识长度计算密钥种子长度,从助记短语标识中顺序获取长度为密钥种子长度的数据作为密钥种子,将助记短语标识中剩余的数据作为第二校验值。
[0059] 相应的,从助记短语标识中获取密钥种子和第二校验值之后,将密钥种子通过第一预设算法生成主密钥之前还包括:硬件钱包根据密钥种子生成第三校验值,并判断第三校验值和第二校验值是否匹配,是则执行将密钥种子通过第一预设算法生成主密钥,否则向上位机返回失败响应。
[0060] 具体的,硬件钱包根据密钥种子生成第三校验值具体包括,使用第一预设算法对密钥种子进行运算得到计算结果,顺序截取计算结果中长度为校验值长度的数据作为第三校验值;
[0061] 优选的,当接收到恢复硬件钱包指令之后,执行步骤S5之前还包括:硬件钱包判断恢复硬件钱包指令中的助记短语中的助记单词的数量是否不大于第三预设值,是则执行步骤S5,否则向上位机返回失败响应。
[0062] 优选的,当接收到恢复硬件钱包指令之后,执行步骤S5之前还包括:硬件钱包根据助记短语确定助记短语的语言类型,判断助记短语的语言类型是否在预设语言种类范围内,是则执行步骤S5,否则向上位机返回失败响应。
[0063] 实施例2
[0064] 本实施例提供了一种利用硬件实现数字货币钱包的方法,如图2-图3所示,包括:
[0065] 步骤201、硬件钱包上电,初始化;
[0066] 步骤202、硬件钱包等待接收来自上位机的指令,当接收到创建硬件钱包指令时,执行步骤203;当接收到恢复硬件钱包指令时,执行步骤211;当接收到查询账户余额指令时,执行步骤220;当接收到交易指令时,执行步骤227;
[0067] 具体地,硬件钱包等待接收来自上位机的指令,当接收到来自上位机的指令后,获取指令中的第一预设字段上的数据,并将其作为指令类型标识,根据指令类型标识判断指令的类型,若指令类型标识为第一预设指令类型标识时,判断出指令类型为创建硬件钱包指令时,执行步骤203;若指令类型标识为第二预设指令类型标识时,判断出指令的类型为恢复硬件钱包指令,执行步骤211;若指令类型标识为第三预设指令类型标识时,判断出指令的类型为查询账户余额指令,执行步骤220;若指令类型标识为第四预设指令类型标识时,判断出指令的类型为交易指令时,执行步骤227。
[0068] 本实施中,第一预设字段可以但不限于为指令中的前四个字节。第一预设指令类型标识可以但不限于为“0X 00460000”,第二预设指令类型标识可以但不限于为“0X 00C40000”,第三预设指令类型标识可以但不限于为“0X 00F60000”,第四预设指令类型标识可以但不限于为“0X 002A0100”。
[0069] 例如,硬件钱包等待接收来自上位机的指令“0X 00460000530400074F05626C757368047461706505636C756D7007736C656E6465720570756E6368046F7665720772656365697
665066865696768740762696F6C6F67790773656374696F6E04636F6F6B066F7074696F6E”,当接收到来自上位机的指令后,获取指令中的前四个字节的数据,并将其作为指令类型标识,其中,指令类型标识为第一预设指令类型标识,判断出指令类型为创建硬件钱包指令时,执行步骤203。
[0070] 步骤203、硬件钱包从创建硬件钱包指令中获取助记短语长度;
[0071] 例如,硬件钱包从创建硬件钱包指令中获取助记短语长度为“24”。
[0072] 优选的,创建硬件钱包指令中还包括:硬件钱包密码;相应的,步骤202和步骤203之间还包括:硬件钱包从创建硬件钱包指令中获取硬件钱包密码,判断硬件钱包密码是否合法,是则执行步骤203,否则提示密码错误,结束。
[0073] 步骤204、硬件钱包判断助记短语长度是否为第一预设值,如果是,则执行步骤205;否则,执行步骤210;
[0074] 助记短语长度具体为助记短语中包含的助记单词的个数;
[0075] 第一预设值具体12或者15或者18或者21或者24;
[0076] 步骤205、硬件钱包根据助记短语长度计算得到密钥种子长度和校验值长度;并生成长度为密钥种子长度的随机数,将该随机数作为密钥种子;
[0077] 具体的,硬件钱包将助记短语长度乘以第二预设值生成助记短语标识长度;第二预设值为助记短语中每个助记单词在预设字典中助记单词标识的比特数;本实施例中第二预设值为11bit;本实施例中助记短语长度为24与第二预设值相乘得到的助记短语标识长度为264bit;
[0078] 由于助记短语标识长度=密钥种子长度+校验值长度,且密钥种子长度与校验值长度的比值为32,根据上述关系,可以根据助记短语标识长度计算出密钥种子长度和校验值长度;本实施例中,密钥种子长度为256bit,校验值长度为8bit
[0079] 随后硬件钱包使用真随机数生成器生成数据长度为密钥种子长度即256bit的随机数作为密钥种子;例如本实施例中密钥种子具体为0X 6c 55 44 79 7a 91 11 5d c3 33 0e bd 00 38 51 d2 39 a7 06 ff 2a a2 ab 70 03 9c 55 10 dd f0 64 20;
[0080] 步骤206、硬件钱包通过第一预设算法对密钥种子进行运算得到计算结果,顺序截取计算结果中长度为校验值长度的数据作为第一校验值,将第一校验值拼接在密钥种子之后得到助记短语标识;
[0081] 本实施例中,第一预设算法可以但不限于为SHA256算法。
[0082] 具体地,硬件钱包使用SHA256算法对密钥种子进行运算得到计算结果,顺序截取计算结果中长度为校验值长度的数据作为第一校验值,将第一校验值拼接在密钥种子之后得到助记短语标识。
[0083] 例如:硬件钱包使用SHA256算法对密钥种子“0X 6c5544797a91115dc3330ebd003851d239a706ff2aa2ab70039c5510ddf06420”进行哈希运算得到的计算结果为“0X dcd2f3
552379d262d16d46dafd8c2fd3f49619e5ae70bb98ba816d74e868f4fb”,顺序截取计算结果“0X dcd2f3552379d262d16d46dafd8c2fd3f49619e5ae70bb98ba816d74e868f4fb”中中长度为校验值长度的数据作为第一校验值,即“0X dc”,将第一校验值“0X dc”拼接在密钥种子“0X 6c5544797a91115dc3330ebd003851d239a706ff2aa2ab70039c5510ddf06420”之后得到助记短语标识“0X 6c5544797a91115dc3330ebd003851d239a706ff2aa2ab70039c5510ddf0
6420dc”。
[0084] 步骤207、硬件钱包在助记短语标识中依次截取数据长度为第二预设值的数据作为助记单词标识,在预设字典中查找与助记单词标识对应的助记单词,将助记单词依次组合得到助记短语;
[0085] 步骤208、硬件钱包清空安全存储区中的数据,根据密钥种子通过第二预设算法生成主密钥;并将主密钥存入安全存储区;
[0086] 具体地,步骤208具体为:硬件钱包使用预设字符串作为哈希密钥,根据第二预设算法计算密钥种子的哈希值;将计算得到的哈希值的高位端预设长度的数据作为主密钥;
[0087] 本实施例中,第二预设算法优选为HMAC-SHA512算法。
[0088] 本实施例中,高位端预设长度的数据优选为高256比特的数据,低位端预设长度的数据优选为低256比特的数据。
[0089] 例如,预设字符串为“Bitcoin seed”的ASCII编码,则计算得到的哈希值如下“OX 6c5544797a91115dc3330ebd003851d239a706ff2aa2ab70039c5510ddf06420 920ad779104
398edc710c1641ef21abb2a198620cc32356ed285499caa301241”;将哈希值的高256bit作为主密钥,得到主密钥为0X 6c 55 44 79 7a 91 11 5d c3 33 0e bd 00 38 51 d2 39 a7 
06 ff 2a a2 ab 70 03 9c 55 10 dd f0 64 20。
[0090] 需要说明的是,步骤206-207与步骤208的顺序可以互换。
[0091] 本实施例中,第二预设值为11bit
[0092] 例如,硬件钱包在助记短语标识“0X 6c5544797a91115dc3330ebd003851d239a706ff2aa2ab70039c5510ddf06420dc”中依次截取数据长度为11bit的数据,截取到的数据依次为0110 1100 010/1 0101 0100 01/00 0111 1001 0/111 1010 1001/0001 0001 000/1 
0101 1101 11/00 0011 0011 0/011 0000 1110/1011 1101 000/0 0000 0011 10/00 
0101 0001 1/101 0010 0011/1001 1010 011/1 0000 0110 11/11 1111 0010 1/010 
1010 0010/1010 1011 011/1 0000 0000 00/11 1001 1100 0/101 0101 0001/0000 1101 
110/1 1111 0000 01/10 0100 0010 0/000 1101 1100,在预设字典中查找与助记单词标识对应的助记单词“tube/adjust/curious/this/either/banner/cave/engage/treat/stem/whisper/swamp/walnut/box/balcony/never/volume/ordina ry/raw/welcome/until/easily/because/few”,将助记单词依次组合得到助记短语“tube adjust curious this either banner cave engage treat stem whisper swamp walnut box balcony never volume ordinary raw welcome until easily because few”;
[0093] 优选的,创建硬件钱包指令中还包括:语言类型;语言类型具体包括:简体中文、繁体中文和英语;
[0094] 相应的,步骤208具体为:硬件钱包在助记短语标识中依次截取数据长度为第二预设值的数据,在与创建硬件钱包指令中的助记短语的语言类型对应的字典中查找与助记单词标识对应的助记单词,将助记单词依次组合得到助记短语;
[0095] 步骤209、硬件钱包向上位机返回助记短语,返回步骤202;
[0096] 步骤210、硬件钱包向上位机返回失败标识,返回步骤202;
[0097] 步骤211、硬件钱包从恢复硬件钱包指令中获取助记短语;
[0098] 例如,从恢复硬件钱包指令中获取助记短语“tube adjust curious this either banner cave engage treat stem whisper swamp walnut box balcony never volume ordinary raw welcome until easily because few”
[0099] 步骤212、硬件钱包判断助记短语中包括的助记单词数量是否不大于第三预设值,是则执行步骤213,否则执行步骤219;
[0100] 具体的,第三预设值为预设的助记码短语的最大长度,本实施例中,第三预设值具体为“24”;
[0101] 步骤213、硬件钱包根据助记短语确定助记短语的语言类型,判断助记短语的语言类型是否在预设语言种类范围内,是则执行步骤214,否则执行步骤219;
[0102] 具体的,硬件钱包获取助记单词中的一个助记单词,根据助记单词的unicode码确定助记短语语言类型,并判断助记短语语言类型是否为简体中文、繁体中文和英文中的一种,是则判定助记短语语言类型在预设语言种类范围内,否则判定助记短语语言类型不在预设语言种类范围内。
[0103] 步骤214、硬件钱包在助记短语的语言类型对应的字典中查找与助记短语中的各个助记单词对应的各个助记单词标识,将各个助记单词标识拼接得到助记短语标识;
[0104] 例如:硬件钱包清空安全存储区中的数据,在预设字典中查找与各个助记单词“tube/adjust/curious/this/either/banner/cave/engage/treat/stem/whisper/swamp/walnut/box/balcony/never/volume/ordinary/raw/welcome/until/easily/because/few”分别对应的各个助记单词标识“0110 1100 010/1 0101 0100 01/00 0111 1001 0/111 1010 1001/0001 0001 000/1 0101 1101 11/00 0011 0011 0/011 0000 1110/1011 
1101 000/0 0000 0011 10/00 0101 0001 1/101 0010 0011/1001 1010 011/1 0000 
0110 11/11 1111 0010 1/010 1010 0010/1010 1011 011/1 0000 0000 00/11 1001 
1100 0/101 0101 0001/0000 1101 110/1 1111 0000 01/10 0100 0010 0/000 1101 
1100”,将各个助记单词标识“0110 1100 010/1 0101 0100 01/00 0111 1001 0/111 1010 
1001/0001 0001 000/1 0101 1101 11/00 0011 0011 0/011 0000 1110/1011 1101 000/
0 0000 0011 10/00 0101 0001 1/101 0010 0011/1001 1010 011/1 0000 0110 11/11 
1111 0010 1/010 1010 0010/1010 1011 011/1 0000 0000 00/11 1001 1100 0/101 
0101 0001/0000 1101 110/1 1111 0000 01/10 0100 0010 0/000 1101 1100”拼接得到助记短语标识“0X 6c5544797a91115dc3330ebd003851d239a706ff2aa2ab70039c5510ddf0
6420dc”;
[0105] 步骤215、根据助记短语标识长度计算对密钥种子长度,从助记短语标识中顺序获取长度为密钥种子长度的数据作为密钥种子,将助记短语标识中剩余的数据作为第二校验值;
[0106] 其中,根据助记短语标识长度计算对密钥种子长度具体为:由于助记短语标识长度=密钥种子长度+校验值长度,且密钥种子长度与校验值长度的比值为32,根据上述关系,可以根据助记短语标识长度计算出密钥种子长度和校验值长度;本实施例中,密钥种子长度为256bit,校验值长度为8bit
[0107] 将步骤215中得到的助记短语标识0X 6c5544797a91115dc3330ebd003851d239a706ff2aa2ab70039c5510ddf06420dc”;中的前256bit的数据作为密钥种子,密钥种子具体为“0X 6c 55 44 79 7a 91 11 5d c3 33 0e bd 00 38 51 d2 39 a7 06 ff 2a a2 ab 70 
03 9c 55 10 dd f0 64 20;将助记短语标识的后8bit的数据作为第二校验值;
[0108] 步骤216、硬件钱包使用第一预设算法对密钥种子进行运算得到计算结果,顺序截取计算结果中的长度为校验值长度的数据作为第三校验值,判断第二校验值是否与第三校验值是否相匹配,如果是,则执行步骤217;否则,执行步骤219;
[0109] 例如,硬件钱包使用SHA256算法对密钥种子进行运算得到计算结果“0X dcd2f3552379d262d16d46dafd8c2fd3f49619e5ae70bb98ba816d74e868f4fb”,截取计算结果中的前
8bit的数据0X dc作为第三校验值,判定第二校验值“0X dc”和第三校验值相匹配,执行步骤218。
[0110] 步骤217、硬件钱包清空安全存储区中的数据,根据密钥种子通过第二预设算法生成主密钥;并将主密钥存入安全存储区;
[0111] 具体地,步骤217具体为:硬件钱包使用预设字符串作为哈希密钥,根据第二预设算法计算密钥种子的哈希值;将计算得到的哈希值的高位端预设长度的数据作为主密钥;
[0112] 本实施例中,第二预设算法优选为HMAC-SHA512算法。
[0113] 本实施例中,高位端预设长度的数据优选为高256比特的数据,低位端预设长度的数据优选为低256比特的数据。
[0114] 例如,预设字符串为“Bitcoin seed”的ASCII编码,则计算得到的哈希值如下“OX 6c5544797a91115dc3330ebd003851d239a706ff2aa2ab70039c5510ddf06420 920ad779104
398edc710c1641ef21abb2a198620cc32356ed285499caa301241”;将哈希值的高256bit作为主密钥,得到主密钥为0X 6c 55 44 79 7a 91 11 5d c3 33 0e bd 00 38 51 d2 39 a7 
06 ff 2a a2 ab 70 03 9c 55 10 dd f0 64 20
[0115] 步骤218、硬件钱包向上位机返回成功标识,返回步骤202;
[0116] 步骤219、硬件钱包向上位机返回失败标识,返回步骤202;
[0117] 步骤220、硬件钱包判断安全存储区中是否存在主密钥,是则执行步骤221;否则,执行步骤226;
[0118] 步骤221、硬件钱包根据主密钥生成公钥,并设置当前子密钥索引为预设值;
[0119] 具体的,硬件钱包将主密钥与椭圆曲线基点进行ECC点乘运算得到公钥;
[0120] 步骤222、硬件钱包根据公钥和当前子密钥索引通过密钥派生算法派生出子密钥对;
[0121] 步骤222具体为将公钥和当前子密钥索引顺序拼接,使用父链码作为哈希密钥,根据预设算法计算拼接数据的哈希值,根据哈希值截取得到子链码,对截取剩余数据做ECC加法模运算,若运算结果不为预设值,则将运算结果作为子私钥,对子私钥做ECC点乘运算,得到子公钥。
[0122] 步骤223、硬件钱包根据子密钥对中的子公钥通过预设算法生成账户地址,将账户地址和当前子密钥索引绑定写入子密钥索引列表;
[0123] 具体的,硬件钱包将子公钥依次经过SHA256和RIPEMD160运算及编码运算后生成160位(20字节)的第一数据作为账户地址;
[0124] 优选的,当生成第一数据之后,对第一数据进行Base58Check编码,并添加前导字节(表明支持哪种脚本)和四字节校验字节生成第二数据作为账户地址。
[0125] 步骤224、硬件钱包更新当前子密钥索引,并判断当前子密钥索引是否小于预设值,是则返回步骤222,否则执行步骤225;
[0126] 步骤225、硬件钱包将子密钥索引列表和成功标识发送给上位机,返回步骤202;
[0127] 步骤226、硬件钱包向上位机返回失败标识,返回步骤202;
[0128] 步骤227、硬件钱包从交易指令中获取子密钥索引和交易数据;
[0129] 具体的,交易数据中包括:上次交易数据,账户地址、交易金额。上次交易数据具体为上次交易的HASH值;
[0130] 本实施例中,接收到的交易数据具体为:0X 01000000 01
[0131] c9f3b07ebfca68fd1a6339d0808fbb013c90c6095fc93901ea77410103489ab7 00000000ffffffff 01 00bd010500000000 1976a9 14634228c26cf40a02a05db93f2f98b7
68a8e0e61b 88ac 00000000;
[0132] 其中,第六字节至第三十七字节0X c9f3b07ebfca68fd1a6339d0808fbb013c90c6095fc93901ea77410103489ab7为上次交易数据,第四十七字节至第五十四字节0X 
00bd010500000000为交易金额;第五十九字节至第七十八字节0X 634228c26cf40a02a05db93f2f98b768a8e0e61b为账户地址;
[0133] 步骤228、硬件钱包判断安全存储区中是否存在主密钥,是则执行步骤229,否则执行步骤234;
[0134] 步骤229、硬件钱包根据主密钥生成公钥;
[0135] 具体的,硬件钱包将主密钥与椭圆曲线基点进行ECC点乘运算得到公钥;
[0136] 步骤230、硬件钱包根据公钥和子密钥索引通过密钥派生算法派生出子密钥对;从子密钥对中获取子私钥;
[0137] 步骤230具体为将公钥和当前子密钥索引顺序拼接,使用父链码作为哈希密钥,根据预设算法计算拼接数据的哈希值,根据哈希值截取得到子链码,对截取剩余数据做ECC加法模运算,若运算结果不为预设值,则将运算结果作为子私钥,对子私钥做ECC点乘运算,得到子公钥。
[0138] 步骤231、硬件钱包根据子私钥对所述交易数据进行签名生成签名结果。
[0139] 具体的,子私钥通过椭圆曲线数字签名算法对交易数据进行签名,例如:本实施例中256比特的子私钥“0X 6c5544797a91115dc3330ebd003851d239a706ff2aa2ab70039c5510ddf06420”通过椭圆曲线数字签名算法对交易数据0X 0100000001c9f3b07ebfca68fd1a6
339d0808fbb013c90c6095fc93901ea77410103489ab700000000ffffffff0100bd010500000
0001976a914634228c26cf40a02a05db93f2f98b768a8e0e61b88ac00000000进行签名得到签名结果,生成的签名结果为“0X 048aefd78bba80e2d1686225b755dacea890c9ca1be10ec98
173d7d5f2fefbbf881a6e918f3b051f8aaaa3fcc18bbf65097ce8d30d5a7e5ef8d1005eaafd4b3fbe”
[0140] 步骤232、硬件钱包根据子密钥对中获取子私钥,根据子公钥和签名结果生成交易凭据;
[0141] 具体的,硬件钱包根据子公钥长度、子公钥、签名结果长度和签名结果计算得到交易凭据长度;并将交易凭据长度、子公钥长度、子公钥、签名结果长度和签名结果顺序拼接生成交易凭据;
[0142] 例如,本实施例中得到的交易凭据具体为:
[0143] “0X 8a473044022055bac1856ecbc377dd5e869b1a84ed1d5228c987b098c095030c12431a4d5249022055523130a9d0af5fc27828aba43b464ecb1991172ba2a509b5fbd6cac97ff3af0141048aefd78bba80e2d1686225b755dacea890c9ca1be10ec98173d7d5f2fefbbf881a
6e918f3b051f8aaaa3fcc18bbf65097ce8d30d5a7e5ef8d1005eaafd4b3fbe”[0144] 其中,8a:表示交易凭据长度为1104比特,8a=138字节=1104比特位,“8a”这16比特位数据不包含在总交易凭据长度内。
[0145] 47:表示子公钥长度为568比特,47=71字节=568比特位
[0146] 子公钥为:0X 3044022055bac1856ecbc377dd5e869b1a84ed1d5228c987b098c095030c12431a4d5249022062723130a9d0af5fc27828aba43b464ecb1991172ba2a509b5fbd6cac97ff3af01,共568比特位
[0147] 41:表示签名结果长度,41=65字节=520比特位
[0148] 签名结果为:0X 048aefd78bba80e2d1686225b755dacea890c9ca1be10ec98173d7d5f2fefbbf881a6e918f3b051f8aaaa3fcc18bbf65097ce8d30d5a7e5ef8d1005eaafd4b3fbe,共520比特位
[0149] 步骤233、硬件钱包向上位机返回交易凭据和签名成功标识,返回步骤202;
[0150] 本实施例中,步骤230中生成子私钥之后还包括保存子私钥,相应地,步骤233中,向上位机返回交易凭据和签名成功标识之前还包括清空子私钥。
[0151] 步骤234、硬件钱包向上位机返回签名失败标识,返回步骤202。
[0152] 实施例3
[0153] 本实施例提供一种硬件钱包,参见图4,包括:
[0154] 接收模块11,用于接收来自上位机的指令;
[0155] 具体的,接收模块11,用于接收上位机发送的指令,当接收到指令后,获取指令的第一预设字段上的数据,并将其作为指令类型标识,根据指令类型标识判断指令的类型,若指令类型标识为第一预设指令类型标识时,判定出指令类型为创建硬件钱包指令;若指令类型标识为第二预设指令类型标识时,判定指令的类型为恢复硬件钱包指令;若指令类型标识为第三预设指令类型标识时,判定指令的类型为查询账户余额指令;若指令类型标识为第四预设指令类型标识时,判定指令的类型为交易指令。
[0156] 安全存储模块12,用于存储主密钥;还用于存储主密钥生成模块15生成的主密钥;
[0157] 第一子密钥对生成模块16,用于当接收模块11接收到上位机发送的查询余额指令时,根据安全存储模块12中保存的主密钥和预置的子密钥索引通过密钥派生算法生成子密钥对;
[0158] 更为详细的,第一子密钥生成模块具体包括:
[0159] 公钥生成子模块,用于根据安全存储模块12中存储的主密钥生成公钥;
[0160] 设置子模块,用于设置当前子密钥索引为预设值;
[0161] 子密钥对派生子模块,用于根据设置子模块设置的子密钥索引和安全存储模块12存储的主密钥通过密钥派生算法派生出子密钥对;还用于当判断子模块判定更新模块更新后的子密钥索引小于预设值时根据更新模块更新后的子密钥索引和安全存储模块12存储的主密钥通过密钥派生算法派生出子密钥对;
[0162] 账户地址生成子模块,用于根据子密钥对派生子模块生成的子密钥对中的子公钥通过预设算法生成账户地址;
[0163] 更进一步的,账户地址生成子模块,用于根据子密钥对派生子模块生成的子密钥依次经过SHA256和RIPEMD160运算及编码运算后生成的第一数据作为账户地址。
[0164] 绑定子模块,用于将账户地址生成子模块生成的账户地址与子密钥索引进行绑定写入子密钥索引列表;
[0165] 更新子模块,用于更新当前子密钥索引;
[0166] 判断子模块,用于判断更新模块更新后的子密钥索引是否小于预设值;
[0167] 相应的,发送模块21,用于当判断更新模块更新后的子密钥索引不小于预设值时向上位机返回子密钥索引列表。
[0168] 账户地址生成模块17,用于根据第一子密钥对生成模块16生成的子密钥对中的子公钥生成账户地址;
[0169] 第二子密钥对生成模块18,用于当接收模块11接收到上位机发送的交易指令时,根据交易指令中的子密钥索引和安全存储模块12中存储的主密钥通过密钥派生算法生成子密钥对;
[0170] 更进一步的,第二子密钥对生成模块18,具体用于当接收模块11接收到上位机发送的交易指令时,根据安全存储模块12中存储的主密钥生成公钥,根据公钥和交易指令中的子密钥索引通过密钥派生算法生成子密钥对。
[0171] 签名模块19,用于使用第二子密钥对生成模块18生成的子私钥对接收模块11接收到的交易指令中的交易数据进行签名得到签名结果;
[0172] 交易凭据生成模块20,用于使用第二子密钥对生成模块18生成的子密钥对中的子公钥和签名模块19生成的签名结果生成交易凭据;
[0173] 更进一步的,交易凭据生成模块20,具体用于根据子密钥对生成模块生成的子密钥对中的子公钥、子公钥长度、签名模块19中生成的签名结果、签名结果长度计算交易凭据长度,并将交易凭据长度、子公钥长度、子公钥、签名结果长度和签名结果顺序拼接生成交易凭据。
[0174] 发送模块21,用于将账户地址生成模块17生成的账户地址与预置的子密钥索引绑定发送给上位机;还用于将交易凭据生成模块20生成的交易凭据发送给上位机;还用于将转换模块14生成的助记短语发送给上位机;
[0175] 随机数生成模块13,用于当接收模块11接收到来自上位机的创建硬件钱包指令时生成随机数,将随机数作为密钥种子;
[0176] 转换模块14,用于将随机数生成模块13生成的密钥种子通过预设字典转换为助记短语;还用于当接收模块11接收到恢复硬件钱包指令时,将恢复硬件钱包指令中的助记短语根据预设字典转换为密钥种子;
[0177] 具体的,转换模块14,用于将随机数生成模块13生成的密钥种子通过预设字典转换为助记短语;还用有当接收模块11接收到恢复硬件钱包指令时,将助记短语根据预设字典转换为助记短语标识;根据助记短语标识长度计算对密钥种子长度,从助记短语标识中顺序获取长度为密钥种子长度的数据作为密钥种子。
[0178] 具体的,随机数生成模块13,用于当接收模块11接收到来自上位机的创建硬件钱包指令时生成第一预设长度的随机数,将随机数作为密钥种子;
[0179] 相应的,转换模块14具体包括:
[0180] 助记短语标识生成子模块,用于根据随机数生成模块13生成的密钥种子通过第二预设算法得到第一校验值,将密钥种子与第一校验值拼接得到助记短语标识;
[0181] 更为详细的,助记短语标识生成子模块,具体用于根据随机数生成模块13生成的密钥种通过第二预设算法计算得到计算结果,根据第一预设长度计算校验值长度,从计算结果中顺序截取长度为校验值长度的数据作为第一校验值,将密钥种子与第一校验值拼接得到助记短语标识。
[0182] 转换子模块,用于将助记短语标识生成子模块生成的助记短语标识通过预设字典转换成助记短语。
[0183] 主密钥生成模块15,用于将随机数生成模块13生成的密钥种子通过第一预设算法生成主密钥;还用于将转换模块14生成的密钥种子通过第一预设算法生成主密钥;
[0184] 若接收模块11接收到的创建硬件钱包指令中包括硬件钱包密码时,硬件钱包还包括:
[0185] 第一判断模块,用于当接收模块11接收到上位机发送的创建硬件钱包指令时,判断创建硬件钱包指令中的硬件钱包密码是否合法;
[0186] 随机数生成模块13,具体用于当第一判断模块判定创建硬件钱包指令中的硬件钱包密码合法时生成随机数,将随机数作为密钥种子;
[0187] 错误提示模块,用于当第一判断模块判定创建硬件钱包指令中的硬件钱包密码不合法时提示密码错误。
[0188] 当接收模块11接收到的创建硬件钱包指令中包括助记短语长度时:
[0189] 具体的,随机数生成模块13,具体用于根据创建硬件钱包指令中的助记短语长度计算密钥种子长度,生成数据长度为密钥种子长度的随机数,将随机数作为密钥种子;
[0190] 更为详细的,随机数生成模块13,具体用于根据创建硬件钱包指令中的助记短语长度计算密钥种子长度和校验值长度,生成数据长度为密钥种子长度的随机数,将随机数作为密钥种子;
[0191] 相应的,转换模块14具体包括:
[0192] 助记短语标识生成子模块,用于根据随机数生成模块13生成的密钥种子通过第二预设算法得到第一校验值,将密钥种子与第一校验值拼接得到助记短语标识;
[0193] 更为详细的,助记短语标识生成子模块,用于根据随机数生成模块13生成的密钥种子通过第二预设算法计算得到的计算结果,从计算结果中顺序截取长度为校验值长度的数据作为第一校验值,将密钥种子与第一校验值拼接得到助记短语标识;
[0194] 更为详细的,转换子模块,用于将助记短语标识生成子模块生成的助记短语标识通过预设字典转换成助记短语。
[0195] 更进一步的,转换子模块,具体用于依次在助记短语标识生成子模块生成的助记短语标识中截取第二预设长度的数据作为助记单词标识,并在预设字典中查找与截取到的助记单词标识对应的助记单词,再将助记单词依次组合成助记短语。
[0196] 更进一步的,主密钥生成模块15,具体用于使用预设字符串作为哈希密钥,根据第二预设算法计算随机数生成模块13生成的密钥种子的哈希值,将计算得到的哈希值的高位段第二预设长度的数据作为主密钥。
[0197] 当接收模块11接收到的创建硬件钱包指令中还包括:助记短语的语言类型;
[0198] 相应的,转换模块14,具体用于将随机数生成模块13生成的密钥种子通过与助记短语的语言类型对应的字典转换为助记短语。
[0199] 优选的,硬件钱包还包括:第二判断模块,用于当接收模块11接收到恢复硬件钱包指令时,判断恢复硬件钱包指令中的助记短语的助记单词的数量是否不大于第三预设值;
[0200] 相应的,转换模块14,用于将随机数生成模块13生成的密钥种子通过预设字典转换为助记短语;还用于当第二判断模块判定助记短语的助记单词的数量不大于第三预设值时将恢复硬件钱包指令中的助记短语通过预设字典转换为密钥种子;
[0201] 相应的,发送模块21,具体用于当第二判断模块判定助记短语的助记单词的数量大于第三预设值时向上位机发送错误响应。
[0202] 优选的,硬件钱包还包括:
[0203] 第三判断模块,用于当接收模块11接收到恢复硬件钱包指令时,根据恢复硬件钱包指令中的助记短语确定助记短语的语言类型,并判断助记短语的语言类型是否在预设语言种类范围内;
[0204] 相应的,转换模块14,用于将随机数生成模块13生成的密钥种子通过预设字典转换为助记短语;还用于当第三判断模块判定助记短语的语言类型在预设语言种类范围内时将恢复硬件钱包指令中的助记短语通过预设字典转换为密钥种子;
[0205] 相应的,发送模块21,具体用于当第三判断模块判定助记短语的语言类型不在预设语言种类范围内时向上位机发送错误响应。
[0206] 更为详细的,第三判断模块具体包括:
[0207] 确定语言类型子模块,用于当接收模块11接收到恢复硬件钱包指令时,根据恢复硬件钱包指令中的助记短语中的一个助记单词,根据助记单词的unicode码确定助记短语的语言类型;
[0208] 第三判断模块,用于根据判断确定语言类型子模块确定的助记短语的语言类型是否在预设语言种类范围内。
[0209] 优选的,转换模块14,具体用于将随机数生成模块13生成的密钥种子通过预设字典转换为助记短语;还用于当接收模块11接收到恢复硬件钱包指令时,将助记短语根据预设字典转换为助记短语标识;从助记短语标识中获取密钥种子和第二校验值;
[0210] 更为详细的,转换模块14具体用于将随机数生成模块13生成的密钥种子通过预设字典转换为助记短语;还用有当接收模块11接收到恢复硬件钱包指令时,将助记短语根据预设字典转换为助记短语标识;根据助记短语标识长度计算密钥种子长度,从助记短语标识中顺序获取长度为密钥种子长度的数据作为密钥种子,将助记短语标识中剩余的的数据作为第二校验值。
[0211] 硬件钱包还包括:
[0212] 校验值生成模块,用于根据转换模块14得到的密钥种子生成第三校验值;
[0213] 更为详细的,校验值生成模块,用于使用第一预设算法对助记短语标识中获取到的密钥种子进行计算得到计算结果,顺序截取计算结果中长度为校验值长度的数据作为第三校验值。
[0214] 第四判断模块,用于判断转换模块14从助记短语标识中获取到的第二校验值与校验值生成模块生成的第三校验值是否匹配;
[0215] 主密钥生成模块15,用于将随机数生成模块13生成的密钥种子通过第一预设算法生成主密钥;还用于当第四判断模块判定第二校验值与第三校验值匹配时,将转换模块14中从助记短语标识中获取到的密钥种子通过第一预设算法生成主密钥。
[0216] 优选的,该硬件钱包还包括:
[0217] 第五判断模块,用于当接收模块11接收到上位机发送的查询余额指令时判断安全存储区中是否存在主密钥;
[0218] 第一子密钥对生成模块16,用于当第五判断模块判定安全存储模块12中存在主密钥时根据安全存储区中保存的主密钥和预置的子密钥索引通过密钥派生算法生成子密钥对;
[0219] 发送模块21,还用于当第五判断模块判定安全存储区中不存在主密钥时向上位机发送失败响应。
[0220] 优选的,硬件钱包还包括:
[0221] 第六判断模块,用于当接收模块11接收到上位机发送的交易指令时,判断安全存储模块12中是否存在主密钥;
[0222] 第二子密钥对生成模块18,用于当第六判断模块中判定安全存储模块12中保存的主密钥时根据交易指令中的子密钥索引和安全存储模块12中存储的主密钥通过密钥派生算法生成子密钥对;
[0223] 相应的,发送模块21,还用于当第六判断模块判定安全存储模块12中不存在主密钥时向上位机发送失败响应。
[0224] 以上所述,仅为本发明较佳的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明公开的技术范围内,可轻易想到的变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应该以权利要求的保护范围为准。