PHP对接Java的SM4/ECB/PKCS5Padding对称解密

        遇到PHP请求Java的接口,返回的数据是以SM4/ECB/PKCS5Padding的对称加密方式加密后的密文。网上搜索别人早期写的大部分代码类单纯是针对国密SM4算法本身的加解密处理,未能涉及到ECB等加密模式。

        前期找到https://github.com/lpilp/phpsm2sm3sm4项目,里面支持sm4-ecb的加解密模式,里面sm4的对称加解密,要求PHP版本>=PHP7.2,且需打开gmp的扩展支持。在服务器上编译引入gmp扩展之后,通过composer require lpilp/guomi命令安装,发现安装不了还是提示未找到gmp的扩展,使用不同服务器再次尝试还是一样问题,遂放弃了该项目仓库。

        最后采用了另一种方式,利用openssl 1.1.1x后的版本,其支持了sm4-ecb模式,通过PHP的openssl扩展openssl_decrypt函数进行解密,它默认的填充方式为PKCS7Padding,PKCS5Padding是PKCS7Padding的子集,对应使用方式一样默认可以解析:

$res = openssl_decrypt($ciphertext, 'sm4-ecb', $key, OPENSSL_RAW_DATA , $iv);

        其中,$ciphertext为将密文进行base64url_decode处理之后的字符串,$key为Java方提供的对称加密密钥,期间使用该函数调试,发现死活没法解密出明文。尝试多种方式未能成功的情况下,查看php官方的openssl_decrypt函数说明文档:PHP: openssl_decrypt - Manual PHP中文手册 PHP中国镜像 php 国内镜像 PHP官方网站

在里面看到针对$key有进行hen2bin的处理:

添加该处理方式之后,终于成功解密出明文。

        最终代码如下:

        function base64url_decode($data) {//该函数将RFC4648 URL安全Base64变体(RFC4648_URLSAFE)转换为Base64,然后再base64_decode转换为明文
			return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_BOTH));//STR_PAD_RIGHT
		} 
		$res = base64url_decode($res);
		$cipher = 'sm4-ecb';
		$iv = '';
		$original_plaintext = openssl_decrypt($res, $cipher, hex2bin($this->data["appKey"]),OPENSSL_RAW_DATA,$iv);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值