lpilp / phpsm2sm3sm4

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

mac 系统下 sm4 加密和 Windows server 下 sm4 加密的结果不一致 #83

Closed lijunen2009 closed 2 months ago

lijunen2009 commented 3 months ago

前端js用 sm4 加密 后端php用 sm4解密,开发环境没有问题,生产环境有问题。 开发环境 mac系统 php7.4 生成环境 window server php 7.2

同样的 key iv 加密值 ,开发环境和生成环境php 使用 sm4-cbc 加密,加密结果不一致,生成环境加密后的结果使用第三方平台也无法解密,请问大佬这个是什么原因造成的。

lpilp commented 3 months ago

你用key, iv,在mac与windows 加密一段如 “hello”, 我看下

lpilp commented 3 months ago

这个sm4 的代码理论上在 PHP5.6都没有问题,会出问题的话最大的可能是 你的winodws的PHP是 32位

lijunen2009 commented 3 months ago

系统是 windows 64 位 $key = hex2bin("FB44AA0419AB9DF55F8D15E27958200C"); $iv = hex2bin("89462a4045566736704e31684e522a90"); windows 下 123456 加密 结果eb86da3b7e0265a1678cca4b87ec8011 mac 下 123456 加密结果 b0ce62c940e36d586bce3a6dd87118c6

lpilp commented 3 months ago

mac下那个是对的, wins是不对,在我的win10电脑上加密是没有问题的,与你的 mac一样,用的PHP自带的openssl_encrypt($data, "sm4", $key, $options=OPENSSL_RAW_DATA,$iv); 加密 也是一样的。 我说的32位是指PHP版本, 你可以用浏览器打开 <?php echo phpifo(); 看下PHP的版本信息

lijunen2009 commented 3 months ago

确实是 php 32 位的 ,只能换成 64 位的来解决?

lpilp commented 3 months ago

确实是 php 32 位的 ,只能换成 64 位的来解决?

正常来说,不太应该 , 只能两个系统里一步步调试,看下哪一步里的哪个函数数据出来后不一样,这样就比较好定位