SM2 国密算法签名验证:Java 和 PHP 版本示例

本文提供使用 Bouncy Castle 库的 Java 版本和 phpseclib3 库的 PHP 版本代码示例,演示如何使用国密 SM2 算法对字符串进行签名,并展示运行结果。

字符串为:'partnerOrgId=PA63071119&project=YINKAKEJI182&fileType=1&urlType=1&uuid=b83e97e09fe903adfcb48f88edcd911b'

私钥为:'ybEm/SzNv0wKtVlLFRUknDYm3uuJueRfwFyEb8YU2ZM='

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 版本的结果一致。

注意:

  • 由于 SM2 加密算法是国密算法,需要使用相应的加密库来实现。
  • 以上代码示例仅供参考,具体的实现细节可能需要根据实际情况进行调整。
  • 为了确保安全,请勿将私钥直接硬编码在代码中。
  • 建议使用安全的密钥管理工具来存储和管理私钥。
  • 签名验证过程需要使用公钥进行验证,具体实现方法请参考相关文档。
SM2 国密算法签名验证:Java 和 PHP 版本示例

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

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