私钥可以从公钥推导出来吗

问题描述 投票:0回答:2

从私钥导出公钥的计算涉及以下步骤:

  1. 初始化椭圆曲线参数:
   - p = 2**256 - 2**32 - 977
   - a = 0
   - b = 7
   - Gx = 55066263022277343669578718895168534326250603453777594175500187360389116729240
   - Gy = 32670510020758816978083085130507043184471273380659243275938904335757337482424
  1. 定义私钥:
   - private_key = 0x0000000000000000000000000000000000000000000000000000000000000007
  1. 将私钥转换为十进制:
   - private_key_decimal = int(private_key)
  1. 执行椭圆曲线乘法:
   - Set Qx = Gx and Qy = Gy
   - For each bit in the binary representation of private_key_decimal[3:]:
     - Update Qx and Qy using the following equations:
       - Qx = (Qx**2 - Qy**2) % p
       - Qy = (2*Qx*Qy) % p
       - If the current bit is '1':
         - Qx = (Qx*Gx - Qy*Gy) % p
         - Qy = (Qx*Gy + Qy*Gx) % p
  1. 将 x 和 y 坐标转换为十六进制:
   - public_key_hex = '04' + format(Qx, '064x') + format(Qy, '064x')
  1. 打印未压缩的公钥:
   - print("Uncompressed Public Key:", public_key_hex)

这是重新排列和格式化的 Python 脚本:

# Define the elliptic curve parameters
p = 2**256 - 2**32 - 977
a = 0
b = 7
Gx = 55066263022277343669578718895168534326250603453777594175500187360389116729240
Gy = 32670510020758816978083085130507043184471273380659243275938904335757337482424

# Define the private key
private_key = 0x0000000000000000000000000000000000000000000000000000000000000007

# Convert the private key to decimal
private_key_decimal = int(private_key)

# Perform elliptic curve multiplication
Qx = Gx
Qy = Gy
for bit in bin(private_key_decimal)[3:]:
    Qx = (Qx**2 - Qy**2) % p
    Qy = (2*Qx*Qy) % p

    if bit == '1':
        Qx = (Qx*Gx - Qy*Gy) % p
        Qy = (Qx*Gy + Qy*Gx) % p

# Convert the x and y coordinates to hexadecimal
public_key_hex = '04' + format(Qx, '064x') + format(Qy, '064x')

# Print the uncompressed public key
print("Uncompressed Public Key:", public_key_hex)

在给定的Python脚本中,私钥用于通过一系列计算导出公钥。如果有人能够逆转这些计算中的每一个,他们可以获得私钥吗?

使用的计算如下:

Qx = (Qx**2 - Qy**2) % p
Qy = (2*Qx*Qy) % p

Qx = (Qx*Gx - Qy*Gy) % p
Qy = (Qx*Gy + Qy*Gx) % p

根据我的理解,这些计算用于从私钥推导出公钥。如果有人可以反转每个计算,他们是否能够获得私钥二进制表示的每一位?通过连接所有位并在开头添加 0 或 1,可以将二进制表示转换为十进制以获得私钥。这是因为Python脚本将私钥转换为二进制并在对每一位执行上述计算之前删除第一位。

请确认我的理解是否正确?

python cryptography elliptic-curve
2个回答
0
投票

不可以,在 RSA、ECDSA(椭圆曲线数字签名算法)和类似算法等非对称加密系统中,私钥不能直接从公钥导出。这一属性使非对称加密技术变得安全并支持各种加密操作。

在这些系统中,会生成一对密钥:私钥和相应的公钥。私钥是保密的,用于签名和解密,而公钥是分发的,用于验证和加密。

私钥与其对应的公钥之间的数学关系确保,虽然您可以使用私钥生成签名或解密数据,但仅从公钥对私钥进行逆向工程在计算上是不可行的。这被称为“单向函数”属性。

如果可以从公钥推导出私钥,那么整个密码系统的安全性就会受到损害。这就是为什么非对称加密系统的强度依赖于无法从公钥计算私钥的原因。


-1
投票

脚本中使用的计算基于椭圆曲线密码学,特别是椭圆曲线点乘算法。该算法涉及对基点(Gx,Gy)执行一系列数学运算,以导出代表公钥的新点(Qx,Qy)。

反转这些计算中的每一个都需要找到每个步骤的逆运算。如果有人能够反转每个计算并获得最终点 (Qx, Qy) 的 x 和 y 坐标,他们将拥有重建私钥所需的信息。

在脚本中,私钥用于确定每个步骤执行哪些操作。私钥的二进制表示被迭代,并且对于每个位,根据该位是 0 还是 1 对点 (Qx, Qy) 应用不同的操作。这为逆向计算增加了额外的复杂性,因为具体的操作取决于私钥。

总体而言,虽然理论上是可能的,但逆向计算并获得私钥被认为是计算困难的,但需要大量的计算工作以及对所使用的特定椭圆曲线参数和操作的了解。

© www.soinside.com 2019 - 2024. All rights reserved.