lpilp / phpsm2sm3sm4

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

大神你好,请问 hmac-sm3 具体怎么做呢? #62

Closed leeboo closed 1 year ago

leeboo commented 1 year ago

『hmac-sm3,这个算法与hmac-sha256在hmac的算法是一样的,只是hash的算法不一样,一个是sm3,一个sha256, 没有什么特殊的注意的地方』

这个不是很明白,具体怎么做呢

lpilp commented 1 year ago

hmac,是一个独立的算法, hmac-sm3, 相当于 hmac(sm3(str)) , 这里的sm3可以替换为任意的hash算法,如sha1, sha256, md5都可以, 具体如下

function myhash( $data,$digest_algo, $binary=false){
  // 这时可以是任何的hash算法,也包括了 sm3
    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;
}