lpilp / phpsm2sm3sm4

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

HMAC-SM3 请问这个能否实现呢 #60

Closed imnpc closed 1 year ago

imnpc commented 1 year ago

最近发现有的对接是需要 HMAC-SM3 模式,就是有一个密钥,然后带进去加密,不知道我们这个应该如何实现,我搜索到GMSSL-PHP上有这个

lpilp commented 1 year ago

HMAC-SM3和HMAC-SHA256在HMAC算法的基础上,只是在底层哈希函数的选择上有所区别

function myhash( $data,$digest_algo, $binary=false){
    // 有些版本的php的套件自带了sm3,就可以用这个openssl_digest方法做,如不支持,就用相关的函数实现就可
    return openssl_digest($data, $digest_algo,$binary);
}

function hmac($key, $data, $algorithm = 'sha256')
{
    $blockSize = 64;

    if (strlen($key) > $blockSize) {
        die("please check key len");
    }

    $key = str_pad($key, $blockSize, chr(0x00));

    $innerPad = str_repeat(chr(0x36), $blockSize);
    $outerPad = str_repeat(chr(0x5C), $blockSize);

    $innerKey = $key ^ $innerPad;
    $inner = $innerKey . $data;
    $hash = myhash( $inner,$algorithm, true);

    $outerKey = $key ^ $outerPad;
    $outer = $outerKey . $hash;

    $hmac = myhash( $outer,$algorithm);

    return $hmac;
}

$key = '123456'; // 密钥
$data = 'Hello,world!'; // 要进行HMAC计算的数据

$hmac = hmac($key, $data,'sm3');
var_dump($hmac);
lpilp commented 1 year ago

注意这里key 要原始的字符串,可能你拿到的是 hex的,这个需要 做下hex2bin, key的长度大于16字节为宜,太长太短都不好,上面函数没有对太短做判定

imnpc commented 1 year ago

注意这里key 要原始的字符串,可能你拿到的是 hex的,这个需要 做下hex2bin, key的长度大于16字节为宜,太长太短都不好,上面函数没有对太短做判定

十分感谢解答