比特币钱包地址的概念以及SHA256和椭圆曲线乘法加密算法的详解

比特币钱包,密钥,地址

钱包就是密钥所在之处,钱包是私钥的容器,通过有序文件或者简单的数据库实现或者用原有的私钥通过单向哈希函数生成每一个新的私钥,并将新的密钥顺序连接。

比特币钱包包含的是私钥而不是比特币,一个用户可以有一个或者多个私钥的钱包,钱包中含有成对的私钥和公钥,用户用私钥来签名交易,比特币是以交易输出的形式来存储在区块链中。(避免地址重复原则—每个比特币地址只能用一次交易)

数字密钥由用户生成并且存储在一个简单的数据库中。

钱包分为确定性钱包和非确定性钱包。
非确定性钱包是随机生成的私钥的集合,Just a Bunch Of Key(JBOK),一次性生成足够数量的私钥,保存所有的副本,每一把都需要备份,一旦丢失则钱包控制的资金就丢失了,不鼓励使用。

确定性钱包也叫种子钱包(HD钱包属于确定性钱包),从一个主密钥生成海量的子密钥,一旦控制了主密钥,就可以生成所有的子密钥,确定性钱包是树状结构,仅备份一次就行。确定性钱包的好处:1.安全(可以离线存储主密钥)2.权限控制(树形结构对应各分支部门)3.便于记账


密钥(去中心化信任和控制,所有权认证,密码学证明)
公钥:银行账号
私钥:PIN码或者支票签名(储存在钱包文件内)
私钥可以生成特定消息的签名,不泄露私钥的同时对公钥验证
并非所有的比特币地址都是公钥,还有可能是脚本(其他支付对象)

密钥用途:生成签名、证明所有权、创造比特币靓号地址和纸钱包


私钥(k)经过单向椭圆曲线相乘算法变为公钥(K)

公钥(K)经过单向双哈希函数变为比特币地址

单向不可逆数学函数:素数幂和椭圆曲线乘法



生成私钥相当于生成1—2^256之间的一个随机数
(伪随机数生成器CSPRNG)
编程角度:密码学安全的随机源中取一长串随机字节,然后进行SHA256哈希
算法运算,产生一个256位的数字然后验证(着重理解SHA256算法)


通过椭圆曲线乘法(比特币程序大多用OpenSSL加密库计算或者调用EC_POINT_mul())从私钥得到公钥(不可逆转),K=k*G(G为生成点的常数点)


椭圆曲线:
无穷远点相当于0在加法中,可表示为X=Y=0
+相当于实数相加
EXP:
P3=P1+P2
P3可以在P1和P2之间画一条线来确定,直接与椭圆曲线上的一点相交,该点即为
P3’=(x,y),P3=(x,-y)。
若P1和P2为同一点,P1 P2的连线就是P1的切线,曲线上有且只有一个新的点与
该切线相交
若P1和P2有相同的X的值,不同Y的值,切线完全垂直,P3为无穷远点
若P1就是无穷远点,那么P3=P2,P2亦然

EXP:
给定椭圆上点P,如果K为整数,则KP=P+P+P+P……P(K次)   加法的拓展,不停的加

比特币地址=RIPEMD160(SHA256(K))(通常是经过Base58Check)

Base58Check编码:比特币地址前缀为0x00,私钥编码前缀为0x80,checksum=sha256(sha256(prefix+data))取前4个字节

最终比特币地址为:prefix+data+checksum前4字节


椭圆加密算法ECC(加密/解密  签名  生成软件序列号)

无穷远点与平常点

射影平面坐标系AX:Y:Z

椭圆曲线(维尔斯塔拉斯方程)  y^2*z+a1*x*y*z+a3*y*z^2=x^3+a2*x^2*z+a4*x*z^2+a6*z^3  椭圆曲线不是椭圆

椭圆曲线的切线斜率  k=(3*x^2+2*a2*x+a4+a1*y)/(2*y+a1*x+a3)

由连续到离散:满足有限域Fp上的三个法则

 

加密解密基于一个数学上的难题(RSA):给定两个素数pq很容易相乘得到n,而对n进行

因式分解相对困难

首先,A选定一个椭圆曲线Epab)选取其中一点G

A选择一个私钥k,并且生成公钥K=kG

AK,G,Epab)传给B

B将明文编码到Epab)上的一点M,并且产生一个随机数rr<n

B计算点C1=M+rKC2=rG,将C1 C2传给A

A收到信息后可以计算出M,并将M解码得到明文

加密/解密参数选择:T=p,a,b,G,n,hp,a,b用来确定一条椭圆曲线,G为基点,n为点

G的阶,h是椭圆曲线上所有点的个数mn相除的整数部分

满足条件:p越大越安全,但是计算速度会变慢,200位左右可以满足一般的安全要求

p!=n*h

pt!=1(mod n)   1<=t<=20

4*a^3+27*b^2!=0(mod p)

n位素数

h<=4

 

 

 

 

 安全散列算法SHA256

输入报文最大长度要求为2^64bit,然后按512bit一组进行分组,最终产生的是一个256bit的报文摘要

首先,附加填充比特,对输入的报文进行填充使报文长度与448512同余(长度=448mod512)填充比特范围是1512,填充比特最高位为1,其余位为0(后面会加上一个64bit原始报文的长度信息)

然后,附加长度值,将64bit表示的初始报文的位长度附加在填充的报文后

初始化缓存,用一个256bit的缓存来存放散列函数的中间及最终结果,每一步使用一个32bit的常数值KT和一个32bitWT

 

A=0x6A09E667

B=0xBB67AE85

C=0x3C6EF372

D=0xA54FF53A

E=0x510E527F

F=0x9B05688C

G=0x1F83D9AB

H=0x5BE0CD19

用六种基本逻辑函数处理报文分组序列,64步迭代运算

 



参与运算的都是32bit的数,WT是分组之后的报文,512bit=32bit*16.也就是说WT

T=1,2,3,4……16由该组报文产生

WT T=17,18,19……64由WT推导公式计算出来,WT的递推公式为:

WT=σ1(Wt-2)+Wt-70(Wt-15)+Wt-16

不断处理分组的报文,SHA256算法最后一个分组产生的输出就是报文摘要

SHA-1与MD5的比较

  因为二者均由MD4导出,SHA-1和MD5彼此很相似。相应的,他们的强度和其他特性也是相似,但还有以下几点不同:

  对强行供给的安全性:最显著和最重要的区别是SHA-1摘要比MD5摘要长32 位。使用强行技术,产生任何一个报文使其摘要等于给定报摘要的难度对MD5是2^128数量级的操作,而对SHA-1则是2^160数量级的操作。这样,SHA-1对强行攻击有更大的强度。

  对密码分析的安全性:由于MD5的设计,易受密码分析的攻击,SHA-1显得不易受这样的攻击。

  速度:在相同的硬件上,SHA-1的运行速度比MD5慢。


 

RIPEMD160算法:是针对MD4和MD5算法缺陷分析提出的算法,摘要长度160,用BouncyCastle实现

将摘要转换为40位16进制的数




阅读更多

更多精彩内容