ECDSA:将60字节的二进制公钥转换为PEM格式,以用于PHP openssl_verify()

问题描述 投票:1回答:1

我想用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-----
php ecdsa
1个回答
1
投票

是的,您在正确的轨道上。假定曲线是已知的,则可以按以下方式派生公钥(这基本上基于此answer的思想):

  • 以下,假定曲线NIST B-233 (aka sect233r1)的原始公钥大小为60个字节。如果曲线不同,则必须相应地交换曲线ID,而必须使用曲线公钥的大小。

  • 使用符合您曲线的DER格式的any公钥。

    如果没有,请使用OpenSSL以符合您的曲线的PEM格式创建私钥。私钥具有SEC1格式:

    openssl ecparam -out <path to private key file> -genkey -name sect233r1 -noout
    

    从此私钥中,将公钥导出为DER。公钥具有X.509格式:

    openssl ec -in <path to private key file> -pubout -outform der -out <path to public key file>
    
  • 用十六进制编辑器确定公钥的二进制数据,例如online。在这一点上,利用了原始公共密钥位于公共密钥的直接在末尾这一事实。对于B-233,原始公共密钥的长度为60个字节,即生成的公共密钥的最后60个字节必须与当前的原始公共密钥的60个字节交换。这是搜索到的公共密钥DER,其中包含您的原始公共密钥。

  • 对于使用OpenSSL进行的验证过程,如果使用-keyform DER选项,例如,使用DER格式就足够了。

    openssl dgst -ecdsa-with-SHA1 -keyform DER -verify <path to public key file> -signature <path to signature file> <path to file for which signature is>
    
  • 对于PHP openssl_verify中的验证过程,需要PEM格式。如果DER数据是Base64编码的,则最容易转换为PEM格式。 openssl_verify。最后,您必须添加页眉(online)和页脚(-----BEGIN PUBLIC KEY-----\n)。请确保紧接在页眉之后和页脚之前有一个换行符。在最后一个参数中,必须指定用于创建签名的哈希算法,例如:

    \n-----END PUBLIC KEY-----
© www.soinside.com 2019 - 2024. All rights reserved.