对给定的密钥执行 EC public 密钥计算会给出错误的结果

Performing an EC public key calculation for given secret key gives wrong results

我试图了解给定密钥的 EC public 密钥的计算。在这个问题之后,我发现了一个 well explained answer, but (as often happens) something goes wrong. According to previous answer and this document 我使用以下 Perl 脚本来执行计算:

#!/usr/bin/perl

use strict;
use warnings;

use Math::BigInt;

my $d_hex = "18E14A7B6A307F426A94F8114701E7C8E774E7F9A47E2C2035DB29A206321725";
my $d_num = Math::BigInt->new("0x$d_hex");

my $g_hex = "0479BE667EF9DCBBAC55A06295CE870B07029BFCDB2DCE28D959F2815B16F81798483ADA7726A3C4655DA4FBFC0E1108A8FD17B448A68554199C47D08FFB10D4B8";
my $g_num = Math::BigInt->new("0x$g_hex");

my $q_num = $d_num->copy()->bmul($g_num);
my $q_hex = $q_num->as_hex();

# Expect: 0x0450863ad64a87ae8a2fe83c1af1a8403cb53f53e486d8511dad8a04887e5b23522cd470243453a299fa9e77237716103abc11a1df38855ed6f2ee187e9c582ba6
# Result: 0x479be667ef9dcbbac55a06295ce870b07029bfcdb2dce28d959f2815b16f81798611c24f290d443a7c839f40d5512f071e48c9c424b038039d222fa320142ebdd

print "$q_hex\n";

这里是预期的结果是指使用以前创建的答案用 C 编写的代码计算的结果。如您所见,结果是不同的。我做错了什么?

我不习惯 Perl,但我看不到您正在初始化或使用循环组。椭圆曲线运算和非对称加密通常(大部分)总是在循环组中执行

因此,我在 Perl 中找到了一个基于此 PHP 代码的 PHP library that can generate addresses from private key, and wrote an example code。这很奇怪,但在某些情况下有效。不管怎样,这足以让我了解它是如何工作的。