lpilp / phpsm2sm3sm4

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

1.0.7版本 不兼容 以前版本 #54

Closed yxqa123 closed 1 year ago

yxqa123 commented 1 year ago

src/smecc/SM2/Hex2ByteBuf.php

$temp_1 = $indata / 16;
        $temp_1 = intval($indata / 16);
        if ($temp_1 < 10)
            $temp_1 = $temp_1 + 0x30;
    ..
}

intval 改变了 最终 temp_1 的结果。导致与 1.0.7 以前版本结果差异。 sm2 加密结果与 1.0.7以前版本不兼容,可能与其他语言的也不兼容

lpilp commented 1 year ago

这个没有问题,这个函数其实就是做一个 dechex() 函数,10进制转16进制而已,项目最初是从别人的项目进行更新修改的,一些转换什么函数没有去变动,这个理论上就得加intval的,最后的chr( int assic ),需要传int值,传float值的话就取整数部分了,中间的运算也都是整数运算,不会有什么问题,你是遇到什么问题了不,我看看。 感谢关注! PS: 正在弄不依赖其他库的版本,应该会支持 >=5.4 或是5.6 一个简化的签名验签版本,有需要请关注,大概会在6月中上

yxqa123 commented 1 year ago

我的项目使用的 1.0.4.1 1.0.6 1.0.7 。 1.0.6以前版本调用1.0.7会出现如下错误 Mdanter\\Ecc\\Exception\\PointNotOnCurveException: Curve curve(115792089210356248756420345214020892766250353991924191454421193933289684991996, 18505919022281880113072981827955639221458448578012075254857346196103069175443, 115792089210356248756420345214020892766250353991924191454421193933289684991999) does not contain point (45772322330626260826179297330184340691829805985099039874230889719991419483448, 25052822987909541241313578494655523568405754683422640265628383083751450685796) in \vendor\\mdanter\\ecc\\src\\Primitives\\Point.php:102\nStack trace:\n#0 \vendor\\lpilp\\guomi\\src\\sm\\RtSm2.php(178): Mdanter\\Ecc\\Primitives\\Point->__construct(Object(Mdanter\\Ecc\\Math\\GmpMath), Object(Mdanter\\Ecc\\Curves\\NamedCurveFp), Object(GMP), Object(GMP))\n#1 Rtgm\\sm\\RtSm2->doDecrypt('653237633337383...', '5DD701828C424B8...')\n#2 当统一使用 1.06及以前一切正常,统一使用1.07 也一切正常。 diff 1.07及 1.06 发现只有此处可能影响sm2加解密结果

` 这一块儿 新版本做了相应更改但加解密也是对不上~

  if($this->formatSign=='base64'){
        $encryptData = bin2hex(base64_decode($encryptData));
    }

`

lpilp commented 1 year ago

看了下,的确是欠考虑了,原来的加解密缺省返回的hex, 本想支持下 base64,逻辑上有点问题,感谢反馈,一会更新

lpilp commented 1 year ago

这个1.0.7缺省返回的base64了,已回退了,发了1.0.8