主页 > 以太坊imtoken > 非对称加密BTC算法面试题

非对称加密BTC算法面试题

以太坊imtoken 2023-08-20 05:10:00

1、请比较对称加密(如AES)和非对称加密算法(如RSA),简述非对称加密算法的优缺点和实际场景。

对称加密:加密和解密使用相同的密钥,所以称为对称加密。 对称加密只有一个密钥作为私钥。 常见的对称加密算法:DES、AES。

非对称加密:加密和解密使用不同的密钥。 一个是公钥,另一个是私钥。 用公钥加密的信息只能用私钥解密。 相反,用私钥加密的信息只能用公钥解密。

优缺点:安全性更高,公钥公开,私钥不公开。 缺点:加解密耗时长,速度慢,只适合加密少量数据。 实际场景:ssh协议。

2、请简要描述一下您对比特币协议BIP32、BIP39和BIP44的理解? 并描述了BIP39中从助记词到Seed的计算过程。 (如果能用代码实现就加分了)。

BIP32:为了解决大量私钥的备份和管理问题,N个私钥是基于一个随机数种子通过层次确定性推导得到的,保存时只能保存一个种子。

BIP44:是BIP32的分层路径定义规范。 密钥是分层派生的,通常用路径表示,每一层用斜杠/表示。 从主私钥派生的私钥以“m”开头。 因此,第一个父密钥生成的子私钥为m/0。 第一个公钥是 M/0。 第一个子键的子键是m/0/1,依此类推。 BIP44 为这个路径规定了一个规范的含义(同时也扩展了对多种货币的支持)。 BIP44 指定了一个包含五个预定义树级别的结构:

m /purpose'/coin'/account'/change/address_index

m是固定的,Purpose也是固定的,值为44(或0x8000002C); 硬币类型

this代表币种,0代表比特币,1代表比特币测试链,60代表以太坊 Account代表这个币种的账户索引,从0开始; Change 常量 0 用于外部链,常量 1 用于内部链(也称为地址变化)。 外部链用于在钱包外可见的地址(例如,接收付款)。 内链用于钱包外不可见的地址,用于返回交易变更。 (所以一般用0); address_index 地址索引,从0开始,代表生成的地址。 官方建议每个账户下的address_index不要超过20。根据EIP85提出的讨论,以太坊钱包也遵循BIP44标准,确定的路径为m/44'/60'/a'/0/名词; a代表账号比特币采用的加密算法,n是第n个生成的地址,60是SLIP44提案中确定的以太坊的编码。

BIP39:通过定义助记词让种子备份更友好。

BIP32 允许我们存储随机数种子而不是一堆密钥。 但是对于大多数用户来说,还是很不友好的,这促使了BIP39的出现。 它使用助记符生成种子。 在这种情况下,用户只需要记住助记词就可以创建随机种子作为BIP32种子。 整个过程包括两个步骤: 1. 生成助记词 2. 从助记词推导出种子。 生成助记词的方法:生成助记词的过程是这样的:先生成一个128位的随机数,加上校验随机数4位得到一个132位的数比特币采用的加密算法,然后每11位做一次切分,从而有12个二进制数,然后用每个数去查找BIP39定义的单词表,从而得到12个助记词。 助记词推导种子:该过程使用Key stretching功能来增强弱密钥的安全性。

3.已知公钥

X=0x1E25ECA6C24E4438DB9AD6E66A63D97855F0E910DDF15D3EEF256AD9D5

41CD5A

Y=0xF22469776B19A8F60D170CDB566CC90EB56DC1FBBD14BE5A6086A75959

4AD08F

请计算对应的BTC地址? (建议写每一步转换的中间结果)

1.获取公钥:

X=0x1E25ECA6C24E4438DB9AD6E66A63D97855F0E910DDF15D3EEF256AD9D541CD5A

Y=0xF22469776B19A8F60D170CDB566CC90EB56DC1FBBD14BE5A6086A759594AD08F

结合X和Y公钥地址得到标准地址(130*4bit=65字节)

041E25ECA6C24E4438DB9AD6E66A63D97855F0E910DDF15D3EEF256AD9D541CD5A

F22469776B19A8F60D170CDB566CC90EB56DC1FBBD14BE5A6086A759594AD08F

2.公钥的SHA-256散列

对齐并进行SHA-256哈希计算得到结果(64*4bit=32字节);

1dc3cdfa3286e900e6567a3354ca2907612408e2edb0507ff7d5b07212738268

3. 取上一步的结果,计算出RIPEMD-160哈希值(20bytes)

f12befaba88f09619af4e2cf0f42f177d55dda0a'

4. 取上一步的结果,在前面加上地址版本号(比特币主网版本号“0x00”)

00f12befaba88f09619af4e2cf0f42f177d55dda0a

5. 取上一步的结果,计算两次SHA-256哈希值(32bytes)

-1- 36a852646d95a2ff65b65702e4133ccbd4ae921141e929fdd80c0463c0eaaa09

-2- aabe7a349b23b3c4995807f42f8a9b9910eda7d19b62eb271edb9db25decfb1d

6.取上一步结果的前4个字节(8位十六进制)

aabe7a34

7. 公钥哈希,在第4步的结果后加上这4个字节作为验证(这是比特币地址的十六进制形式)。

00f12befaba88f09619af4e2cf0f42f177d55dda0aaabe7a34

八、地址

最终为用户:使用base58编码转换地址(这是最常见的比特币地址形式)

1FYnVTYGNcutq3F7GwbHMhx77hCum6DcbK

2) 编写一个函数从公钥计算地址。

# coding:utf-8
from __future__ import print_function
import cryptos
def func(x,y):
      public_key=(int(x,16),int(y,16))
      print("Public Key (x,y) coordinates is:", public_key)
      # Encode as hex, prefix 04
      hex_encoded_public_key = cryptos.encode_pubkey(public_key, 'hex')
      print("Public Key (hex) is:", hex_encoded_public_key)
      # Compress public key, adjust prefix depending on whether y is even or odd
      (public_key_x, public_key_y) = public_key
      compressed_prefix = '02' if (public_key_y % 2) == 0 else '03'
      hex_compressed_public_key = compressed_prefix + (cryptos.encode(public_key_x, 16).zfill(64))
      print("(cryptos.encode(public_key_x, 16):", cryptos.encode(public_key_x, 16))
      print("cryptos.encode(public_key_x, 16).zfill(64):", cryptos.encode(public_key_x, 16).zfill(64))
      print("Compressed Public Key (hex) is:", hex_compressed_public_key)
      # Generate bitcoin address from public key
      print("Bitcoin Address (b58check) is:", cryptos.pubkey_to_address(public_key))
      # Generate compressed bitcoin address from compressed public key
      print("Compressed Bitcoin Address (b58check) is:",
            cryptos.pubkey_to_address(hex_compressed_public_key))