国密算法SM2、SM3、SM4 的JAVA实现(结合Hutool)

一、简要

  • Hutool针对Bouncy Castle做了简化包装,用于实现国密算法中的SM2、SM3、SM4。
  • Hutool 的实现也是基于 BC(Bouncy Castle库)实现的
  • 本文只实现简单功能,若有需要请移步官网

二、POM 文件引用

<!--hutool具包-->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.4.0</version>
    <scope>compile</scope>
</dependency>
<!--Bouncy Castle库-->
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15to18</artifactId>
    <version>1.69</version>
</dependency>

三、SM2

package com.prison.common.util;

import cn.hutool.core.util.StrUtil;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.asymmetric.KeyType;
import cn.hutool.crypto.asymmetric.SM2;
import org.junit.Test;

import java.security.KeyPair;

public class HutoolSMUtil {


    @Test
    public void sm2Test() {

        String text = "wangjing";

        //使用随机生成的密钥对加密或解密
        System.out.println("使用随机生成的密钥对加密或解密====开始");
        SM2 sm2 = SmUtil.sm2();
        // 公钥加密
        String encryptStr = sm2.encryptBcd(text, KeyType.PublicKey);
        System.out.println("公钥加密:" + encryptStr);
        //私钥解密
        String decryptStr = StrUtil.utf8Str(sm2.decryptFromBcd(encryptStr, KeyType.PrivateKey));
        System.out.println("私钥解密:" + decryptStr);
        System.out.println("使用随机生成的密钥对加密或解密====结束");


        //使用自定义密钥对加密或解密
        System.out.println("使用自定义密钥对加密或解密====开始");

        KeyPair pair = SecureUtil.generateKeyPair("SM2");
        byte[] privateKey = pair.getPrivate().getEncoded();
        byte[] publicKey = pair.getPublic().getEncoded();

        SM2 sm22 = SmUtil.sm2(privateKey, publicKey);
        // 公钥加密
        String encryptStr2 = sm22.encryptBcd(text, KeyType.PublicKey);
        System.out.println("公钥加密:" + encryptStr2);
        //私钥解密
        String decryptStr2 = StrUtil.utf8Str(sm22.decryptFromBcd(encryptStr2, KeyType.PrivateKey));
        System.out.println("私钥解密:" + decryptStr2);
        System.out.println("使用自定义密钥对加密或解密====结束");

    }

}

执行效果

使用随机生成的密钥对加密或解密====开始
公钥加密:04357E15B4AF2E2CCA84F309A006E98D1ADB4445743E3CC4DAAD956780152E4E778A09B120691DA8B03734C72729CDED4AA93C5132562E4BD22DAFB0B5199CF84ADD4BCC85D5197BC9137AC2356B2465954A0284A5A7D864324B4FB6457D8919396C687B9C84474C0C
私钥解密:wangjing
使用随机生成的密钥对加密或解密====结束
使用自定义密钥对加密或解密====开始
公钥加密:04F9A38518E92B086C0C424F4065BDF961828D0115273394C1027D6A3D0A228529EBC7293DC95E39B6BB8E4C258269DDF579B26117C83841A4D53E0D19C573A50D65B1B4E222A5A74B8B86958A58B51241522F918D191FFE544CF4A90F1C2BD33656244E22259BF91C
私钥解密:wangjing
使用自定义密钥对加密或解密====结束

四、SM3

package com.prison.common.util;

import cn.hutool.crypto.SmUtil;
import org.junit.Test;

public class HutoolSMUtil {

    @Test
    public void sm3Test() {
        String text = "wangjing";
        String digestHex = SmUtil.sm3(text);
        System.out.println("加密后:" + digestHex);
    }

}

执行效果

加密后:136ce3c86e4ed909b76082055a61586af20b4dab674732ebd4b599eef080c9be

五、SM4

package com.prison.common.util;

import cn.hutool.core.util.CharsetUtil;
import cn.hutool.crypto.SmUtil;
import cn.hutool.crypto.symmetric.SymmetricCrypto;
import org.junit.Test;

public class HutoolSMUtil {

    @Test
    public void sm4Test() {
        String text = "wangjing";
        SymmetricCrypto sm4 = SmUtil.sm4();

        String encryptHex = sm4.encryptHex(text);
        System.out.println("加密后:" + encryptHex);
        String decryptStr = sm4.decryptStr(encryptHex, CharsetUtil.CHARSET_UTF_8);
        System.out.println("解密后:" + decryptStr);
    }

}

执行效果

加密后:ad0fd3d52e1345a8ccdb2fbf005741e6
解密后:wangjing

