【发布时间】:2019-10-22 07:35:00
【问题描述】:
我想用 PHP 证明一个 Wii 签名。我有 60 个字节的公钥作为二进制数据加上 4 个额外的字节。而且我知道它是 ECDSA(很可能是 B-233)。我已经用 C 实现了它,但是 PHP 解释器对我的实现来说太慢了。所以我调用外部C工具来确认签名。
但我想使用openssl_verify($data,$sig,$pubkey)。我的问题是第三个参数(公钥)。所以我必须将 ECDSA 信息和公钥转换为可接受的格式。
有什么想法吗?
进展
我尝试了更多,并使用不同的算法创建了密钥(例如 sect233k1、sect233r1)。我的计划是用我的密钥注入一个如此生成的公钥。现在我收到错误消息:
error:0906D06C:PEM routines:PEM_read_bio:no start line
公钥如下所示:
-----BEGIN PUBLIC KEY-----
MFIwEAYHKoZIzj0CAQYFK4EEABoDPgAEAS+URvH1x1GXfTw6VZh8tLVPq3bgYwl8
g8OHtCKuADoZ8YayIHkJuYEqTJZBgI8YMX8FtrI8BOlBiBLF
-----END PUBLIC KEY-----
【问题讨论】:
-
你怎么知道这 4 个字节不是公钥的一部分?密钥属于哪条曲线?
-
我知道,因为 C 实现忽略了 4 个字节。曲线很可能是 B-233。但我目前的主要问题是让任何 $pubkey 运行。即使使用
openssl ec ...创建的 PEM 文件,openssl_verify()也会抛出supplied key param cannot be coerced into a public key。 -
但我目前的主要问题是让 any $pubkey 运行。 这是否意味着您正在使用 OpenSSL 创建密钥对B-233 签名文件验证失败?我无法重现!上面描述的场景对我有用。发布您的 OpenSSL 声明。
-
关键参数的问题是,安装的 openssl 删除了 NIST 支持,因此 php 不知道算法。更换服务器后,这个问题就消失了。无论如何,将签名转换为 pub 密钥并对其进行验证会导致错误
error:0906D06C:PEM routines:PEM_read_bio:no start line。