比特币与区块链学习笔记(一) 加密货币与数字签名

文章目录

  • Cryptocurrency
    • 哈希函数
    • 三个properties
      • Preimage resistant 抗原像性/单向性
      • Collision resistant 抗碰撞性
        • Birthday attack 生日攻击
        • 抗碰撞性
      • Second preimage resistant 抗第二原像性
    • 安全哈希算法 Secure Hash Algorithm (SHA-256)
  • 数字签名
    • Elliptic Curve Digital Signature Algorithm 椭圆曲线数字签名算法
      • 基于模运算的单向加密算法
      • ECDSA
        • 几何解释
        • 算法离散问题:
      • 在加密货币中的应用

学校突然有一门讲比特币的课,这个已经有了很多年的概念我一直不甚了解,就打算去旁听一下长长见识(为啥不选课呢?因为我怂啊)。

Cryptocurrency

英文授课嘛,总有些词需要查。 百度百科上给的解释是这样的

加密货币(英文:Cryptocurrency,常常用复数Cryptocurrencies,又译密码货币,密码学货币)
是一种使用密码学原理来确保交易安全及控制交易单位创造的交易媒介。 
加密货币是数字货币(或称虚拟货币)的一种 。
比特币在2009年成为第一个去中心化的加密货币,这之后加密货币一词多指此类设计。 
自此之后数种类似的加密货币被创造,它们通常被称作altcoins。 
加密货币基于去中心化的共识机制 ,与依赖中心化监管体系的银行金融系统相对。

而BitCoin呢?

BitCoin:A Peer-toPeer Electronic Cash System

也就是一种对等电子现金系统

哈希函数

Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。

而比特币就是和哈希函数 y = h ( x ) y=h(x) y=h(x) 密切相关的

  • Input : arbitrary length bit strings
  • Output : a fixed length bit string

它的输入是任意长度的位串,输出则是固定长度的位串(没错没错压缩映射,而且只能由input到output,output推不出来input)

三个properties

Preimage resistant 抗原像性/单向性

很难通过一个给定的哈希值y来找到原像x
如果有n位输入,那么时间复杂度为 O ( 2 n ) O(2^n) O(2n)

Collision resistant 抗碰撞性

很难找到两个不同的值 x x x x ′ x' x 使得 h ( x ) = h ( x ′ ) h(x) = h(x') h(x)=h(x)

Birthday attack 生日攻击

这个名字还挺可爱的,因为来源于一个生日的例子

生日悖论是指,如果一个房间里有23个或23个以上的人,
那么至少有两个人的生日相同的概率要大于50%。
这就意味着在一个典型的标准小学班级(30人)中,
存在两人生日相同的可能性更高。
对于60或者更多的人,这种概率要大于99%。

P r ( r i = r j ∣ i ≠ j ) = 1 − P r ( r i ≠ r j ∣ i ≠ j , ∀ i , ∀ j ) = 1 − N − 1 N … N − ( n − 1 ) N = 1 − ∑ i = 1 n − 1 ( 1 − i N ) ≥ 1 − Π i = 1 n − 1 e − i N = 1 − e − ( n 2 2 N ) P_r(r_i=r_j|i\not = j) = 1 - P_r(r_i\not = r_j|i\not = j,\forall i,\forall j)=1-\frac{N-1}{N}\dots\frac{N-(n-1)}{N} = 1-\sum_{i=1}^{n-1}(1-\frac{i}{N})\ge 1 - \Pi_{i=1}^{n-1} e^{-\frac{i}{N}} =1 - e^{-(\frac{n^2}{2N})} Pr(ri=rji=j)=1Pr(ri=rji=j,i,j)=1NN1NN(n1)=1i=1n1(1Ni)1Πi=1n1eNi=1e(2Nn2)

总之就是当N很大的时候概率很接近于1

抗碰撞性

虽然有,但是找到的很慢。

比方说每秒计算 300 × 1 0 1 5 300\times 10^15 300×1015 个hash,使用SHA-256,那么需要 2 128 300 ∗ 1 0 15 ∗ 365 ∗ 24 ∗ 60 ∗ 60 = 3.6 ∗ 1 0 13 \frac{2^{128}}{300*10^{15}*365*24*60*60} = 3.6*10^{13} 30010153652460602128=3.61013
总之很恐怖

