lpilp / phpsm2sm3sm4

php版本,支持国密SM2的签名算法,非对称加解密,SM3的hash, SM4的对称加解密
329 stars 77 forks source link

pkcs8 格式私钥 怎么转换 pkcs1格式呢? #57

Closed honghuzhi closed 1 year ago

honghuzhi commented 1 year ago

试了半天也没转换成功,求转换命令

lpilp commented 1 year ago

openssl ec –in pkcs8_key.pem –out pkcs1_key.pem 网上说的,不知道行不行,你可以直接解开pkcs8, 使用明文公私钥的方式 调用本项目的函数,

lpilp commented 1 year ago

需要 openssl1.1. 以上的样子

honghuzhi commented 1 year ago

命令试了下好像不行,pkcs8 如何解开为明文公私钥呢?不会Java好像没法处理,我的私钥和示例代码里面的pkcs8一样,也是200个字节长度,应该就是pkcs8格式了吧

lpilp commented 1 year ago

我这边示例里的是 pkcs1的, 要解开,你可以调用项目里 util/myasn1里的decode解开,然后记下,或是使用自己熟悉的 asn1解析器 解开就行, pem文件里如果四行的是pkcs8的, 3行是pkcs1, 项目里的函数,如使用outkey的,是使用pkcs1的那种

honghuzhi commented 1 year ago

image 还是转换不了

honghuzhi commented 1 year ago

我用gmssl转换成功了164位的 pkcs1,但调用函数$sm2->doDecrypt($encryptData, $privateKey,) 其中 $privateKey 是经过bin2hex(base64_decode($privateKey)) 转换后的 242个长度的字符串 函数执行后,出现 gmp_init(): Unable to convert variable to GMP - string is not an integer 错误,这是什么原因呢

lpilp commented 1 year ago

项目里 只有 签名的时候支持pkcs1的证书形式, 加解密 只支持 明文的 130 或 128 的 hex 公钥及 64位hex私钥,你得解开, 还是上面说的,

要解开,你可以调用项目里 util/myasn1里的decode解开,然后记下,或是使用自己熟悉的 asn1解析器 解开就行

honghuzhi commented 1 year ago

调用MyAsn1::decode,解开后是 64位的16进制字符串,调用解密函数后,还是报错:gmp_init(): Unable to convert variable to GMP - string is not an integer

honghuzhi commented 1 year ago

出现这个错误,还是 64位hex私钥 格式不对吗?私钥和密文不匹配不会报这个错误吧

lpilp commented 1 year ago

你那 test/tasn1.php里的例子里修改成你的文件,解出来与原来的一样的不

Array
(
    [0] => 01
    [1] => 330BAB9F1CFCEC77EDBD0D0383A4EB905C4511BE3A61753BE2ED008C11BE69BC
    [2] => Array
        (
        )

    [3] => Array
        (
        )

)

$array[1] 就是私钥, 还不行的话,你用第三方的asn1解析下,正常是好使的,

honghuzhi commented 1 year ago

是一样的,已经成功解密了,之前密文是base64 格式的,我没有进行处理,后来转成16进制后,能成功解密 还想问下,使用php 进行sm2解密,执行消耗大吗?比curl调用本地Java包解密是不是快点

lpilp commented 1 year ago

倒是没有试过,应该会更快吧,