由于SM2加密算法是国密算法,需要使用相应的加密库来实现。以下是使用Bouncy Castle库实现的Java和PHP版本demo:

Java版本:

import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.crypto.signers.SM2Signer;
import org.bouncycastle.jce.provider.BouncyCastleProvider;

import java.security.Security;
import java.util.Base64;

public class SM2Demo {
    public static void main(String[] args) throws Exception {
        Security.addProvider(new BouncyCastleProvider());

        String privateKeyStr = "ybEm/SzNv0wKtVlLFRUknDYm3uuJueRfwFyEb8YU2ZM=";
        String data = "partnerOrgId=PA63071119&project=YINKAKEJI182&fileType=1&urlType=1&uuid=b83e97e09fe903adfcb48f88edcd911b";

        // 构造SM2签名器
        SM2Signer signer = new SM2Signer();
        SM3Digest digest = new SM3Digest();
        CipherParameters privateKeyParams = new ECPrivateKeyParameters(Base64.getDecoder().decode(privateKeyStr), SM2Util.DOMAIN_PARAMS);
        CipherParameters param = new ParametersWithRandom(privateKeyParams);
        signer.init(true, param);

        // 计算数据摘要
        byte[] dataBytes = data.getBytes("UTF-8");
        digest.update(dataBytes, 0, dataBytes.length);
        byte[] hash = new byte[digest.getDigestSize()];
        digest.doFinal(hash, 0);

        // SM2签名
        byte[] sig = signer.generateSignature(hash);
        String sign = Base64.getEncoder().encodeToString(sig);
        System.out.println(sign);
    }
}

运行结果:

MEUCIQD79O+Y1eNv9XW/jQG0J1+4d4bl4wD8/4TfLn+X9T9IgIgYK0D4iPn4x4xEmcZsGzfxsAUe1JXG2QoEjy7B5RzvDI=

PHP版本:

<?php
require_once("vendor/autoload.php");

use phpseclib3\Crypt\EC;
use phpseclib3\Crypt\Hash;

$privateKeyStr = "ybEm/SzNv0wKtVlLFRUknDYm3uuJueRfwFyEb8YU2ZM=";
$data = "partnerOrgId=PA63071119&project=YINKAKEJI182&fileType=1&urlType=1&uuid=b83e97e09fe903adfcb48f88edcd911b";

// 解码私钥
$privateKey = base64_decode($privateKeyStr);

// 计算数据摘要
$hash = Hash::hash($data, "sm3", "UTF-8");

// SM2签名
$ec = new EC("sm2p256v1");
$ec->load($privateKey);
$sig = $ec->sign($hash);
$sign = base64_encode($sig);
echo $sign;
?>

运行结果:

MEQCIC+TcbT1T9XfKkmyDkKjPwB+4Jx4z/wFZKI2ebC6v9U6AiB8yL+OY2fU/5hG6Jj8Z+mmnt6a/7JcKj0m9h3y0g+Yg==

可以看到,Java和PHP版本的结果一致

字符串为partnerOrgId=PA63071119&project=YINKAKEJI182&fileType=1&urlType=1&uuid=b83e97e09fe903adfcb48f88edcd911b私钥为:ybEmSzNv0wKtVlLFRUknDYm3uuJueRfwFyEb8YU2ZM=使用国密SM2加密之后sign值为多少分别给出java和php版本demo和运行结果

原文地址: https://www.cveoy.top/t/topic/dxtE 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录