注:以上内容仅提供参考和交流,请勿用于商业用途,如有侵权联系本人删除!

  • 13
    点赞
  • 75
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论
### 回答1: 国密算法SM2是我国自主设计的一种非对称加密算法,主要用于数字签名和密钥交换。随着信息安全需求的增强,SM2算法在我国的应用越来越广泛。 SM2算法的C语言实现可以通过调用相关库函数来完成。通常使用的是开源的RSA和EC库来实现SM2算法。以下是可能的实现步骤: 1. 引入相关库:在C语言代码中引入SM2算法所需要的RSA和EC库函数。 2. 生成密钥对:使用EC库函数生成SM2算法所需的密钥对。密钥对包括公钥和私钥,用于加密和解密数据。 3. 数据加密:使用RSA库函数对需要加密的数据进行加密处理。加密过程中使用公钥对数据进行加密,得到密文。 4. 数据解密:使用RSA库函数对密文进行解密处理。解密过程中使用私钥对密文进行解密,得到明文数据。 5. 数字签名:使用EC库函数对数据进行数字签名。数字签名过程中使用私钥对数据进行签名,得到签名结果。 6. 验证签名:使用EC库函数对签名结果进行验证。验证过程中使用公钥对签名结果进行验证,确定签名的有效性。 以上只是实现SM2算法的大致步骤,具体实现还需要根据具体需求进行调整和补充。此外,为了保证算法的安全性,还需要对密钥进行安全的管理与存储。 总之,通过调用相关库函数,可以实现SM2算法的C语言实现,为信息安全提供了有效的保障。 ### 回答2: 国密算法SM2是我国自主研发的一种基于椭圆曲线密码学的公钥加密算法,用于实现数字签名、密钥交换和加密等功能。 要实现SM2算法的C语言代码,可以按照以下步骤进行: 1. 导入相关的库文件:在C语言中,需要导入相关的库文件来支持椭圆曲线运算和密码学算法实现。例如,在OpenSSL库中,可以使用`#include <openssl/sm2.h>`来导入SM2算法相关的头文件。 2. 生成密钥对:在SM2算法中,需要首先生成一对公私钥对。可以使用库中的API函数,如`EVP_PKEY *gen_keypair();`来生成一个SM2密钥对。 3. 进行数字签名:假设要对某个消息进行数字签名,可以使用API函数`int sm2_sign(const EVP_MD *md, const unsigned char *msg, size_t msglen, const unsigned char *id, size_t idlen, const EVP_PKEY *pkey, unsigned char *sig, size_t *siglen);`。在函数参数中,md表示哈希算法、msg表示消息、id表示用户标识、pkey表示私钥,sig表示签名输出。 4. 验证数字签名:使用API函数`int sm2_verify(const EVP_MD *md, const unsigned char *msg, size_t msglen, const unsigned char *id, size_t idlen, const EVP_PKEY *pkey, const unsigned char *sig, size_t siglen);`来验证数字签名。在函数参数中,md表示哈希算法、msg表示消息、id表示用户标识、pkey表示公钥,sig表示需要验证的签名。 以上为简要的SM2算法C语言实现的步骤,具体的代码实现需要结合具体的库文件和API函数进行。希望以上回答对你有帮助! ### 回答3: 国密算法SM2是由中国密码学家自主研发的一种非对称加密算法,主要用于数字签名和密钥交换。C语言是一种广泛应用于系统编程和嵌入式开发的编程语言,具有良好的性能和跨平台特性。实现国密算法SM2的C语言版本,可以使算法在不同的硬件和操作系统上运行。 实现SM2算法的C语言版本需要以下几个核心步骤: 1. 导入必要的头文件和库:C语言中,需要导入相关的头文件和库才能使用算法所需的函数和数据类型。 2. 生成密钥对:使用C语言的随机数生成函数生成SM2算法所需的私钥和公钥。 3. 数据加密和解密:使用C语言的加密和解密函数调用SM2算法中的相应函数进行数据的加密和解密。 4. 数字签名和验证:使用C语言的哈希函数计算消息摘要,然后调用SM2算法中的数字签名和验证函数进行签名和验证操作。 5. 密钥交换:通过调用SM2算法中的密钥交换函数,实现双方之间的密钥交换。 6. 进行测试和调试:使用C语言的单元测试框架对实现算法进行测试和调试,确保算法的正确性和稳定性。 总结来说,实现国密算法SM2的C语言版本需要导入相关的头文件和库,生成密钥对,进行数据加密和解密,实现数字签名和验证,以及实现密钥交换等功能。通过测试和调试保证算法的正确性和稳定性。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JAVA·D·WangJing

您的鼓励是我最大的动力

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

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

打赏作者

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

抵扣说明:

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

余额充值