2021SC@SDUSC 本篇博客讨论一下椭圆曲线算法部分的代码实现。 为了可以更好地解释,我在本篇博客中先讲述椭圆曲线数字签名算法的一些基础(这些内容在前面的博客中提到过,但是并不具体)。为了让读者可以一次直接看懂这篇博客,我再次写一部分理论知识,如果已经了解这部分内容的读者,可以略过。
目录
1、ECDSA理论知识(可略过,在前面的博客中断断续续提到过一些)
椭圆曲线数字签名算法(ECDSA)是比特币用来确保资金只能由合法所有者使用的加密算法。它取决于所使用的曲线顺序和哈希函数。对于比特币,它们分别是Secp256k1和SHA256。
与ECDSA相关的几个概念: 私钥:一个秘密号码,只有生成它的人知道。私钥本质上是一个随机生成的数字。在比特币中,拥有区块链上资金对应的私钥的人可以使用这些资金。在比特币中,私钥是单个无符号256位整数(32字节)。
公钥:与私钥相对应但不需要保密的数字。可以从私钥计算公钥,但不能从私钥计算公钥。公钥可用于确定签名是否真实(换句话说,使用正确的密钥生成),而无需泄露私钥。在比特币中,公钥可以是压缩的,也可以是未压缩的。压缩公钥是33个字节,由前缀0x02或0x03和一个称为x的256位整数组成。较旧的未压缩密钥为65字节,由常量前缀(0x04)组成,后跟两个称为x和y的256位整数(2*32字节)。压缩密钥的前缀允许从x值派生y值。
签名:证明进行了签名操作的数字。签名是由待签名内容的散列加上私钥在数学上生成的。签名本身是两个数字,称为r和s。对于公钥,可以对签名使用数学算法来确定它最初是由哈希和私钥生成的,而不需要知道私钥。结果签名的长度可以是73、72或71字节(近似概率分别为25%、50%和25%——尽管大小可能更小,概率呈指数下降)
ECDSA签名和验证算法使用几个基本变量,这些变量用于获取签名和从签名获取消息的反向过程。 r和s:这些数字唯一地代表签名。 z:我们要签名的消息的散列。通常,我们需要使用消息散列的最左边的N位,其中N是所用散列函数的长度,但是,此规则不适用于比特币签名,因为所用散列函数的长度SHA256等于secp256k1曲线(256)的位长度,因此无需截断。 k:一种加密安全的随机数,用作计算r和s值的时值。 dA和QA:分别是私钥号和公钥点,用于签名和验证消息。钱包在给出钱包中包含的地址时,可以获得这些信息的副本。
签名算法从dA和z计算签名对r和s。 获得曲线的组阶n。对于Secp256k1,这是FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFE BAAEDCE6 AF48A03B BFD25E8C D0364141。 生成一个介于1和n-1之间的加密安全随机数k。 重要提示:在签名后不要重用k,因为如果攻击者知道签名消息中使用的共享nonce k,则存在漏洞可使攻击者从签名消息中派生私钥。 计算(x,y)=kG,其中G是secp256k1曲线的生成点,即04 79BE667E F9DCBBAC 55A06295 CE870B07 029BFCDB 2DC28D9 59F2815B 16F81798 483AD77 26A3C465 5DA4FBFC 0E1108A8 FD17B448 A6855419 9C47D08F FB10D4B8的未压缩形式,但也可以使用压缩形式。 计算r=x模n。如果r=0,则生成另一个随机k并重新开始。 计算s=k-1(z+rdA)模n。如果s=0,则生成另一个随机k并重新开始。
验证算法 验证算法确保签名对r和s、QA和z都是一致的。 确认r和s都在1和n-1之间。 计算u1=zs-1<mod n和u2=rs-1 mod n。 计算(x,y)=u1G+u2QA并确保它不等于无穷远处的点。无穷远处的点是一个特殊点,当您添加两个结果不在曲线上的点时,会产生该点,例如两个具有相同X值但Y值反转的点。 如果r=x mod n,则签名有效。否则,或者如果任何检查失败,则签名无效。
2、代码分析
1、首先定义了椭圆曲线算法中用到的hash算法的函数,包括调用hash包中的初始化等函数,最后成功返回1。 2、libsecp256k1使用的椭圆曲线算法核心部分,生成公钥等,具体实现过程参考libsecp256k1比特币密码算法开源库(一)
3、计算点的散列 4、在构建完成后,需要对hash进行测试,失败返回0. 5、将x和y另存为未压缩公钥 下面是编写的API部分: 仅统计错误的设置上下文。 检查是否检测到所有空值。 检测结束后,执行清除操作。 以下是椭圆曲线基点的生成当基点为生成器时,检查pubkey创建。 使用ECDH函数和自定义哈希函数进行计算。 “显式”计算,检查公钥序列化。 比较结果是否正确标量错误测试 创建随机点。 试着用坏值乘以它。 哈希函数失败导致ecdh失败。 运行测试 另外一些核心代码分析将在下一篇博客中介绍。
|