Skip to content

Latest commit

 

History

History
66 lines (50 loc) · 2.94 KB

File metadata and controls

66 lines (50 loc) · 2.94 KB

密码学基础

1. 基本概念

1.1 对称加密

DES、3DES、AES

1.2 非对称加密

RSA 椭圆曲线加密 ECC

1.3 Hash

比特币使用了 SHA256 哈希算法,而以太坊目前则使用的是 Keccak256 哈希算法。

  • SHA256 指的是 SHA2-256
  • Keccak 是 SHA3 采用的 hash 算法,之前 Keccak 和 SHA3 是同义词。在 2015.8 SHA3 最终标准化时,NIST 调整了填充算法,所以标准的 SHA3 与原先的 Keccak 算法就有区别了。Ethereum 中现在用 “Keccak256” 作为函数名,来区别于标准的 SHA3.

1.4 签名

椭圆曲线签名 ECDSA 椭圆曲线方程 y^2=x^3+ax+b (a 和 b 不同,对应的椭圆曲线不一样) secp256k1 是一种具体的椭圆曲线,方程是 y^2 = x^3 + 7, 为 比特币、以太坊 所用

2. 秘钥及编码

2.0 编码

BASE64 BASE58 都是编码格式,类似于 ASCII 编码。他们都是底层二进制数据(即 0 1)的对外可见形式,是一种封装。 BASE64 的取值是0~9A~Za~z+/,共 64 个字符 BASE58 在 BASE64 的基础上,去掉了 0 O 1 I + / 这 6 个可读性差的字符。(数字0,大写字母O,数字1,大写字母I)

2.1 私钥

私钥本质上是个随机数,是随机的 32 个 byte 的二进制数据,总数为 2 ^ 256 个,超过了宇宙中原子的总数。

2.2 公钥

公钥是由私钥得来的,有 65 个 byte 大小,其中包括 32 个 byte 的 X 和 32 个 byte 的 Y,(X 和 Y 是椭圆曲线上的坐标),还有一个字节是0x04 公钥以 16 进制的形式显示,就有 130 个十六进制的数字。

公钥的压缩: 由于椭圆曲线是对称的,知道一半的信息就可以推导出另外一半,所以可以压缩成 33 个 byte。 公钥的压缩对私钥有影响: 私钥的开头经常以 5 或者 L、K ,以 5 开头说明公钥是未压缩的,为L 或 K 的是压缩过的。

2.3 地址

由于公钥太长了,所以有了地址的概念。 address=Base58(version+hash160(SHA-256(public key))+checksum) checksum=get_front_four( SHA-256(SHA-256(version+hash160)))

公钥的压缩还对地址有影响: 一个公钥对应一个地址,所以压缩和未压缩的公钥会分别对应一个地址

私钥用来签名,公钥用来验证签名。

2.4 验证

公钥生成地址,验证发送交易的地址是否和该公钥生成的地址一致 公钥验证私钥的签名,用来验证该交易是否使用了正确的私钥签名 私钥生成公钥是成对出现,公钥可以生成对应的唯一地址,这样就能确认了该地址发送的交易是否使用了对应的私钥

3. 秘钥文件存储格式

SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12

X.509 是一种证书标准,目前有两种 PEM 以"-----BEGIN..."开头, "-----END..."结尾,内容是BASE64编码。 DER 是二进制格式,不可读 CRT CER KEY CSR PFX/P12 p7b JKS 都是文件扩展名,应用的场景不同

4. 编程

4.1 python

module secp256k1

4.2 java