Second preimage resistant 抗第二原像性

找到两个不同的值 x x x x ′ x' x 使得 h ( x ) = h ( x ′ ) h(x) = h(x') h(x)=h(x) 所需要的时间复杂度是 O ( 2 n ) O(2^n) O(2n)

安全哈希算法 Secure Hash Algorithm (SHA-256)

SHA有很多,其中SHA-256输出有256bits

SHA-256在bitcoins中的应用

  • proof of work algorithm
  • creation of bitcoin addresses

总之就是用来验证计算和创建地址的。

数字签名

公钥加密(public key cryptography)总是需要数字签名

( s k , p k ) = ( s e c r e t / p r i v a t e    k e y , p u b l i c    k e y ) (sk,pk)=(secret/private ~~key,public ~~key) (sk,pk)=(secret/private  key,public  key)

比如说

  • A想给B传递一条信息
  • A以给定的keysize生成key pair —— ( s k , p k ) (sk,pk) (sk,pk)
  • B得到 p k pk pk
  • A生成数字签名 s i g n a t u r e = s i g n ( s k , m e s s a g e ) signature = sign(sk,message) signature=sign(sk,message)
  • B通过 ( p k , m e s s a g e , s i g n a t u r e ) (pk,message,signature) (pk,message,signature) 来获得message

Elliptic Curve Digital Signature Algorithm 椭圆曲线数字签名算法

基于模运算的单向加密算法

已知一个整数a,它被整数b除,得到余数c,这很容易。但是反过来,已知b和c,想要求出a,则是不可能的,只能去一个数一个数的去猜。a是私钥,c是公钥,这样就实现了单向加密。
如我们有整数0-9,对10取模。

  • closed: 从0-9中抽取任意两个整数求和,对10取模后是0-9的整数。
  • Identity: 0和任何数求和后还是那个数
  • Invertible: x + ( 10 − x ) = 0 x+(10-x) = 0 x+(10x)=0 10 − x 10-x 10x 是x的inverse
  • Associative: ( x + y ) + z = x + ( y + z ) (x+y)+z=x+(y+z) (x+y)+z=x+(y+z)

ECDSA

例:
椭圆曲线: q y 2 + d y = r x 3 + c x 2 + a x + b qy^2+dy=rx^3+cx^2+ax+b qy2+dy=rx3+cx2+ax+b
比特币与区块链学习笔记(一) 加密货币与数字签名_第1张图片
比特币与区块链学习笔记(一) 加密货币与数字签名_第2张图片

几何解释

  • 以刚才的第二个图为例,如果有两个不同的P、Q点,连接画一条直线出来,这条直线和曲线有一个交点-R,这意味着 P+Q=R
  • 而如果 Y P = − Y Q Y_P = -Y_Q YP=YQ,那么 这个线将和曲线没有交点,因此 P + Q = O P+Q = O P+Q=O ,O未无穷远点。
  • 如果 P=Q,则是做了一条过Q(或Q)的切线

比特币与区块链学习笔记(一) 加密货币与数字签名_第3张图片

由此可以定义点的加减法,在次之上,点的乘法为

Q = k G = G + G + G + . . . + G ( 共 k 个 ) Q=kG = G+G+G+...+G(共k个) Q=kG=G+G+G+...+G(k)

算法离散问题:

  • 循环群:由单个元素生成的群
  • 对曲线上任一点G,点 Q = k G Q=kG Q=kG 都会形成一个循环群
  • 椭圆曲线上的离散算法问题:
    1. 给定 G G G Q = k G Q=kG Q=kG ,如果k很大的话我们很难算出 k k k
    1. k是离散的(点加的个数嘛)

在加密货币中的应用

y 2    m o d    p   =   x 3 + a x + b    m o d    p y^2~~ mod~~p ~=~x^3+ax+b ~~mod~~p y2  mod  p = x3+ax+b  mod  p

  1. 只使用整数
  2. a和b不比p大
  3. 曲线上的点数=p

你可能感兴趣的:(区块链与比特币,区块链,比特币)