主页 > imtoken钱包下载注册教程 > 比特币密码学中的椭圆曲线密码学

比特币密码学中的椭圆曲线密码学

imtoken钱包下载注册教程 2023-09-09 05:09:41

在比特币系统中,我们使用公钥加密创建密钥对来控制比特币的获取。 密钥对包括私钥和从中派生的唯一公钥。 公钥用于接收比特币,而私钥用于在使用比特币支付时签署交易。

公钥和私钥之间的数学关系,使得私钥可用于为特定消息生成签名。 此签名可以在不泄露私钥的情况下验证公钥。

使用比特币支付时,比特币的当前所有者需要在交易中提交自己的公钥和签名(每笔交易的签名都不同,但都是由同一个私钥生成的)。

比特币网络中的每个人都可以通过提交的公钥和签名进行验证,确认交易是否有效,即确认付款人在那一刻拥有所交易比特币的所有权。

(大多数比特币钱包工具为了方便,将私钥和公钥以密钥对的形式存储在一起。但是公钥可以从私钥计算出来,所以也可以只存储私钥。)

私钥和公钥

比特币钱包包含一系列密钥对,每个密钥对包括一个私钥和一个公钥。 私钥 (k) 是一个数字,通常是随机选择的。

有了私钥,我们就可以利用椭圆曲线乘法的单向加密函数生成一个公钥(K)。 有了公钥(K),我们可以使用单向加密哈希函数生成比特币地址(A)。在这一节中,我们将从生成私钥开始,描述如何使用椭圆曲线运算生成一个公钥来自私钥的密钥,以及

最后通过公钥生成比特币地址。 私钥、公钥和比特币地址的关系如下图所示。

比特币 曲线_比特币2017年走势曲线_比特币每十分钟产生多少个比特币

私钥

私钥只是一个随机选择的数字。 一个比特币地址中所有资金的控制权取决于对应私钥的所有权和控制权。 在比特币交易中,私钥用于生成支付比特币所需的签名,以证明资金的所有权。 私钥必须时刻保密,因为一旦泄露给第三方,就相当于放弃了私钥保护下的比特币。 私钥也必须备份,以防意外丢失,因为私钥一旦丢失就很难恢复,它所保护的比特币将永远丢失。

比特币私钥只是一个数字。 可以用硬币、铅笔、纸随机生成你的私钥:抛一枚硬币256次,用纸笔记录正面和反面转化为0和1,随机得到的256个二进制数即可使用作为比特币钱包的私钥。 这个私钥可以进一步生成一个公钥。

生成密钥的第一步也是最重要的一步是找到足够安全的熵源,即随机源。 生成比特币私钥本质上与“选择 1 到 2^256 之间的数字”是一样的。 只要结果不可预测或不可重复,选择数字的确切方法并不重要。 比特币软件使用操作系统底层的随机数生成器来生成 256 位的熵(随机性)。 通常,操作系统的随机数发生器是由人为随机源初始化的,也可能需要通过摇动鼠标几秒钟来初始化。 对于真正的偏执狂,使用掷骰子的方法并用铅笔和纸写下来。

更准确地说,私钥可以是1到n-1之间的任意数,其中n是一个常数(n=1.158*1077,略小于2^256),是比特币使用椭圆曲线的阶数定义的. 要生成这样的私钥,我们随机选择一个 256 位数字并检查它是否小于 n-1。 从编程的角度来看,一般是通过从加密安全的随机源中取出一长串随机字节,并使用 SHA256 哈希算法对其进行运算,从而得到一个 256 位的数字。 如果运算结果小于n-1,我们就有了合适的私钥。 否则,我们用另一个随机数再次重复它。

下面是一个随机生成的私钥(k),用十六进制表示(256位二进制数,显示为64位十六进制数,每个十六进制数占4位):

1E99423A4ED27608A15A2616A2B0E9E52CED330AC530EDCC32C8FFC6A526AEDD

比特币私钥空间的大小是2^256,这是一个非常大的数字。 以十进制计算,大约是 1077,而可见宇宙估计只包含 1080 个原子。

公钥

公钥可以通过椭圆曲线乘法从私钥计算出来,这是一个不可逆的过程:K = k * G 。 其中k为私钥,G为常数点,称为生成点,K为生成的公钥。其逆运算,称为“求离散对数”——知道公钥K求私钥k——很难,就像去实验室一样

k有可能取值,即brute force search。

椭圆曲线密码学解释

椭圆曲线密码学是一种基于离散对数问题的非对称(或公钥)加密方法,可以通过在椭圆曲线上加点或乘点来表示。

比特币每十分钟产生多少个比特币_比特币 曲线_比特币2017年走势曲线

上图是一个椭圆曲线的例子,类似于比特币使用的曲线。

比特币使用特殊的椭圆曲线和一系列由 secp256k1 标准定义的数学常数。该标准由美国国家标准技术研究院发起

(NIST) 设置。 secp256k1 曲线由以下函数定义,该函数生成椭圆曲线:

y^2 = (x^3 + 7)} over (Fp)

或 y^2 mod p = (x^3 + 7) mod p

上面的mod p(素数p的模)表示曲线在素数p的有限域内,也记为Fp,其中p = 2^256 – 2^32 – 2^9 – 2^8 – 2 ^7 – 2^ 6 - 2^4 - 1,这是一个非常大的质数。

由于这条曲线是定义在一个素数阶的有限域而不是实数中比特币 曲线,它的函数图看起来就像一个散落在二维空间的散点图,所以很难画出图形。 然而,它背后的数学原理类似于实数范围内的椭圆曲线。 例如,下图以网格上一系列散点的形式显示了一个小得多的素数阶 17 有限域上的椭圆曲线。 secp256k1的比特币椭圆曲线可以想象成一个非常大的网格上一系列比较复杂的散点。

比特币每十分钟产生多少个比特币_比特币 曲线_比特币2017年走势曲线

图为:Elliptic curve on elliptic curve cryptography F(p),其中p = 17

这是一个例子,这是secp256k1曲线上的点P,它的坐标是(x,y)。 您可以使用 Python 检查它:

比特币每十分钟产生多少个比特币_比特币2017年走势曲线_比特币 曲线

在椭圆曲线的数学中,有一个点叫“无穷远点”,大致对应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轴。

比特币 曲线_比特币2017年走势曲线_比特币每十分钟产生多少个比特币

上图是在曲线上得到G、2G、4G的几何运算。

大多数比特币程序使用 OpenSSL 密码库进行椭圆曲线计算。 例如调用EC_POINT_mul()函数可以计算出公钥。

本文永久更新链接地址:

linux