国密sm2签名验签

该代码示例展示了如何利用OpenSSL库和GmSSL扩展来实现国密标准GM/T0003.5-2012中的SM2算法,包括生成私钥、证书、签名和验签过程。代码首先生成ECDSA密钥对,然后创建服务器私钥文件,接着制作证书,最后进行签名和验签操作。整个流程遵循了国密标准,适用于需要符合中国加密法规的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生成私钥:

#include <stdio.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <openssl/pem.h>
#include <openssl/conf.h>
#include <openssl/x509v3.h>

#include <openssl/bn.h>
#include <openssl/evp.h>
#include <openssl/asn1.h>
#include <openssl/x509.h>
#include <openssl/objects.h>
#include <openssl/buffer.h>

#ifndef OPENSSL_NO_ENGINE
#include <openssl/engine.h>
#endif
int make_server_private_key()
{
    OpenSSL_add_all_ciphers();
    OpenSSL_add_all_digests();
    ERR_load_crypto_strings();

    SSL_CTX *ctx = SSL_CTX_new (SSLv23_server_method ());
    SSL_CTX_set_options (ctx,
                         SSL_OP_SINGLE_DH_USE |
                         SSL_OP_SINGLE_ECDH_USE |
   
### Java中SM2算法的签名 为了在Java中实现SM2算法的签名,可以利用Bouncy Castle库的支持。下面是一个简单的例子来展示如何完成这一过程。 #### 准备工作 确保已引入Bouncy Castle作为安全提供者并注册到JVM环境中[^2]: ```xml <dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>最新版本号</version> </dependency> Security.addProvider(new BouncyCastleProvider()); ``` #### SM2签名示例代码 创建用于生成私钥和公钥对的对象,并通过这些键来进行消息的署操作。 ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.security.*; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; public class Sm2SignExample { static { Security.addProvider(new BouncyCastleProvider()); } public byte[] sign(String privateKeyStr, String message) throws Exception { PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(Base64.getDecoder().decode(privateKeyStr)); KeyFactory keyFac = KeyFactory.getInstance("SM2", "BC"); PrivateKey privateKey = keyFac.generatePrivate(priPKCS8); Signature signature = Signature.getInstance("SM3withSM2", "BC"); signature.initSign(privateKey); signature.update(message.getBytes()); return signature.sign(); } } ``` #### SM2示例代码 使用对应的公钥对象去校接收到的数据及其附带的数字签名是否匹配。 ```java import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.security.*; import java.security.spec.X509EncodedKeySpec; public class Sm2VerifyExample { static { Security.addProvider(new BouncyCastleProvider()); } public boolean verify(byte[] signedData, String publicKeyStr, String originalMessage) throws Exception { X509EncodedKeySpec pubX509 = new X509EncodedKeySpec(Base64.getDecoder().decode(publicKeyStr)); KeyFactory keyFac = KeyFactory.getInstance("SM2", "BC"); PublicKey publicKey = keyFac.generatePublic(pubX509); Signature signature = Signature.getInstance("SM3withSM2", "BC"); signature.initVerify(publicKey); signature.update(originalMessage.getBytes()); return signature.verify(signedData); } } ``` 上述代码片段展示了基本框架下如何运用标准中的SM2技术执行电子文档或其他形式的信息交换时所需的认证机制。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

109702008

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值