1. 加密与签名¶
1.1. 加密算法¶
缩写 | 英文全名 | 中文翻译 |
---|---|---|
EC | Elliptic Curve | 椭圆曲线 |
ECC | Elliptic Curve Cryptogphay | 椭圆曲线密码学 |
ECDSA | Elliptic Curve Digital Signature Algorithm | 椭圆曲线数字签名算法 |
DH | Diffie-Hellman Key Exchange Diffie-Hellman | 密钥交换 |
ECDH | Elliptic Curve Diffie-Hellman Key Exchange | 椭圆曲线Diffie-Hellman密钥交换 |
IES | Integrated Encryption Schema | 集成加密框架 |
ECIES | Elliptic Curve Integrated Encryption Schema | 椭圆曲线集成加密框架 |
KDF | Key Derivation Function | 密钥(私钥)生成函数 |
1.2. 椭圆曲线加密(ECC:Elliptic Curve Cryptography)¶
1.2.1. 1. 原理性质¶
椭圆曲线加密法是一种基于离散对数问题的非对称加密法,可以用对椭圆曲线上的点进行加法或乘法运算来表达。 下图是一个椭圆曲线的示例,类似于比特币所用的曲线。
secp256k1
y^2 = (x^3 + 7) \over (F_p)
y^2 \bmod p = (x^3 + 7) \bmod p
上述mod p(素数p取模)表明该曲线是在素数阶p的有限域内,也写作Fp,其中p = 2^256 – 2^32 – 2^9 – 2^8 – 2^7 – 2^6 – 2^4 – 1, 这是个非常大的素数
1.2.2. 数字签名(ECDSA)¶
BTC数字签名算法是椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm)或ECDSA。
ECDSA用于脚本函数OP_CHECKSIG
,OP_CHECKSIGVERIFY
,OP_CHECKMULTISIG
和OP_CHECKMULTISIGVERIFY
。
数字签名在比特币中有三种用途。
第一,签名证明私钥的所有者,即资金所有者,已经授权支出这些资金
第二,授权证明是不可否认的(不可否认性)
第三,签名证明交易(或交易的具体部分)在签字之后没有也不能被任何人修改。
通常使用椭圆曲线算法生成密钥对
比特币密钥长度:256位
公钥哈希值=RIMPED160(SHA256(公钥))
比特币地址=1+Base58(0+公钥哈希值+校验码)
校验码=前四字节(SHA256(SHA256(0+公钥哈希值)))
签名
发送方使用HASH算法计算数据的HASH值
发送方使用本方的私钥加密HASH值,得到签名
接收方使用HASH算法计算数据的HASH值
接收方使用发送方的公钥解密签名得到发送的HASH值
比较两个HASH值的一致性
1.2.3. 数字签名如何工作¶
数字签名是一种由两部分组成的数学方案:
第一部分是使用私钥(签名密钥)从消息(交易)创建签名的算法;
第二部分是允许任何人验证签名的算法,给定消息和公钥。
1.2.3.1. 创建签名¶
在比特币的ECDSA算法的实现中,被签名的“消息”是交易,或更确切地说是交易中特定数据子集的哈希值(参见签名哈希类型(SIGHASH))。签名密钥是用户的私钥,结果是签名:
Sig = F{sig}(F{hash}(m), dA)
dA 是签名私钥
m 是交易(或其部分)
Fhash 是散列函数
Fsig 是签名算法
Sig 是结果签名
函数Fsig
产生由两个值组成的签名Sig,通常称为R和S:
1.2.3.2. 验证签名¶
要验证签名,必须有签名(R和S)、序列化交易和公钥(对应于用于创建签名的私钥)。本质上,签名的验证意味着“只有生成此公钥的私钥的所有者,才能在此交易上产生此签名。”
签名验证算法采用消息(交易或其部分的哈希值)、签名者的公钥和签名(R和S值),如果签名对该消息和公钥有效,则返回 TRUE 值。
1.2.3.3. ECDSA数学¶
签名由产生由两个值R和S组成的签名的数学函数Fsig
创建。
签名算法首先生成一个 ephemeral(临时)私公钥对。 在涉及签名私钥和交易哈希的变换之后,该临时密钥对用于计算R和S值。
临时密钥对基于随机数k,用作临时私钥。 从k,我们生成相应的临时公钥P(以P = k * G计算,与派生比特币公钥相同);参见[pubkey]部分)。数字签名的R值则是临时公钥P的x坐标。
1.3. 加密常用库¶
1.3.1. JavaScript :¶
1.3.1.1. Elliptic¶
支持以下曲线
secp256k1 ==ECDSA==
p192
p224
p256
p384
p521
curve25519 ==ECDH==
ed25519 ==EdDSA==
1.3.1.2. Eccrypto¶
Only secp256k1 curve ==ECDSA== ==ECDH== ==ECIES==
1.3.1.3. tiny-secp256k1¶
1.3.1.4. crypto-browserify¶
实现以下:
createHash (sha1, sha224, sha256, sha384, sha512, md5, rmd160)
createHmac (sha1, sha224, sha256, sha384, sha512, md5, rmd160)
pbkdf2
pbkdf2Sync
randomBytes
pseudoRandomBytes
createCipher (aes)
createDecipher (aes)
createDiffieHellman
createSign (rsa, ecdsa)
createVerify (rsa, ecdsa)
createECDH (secp256k1)
publicEncrypt/privateDecrypt (rsa)
privateEncrypt/publicDecrypt (rsa)
2. 多重签名¶
多重签名脚本设置了一个条件,其中N个公钥被记录在脚本中,并且至少有M个必须提供签名来解锁资金。这也称为M-N方案,其中N是密钥的总数,M是验证所需的签名的数量。例如,2/3的多重签名是三个公钥被列为潜在签名人,至少有2个有效的签名才能花费资金。
设置M-N多重签名条件的锁定脚本的一般形式是:
M <Public Key 1> <Public Key 2> ... <Public Key N> N CHECKMULTISIG
M是花费输出所需的签名的数量,N是列出的公钥的总数。 设置2到3多重签名条件的锁定脚本如下所示:
2 <Public Key A> <Public Key B> <Public Key C> 3 CHECKMULTISIG
上述锁定脚本可由含有签名和公钥的脚本予以解锁: 或者由3个存档公钥中的任意2个相一致的私钥签名组合予以解锁。 两个脚本组合将形成一个验证脚本:
<Signature B> <Signature C> 2 <Public Key A> <Public Key B> <Public Key C> 3 CHECKMULTISIG
上述例子中相应的设置条件即为:解锁脚本是否含有3个公钥中的任意2个相对应的私钥的有效签名。