比特币加密技术之椭圆曲线密码学(2)

上述mod p( 素数p取模) 表明该曲线是在素数阶p的有限域内, 也写作Fp, 其中p = 2^256 – 2^32 – 2^9 – 2^8 – 2^7 – 2^6 – 2^4 – 1,这是⼀个⾮常⼤的素数。
因为这条曲线被定义在⼀个素数阶的有限域内, ⽽不是定义在实数范围, 它的函数图像看起来像分散在两个维度上的散点图, 因此很难画图表⽰。 不过, 其中的数学原理与实数范围的椭圆曲线相似。 作为⼀个例⼦, 下图显⽰了在⼀个⼩了很多的素数阶17的有限域内的椭圆曲线, 其形式为⽹格上的⼀系列散点。 ⽽ secp256k1 的⽐特币椭圆曲线可以被想象成⼀个极⼤的⽹格上⼀系列更为复杂的散点。


比特币加密技术之椭圆曲线密码学

图为: 椭圆曲线密码学F(p)上的椭圆曲线, 其中p = 17

下⾯举⼀个例⼦, 这是 secp256k1 曲线上的点P, 其坐标为(x, y)。 可以使⽤Python对其检验:


比特币加密技术之椭圆曲线密码学

在椭圆曲线的数学原理中, 有⼀个点被称为“⽆穷远点”, 这⼤致对应于0在加法中的作⽤。 计算机中, 它有时表⽰为X = Y =0( 虽然这不满⾜椭圆曲线⽅程, 但可作为特殊情况进⾏检验) 。 还有⼀个 + 运算符, 被称为“加法”, 就像⼩学数学中的实数相加。 给定椭圆曲线上的两个点P1和P2, 则椭圆曲线上必定有第三点 P3 = P1 + P2。
⼏何图形中, 该第三点P3可以在P1和P2之间画⼀条线来确定。 这条直线恰好与椭圆曲线上的⼀点相交。 此点记为 P3’=(x, y)。 然后, 在x轴做映射获得 P3=(x, -y)。

下⾯是⼏个可以解释“⽆穷远点”之存在需要的特殊情况。 若 P1和 P2是同⼀点, P1和P2间的连线则为点P1 的切线。 曲线上有且只有⼀个新的点与该切线相交。 该切线的斜率可⽤微分求得。 即使限制曲线点为两个整数坐标也可求得斜率!

在某些情况下( 即, 如果P1和P2具有相同的x值, 但不同的y值) , 则切线会完全垂直, 在这种情况下, P3 = “⽆穷远点”。

若P1就是“⽆穷远点”, 那么其和 P1 + P2= P2。 类似地, 当P2是⽆穷远点, 则P1+ P2 = P1。 这就是把⽆穷远点类似于0的作⽤。

事实证明, 在这⾥ + 运算符遵守结合律, 这意味着(A+B)C = A(B+C)。 这就是说我们可以直接不加括号书写 A + B + C, ⽽不⾄于混淆。

⾄此, 我们已经定义了椭圆加法, 为扩展加法下⾯我们对乘法进⾏标准定义。 给定椭圆曲线上的点P, 如果k是整数, 则 kP =P + P + P + …+ P( k次) 。 注意, k被有时被混淆⽽称为“指数”。

生成公钥

以⼀个随机⽣成的私钥k为起点, 我们将其与曲线上已定义的 ⽣成点G相乘以获得曲线上的另⼀点, 也就是相应的公钥K。 ⽣成点是secp256k1标准的⼀部分, ⽐特币密钥的⽣成点都是相同的:

{K = k * G}

其中k是私钥, G是⽣成点, 在该曲线上所得的点K是公钥。 因为所有⽐特币⽤⼾的⽣成点是相同的, ⼀个私钥k乘以G将得到相同的公钥K。 k和K之间的关系是固定的, 但只能单向运算, 即从k得到K。 这就是可以把⽐特币地址( K的衍⽣) 与任何⼈共享⽽不会泄露私钥( k) 的原因。

因为其中的数学运算是单向的, 所以私钥可以转换为公钥, 但公钥不能转换回私钥。
为实现椭圆曲线乘法, 我们以之前产⽣的私钥k和与⽣成点G相乘得到公钥K:

K = 1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD * G

公钥K 被定义为⼀个点 K = (x, y):

K = (x, y) 其中, x = F028892BAD7ED57D2FB57BF33081D5CFCF6F9ED3D3D7F159C2E2FFF579DC341A y = 07CF33DA18BD734C600B96A72BBC4749D5141C90EC8AC328AE52DDFE2E505BDB

为了展⽰整数点的乘法, 我们将使⽤较为简单的实数范围的椭圆曲线。 请记住, 其中的数学原理是相同的。 我们的⽬标是找到⽣成点G的倍数kG。 也就是将G相加k次。 在椭圆曲线中, 点的相加等同于从该点画切线找到与曲线相交的另⼀点, 然后映射到x轴。


比特币加密技术之椭圆曲线密码学

上图显⽰了在曲线上得到 G、 2G、 4G 的⼏何操作。

⼤多数⽐特币程序使⽤OpenSSL加密库进⾏椭圆曲线计算。 例如, 调⽤EC_POINT_mul() 函数, 可计算得到公钥。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/71ed00bbd01cce2271c07c6252361c2f.html