SM2 国密算法签名验证:Java 和 PHP 版本示例
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 加密算法是国密算法,需要使用相应的加密库来实现。
- 以上代码示例仅供参考,具体的实现细节可能需要根据实际情况进行调整。
- 为了确保安全,请勿将私钥直接硬编码在代码中。
- 建议使用安全的密钥管理工具来存储和管理私钥。
- 签名验证过程需要使用公钥进行验证,具体实现方法请参考相关文档。
原文地址: http://www.cveoy.top/t/topic/nIKe 著作权归作者所有。请勿转载和采集!