我想用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-----
是的,您在正确的轨道上。假定曲线是已知的,则可以按以下方式派生公钥(这基本上基于此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-----