国密算法SM1 SM2 SM3 SM4 SM9

一、概述

  • SM1-无具体实现

SM1作为一种对称加密算法,由于其算法细节并未公开,且主要在中国国内使用,因此在国际通用的加密库(如Bouncy Castle)中并不直接支持SM1算法。
SM1算法的具体实现涉及国家密码管理局的规范,通常需要使用国家指定的安全模块(如SSF33、SC1/SC2卡)或通过国家认证的加密硬件/软件产品来实现。
不过,如果你有合法授权并且在合规的环境下需要使用SM1算法,可能需要依赖特定的国产加密库或SDK,比如某些商用的密码机提供的SDK,这些SDK会封装好SM1的加解密接口供开发者调用。
但具体的实现代码和工具类因为涉及知识产权和国家安全规定,无法在这里直接提供。

  • SM2

非对称加密、签名算法
加密 解密 加签 验签

可替换RSA

  • SM3

签名算法 杂凑算法
加签 验签

可替换MD5等Hash算法

  • SM4

对称加解密密算法
加密 解密

可替换DES

  • SM9-无具体实现

目前,标准的Java库如Bouncy Castle并不直接支持SM9算法;
因此可能需要使用特定的国密算法支持库或遵循国家密码管理局推荐的实现;

准备-添加依赖

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.64</version>
</dependency>

二、国密详解

2.1 SM2实现

import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import java.security.*;
import java.security.spec.ECGenParameterSpec;
import java.util.Base64;/*** SM2实现工具类*/
public class SM2Util {/**    这行代码是在Java中用于向安全系统添加Bouncy Castle安全提供器的。*    Bouncy Castle是一个流行的开源加密库,它提供了许多密码学算法和安全协议的实现。*    通过调用Security.addProvider并传入BouncyCastleProvider对象,你可以注册Bouncy Castle提供的安全服务和算法到Java的安全框架中。*    这样一来,你就可以在你的应用程序中使用Bouncy Castle所提供的加密算法、密钥生成和管理等功能。*/static {Security.addProvider(new BouncyCastleProvider());}public static KeyPair generateKeyPair() throws Exception {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC");keyPairGenerator.initialize(new ECGenParameterSpec("sm2p256v1"));return keyPairGenerator.generateKeyPair();}public static byte[] encrypt(PublicKey publicKey, byte[] data) throws Exception {Cipher cipher = Cipher.getInstance("SM2", "BC");cipher.init(Cipher.ENCRYPT_MODE, publicKey);return cipher.doFinal(data);}public static byte[] decrypt(PrivateKey privateKey, byte[] encryptedData) throws Exception {Cipher cipher = Cipher.getInstance("SM2", "BC");cipher.init(Cipher.DECRYPT_MODE, privateKey);return cipher.doFinal(encryptedData);}public static byte[] sign(PrivateKey privateKey, byte[] data) throws Exception {Signature signature = Signature.getInstance("SM3withSM2", "BC");signature.initSign(privateKey);signature.update(data);return signature.sign();}public static boolean verifySignature(PublicKey publicKey, byte[] data, byte[] signature) throws Exception {Signature sig = Signature.getInstance("SM3withSM2", "BC");sig.initVerify(publicKey);sig.update(data);return sig.verify(signature);}public static void main(String[] args) throws Exception {// 将公钥私钥字符串转换为PublicKey和PrivateKey对象KeyPair keyPair = generateKeyPair();PublicKey publicKey = keyPair.getPublic();System.out.println("Public Key: " + Base64.getEncoder().encodeToString(publicKey.getEncoded()));PrivateKey privateKey = keyPair.getPrivate();System.out.printf("Private Key: " + Base64.getEncoder().encodeToString(privateKey.getEncoded()));// 待加密数据byte[] dataToEncrypt = "Hello, SM2!".getBytes();// 加密byte[] encryptedData = encrypt(publicKey, dataToEncrypt);System.out.println("Encrypted: " + Base64.getEncoder().encodeToString(encryptedData));// 解密byte[] decryptedData = decrypt(privateKey, encryptedData);System.out.println("Decrypted: " + new String(decryptedData));// 加签byte[] signature = sign(privateKey, dataToEncrypt);System.out.println("Signature: " + Base64.getEncoder().encodeToString(signature));// 验签boolean isVerified = verifySignature(publicKey, dataToEncrypt, signature);System.out.println("Signature verified: " + isVerified);}}

2.2 SM3实现

import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.util.encoders.Hex;/*** sm3工具类* 2024/6/25 16:29*/
public class SM3Util {/*** sm3签名* @param signString 待签名信息* @return 签名*/public static String sign(String signString) {byte[] bytes = signString.getBytes();byte[] result = new byte[32];SM3Digest sm3 = new SM3Digest();sm3.update(bytes, 0, bytes.length);sm3.doFinal(result, 0);return Hex.toHexString(result);}
}

2.3 SM4实现

import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.Cipher;
import javax.crypto.spec.GCMParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.SecureRandom;
import java.security.Security;
import java.util.Base64;public class SM4Util {/*** 加密算法*/public static final String ALGORITHM = "SM4";/*** 加密工作模式:GCM* 数据填充模式:PKCS5Padding*/public static final String ALGORITHM_MODEL_GCM_PADDING = "SM4/GCM/NoPadding";/*** 随机数的长度*/public static final int NONCE_LENGTH = 128;static {// 添加Bouncy Castle providerSecurity.addProvider(new BouncyCastleProvider());}/*** 使用SM4-GCM模式加密** @param plainText 需要加密的内容* @param keyBytes  密钥字节数组* @param ivBytes   初始化向量字节数组* @return 加密之后的内容* @throws Exception 加密过程中可能发生的异常*/public static String encryptWithGCM(String plainText, byte[] keyBytes, byte[] ivBytes) throws Exception {SecretKeySpec sm4Key = new SecretKeySpec(keyBytes, ALGORITHM);GCMParameterSpec ivSpec = new GCMParameterSpec(NONCE_LENGTH, ivBytes);Cipher cipher = Cipher.getInstance(ALGORITHM_MODEL_GCM_PADDING, "BC");cipher.init(Cipher.ENCRYPT_MODE, sm4Key, ivSpec);byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encryptedBytes);}/*** 使用SM4-GCM模式解密** @param cipherText 需要解密的内容* @param keyBytes   密钥字节数组* @param ivBytes    初始化向量字节数据* @return 解密之后内容* @throws Exception 解密过程中可能发生的异常*/public static String decryptWithGCM(String cipherText, byte[] keyBytes, byte[] ivBytes) throws Exception {SecretKeySpec sm4Key = new SecretKeySpec(keyBytes, ALGORITHM);GCMParameterSpec ivSpec = new GCMParameterSpec(NONCE_LENGTH, ivBytes);Cipher cipher = Cipher.getInstance(ALGORITHM_MODEL_GCM_PADDING, "BC");cipher.init(Cipher.DECRYPT_MODE, sm4Key, ivSpec);byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(cipherText));return new String(decryptedBytes, StandardCharsets.UTF_8);}/*** 使用SecureRandom生成指定长度的密钥或IV** @param length 密钥或IV的长度(字节数)* @return 生成的随机字节数组*/public static byte[] generateKey(int length) {SecureRandom secureRandom = new SecureRandom();byte[] bytes = new byte[length];secureRandom.nextBytes(bytes);return bytes;}/*** 生成指定长度的初始化向量(IV)** @param length IV的长度(字节数)* @return 生成的随机字节数组*/public static byte[] generateIV(int length) {// IV的生成方式与密钥相同,使用SecureRandomreturn generateKey(length);}public static void main(String[] args) throws Exception {String plainText = "1234测试567";// 使用随机的byte[] key = generateKey(16);byte[] iv = generateIV(16);String cipherText1 = encryptWithGCM(plainText, key, iv);System.out.println("加密后:" + cipherText1);String decryptedText1 = decryptWithGCM(cipherText1, key, iv);System.out.println("解密后:" + decryptedText1);}
}

三、聚合工具类SMUtil

import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Base64;public abstract class SMUtil {/*** SM1作为一种对称加密算法,由于其算法细节并未公开,且主要在中国国内使用,因此在国际通用的加密库(如Bouncy Castle)中并不直接支持SM1算法。* SM1算法的具体实现涉及国家密码管理局的规范,通常需要使用国家指定的安全模块(如SSF33、SC1/SC2卡)或通过国家认证的加密硬件/软件产品来实现。* 不过,如果你有合法授权并且在合规的环境下需要使用SM1算法,可能需要依赖特定的国产加密库或SDK,比如某些商用的密码机提供的SDK,这些SDK会封装好SM1的加解密接口供开发者调用。* 但具体的实现代码和工具类因为涉及知识产权和国家安全规定,无法在这里直接提供。**/abstract void sm1();/*** SM2生成 私钥和公钥* @return 私钥和公钥*/public static KeyPair sm2GenerateKeyPair() {try {return SM2Util.generateKeyPair();} catch (Exception e) {throw new RuntimeException(e);}}/*** sm2签名* @param privateKey 私钥* @param data       待签名内容* @return 签名*/public static String sm2Sign(PrivateKey privateKey, String data) {try {byte[] sign = SM2Util.sign(privateKey, data.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(sign);} catch (Exception e) {throw new RuntimeException(e);}}/*** sm2验签* @param publicKey 公钥* @param data      待验签内容* @param sign      签名* @return 是否验签通过*/public static boolean sm2VerifySign(PublicKey publicKey, String data, String sign) {try {return SM2Util.verifySignature(publicKey, data.getBytes(StandardCharsets.UTF_8), Base64.getDecoder().decode(sign));} catch (Exception e) {throw new RuntimeException(e);}}/*** sm2加密* @param publicKey 公钥* @param data      待加密内容* @return 加密之后的内容*/public static String sm2Encrypt(PublicKey publicKey, String data) {try {byte[] encrypt = SM2Util.encrypt(publicKey, data.getBytes(StandardCharsets.UTF_8));return Base64.getEncoder().encodeToString(encrypt);} catch (Exception e) {throw new RuntimeException(e);}}/*** sm2解密* @param privateKey 私钥* @param data       待解密内容* @return 解密之后的内容*/public static String sm2Decrypt(PrivateKey privateKey, String data) {try {byte[] decrypt = SM2Util.decrypt(privateKey, Base64.getDecoder().decode(data));return new String(decrypt, StandardCharsets.UTF_8);} catch (Exception e) {throw new RuntimeException(e);}}/*** sm3签名* @param signString 待签名信息* @return 签名*/public static String sm3Sign(String signString) {return SM3Util.sign(signString);}/*** sm4加密* 使用传输的密钥和初始化向量进行加密* @param plainText 需要加密的内容* @param key       密钥 长度必须为16* @param iv        初始化向量 长度必须为16* @return 加密之后的内容* @throws Exception 加密过程中可能发生的异常*/public static String sm4Encrypt(String plainText, String key, String iv) throws Exception {return SM4Util.encryptWithGCM(plainText, key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8));}/**** sm4解密* 使用传输的密钥和初始化向量进行加密* @param plainText 需要加密的内容* @param key       密钥 长度必须为16* @param iv        初始化向量 长度必须为16* @return 加密之后的内容* @throws Exception 加密过程中可能发生的异常*/public static String sm4Decrypt(String plainText, String key, String iv) throws Exception {return SM4Util.decryptWithGCM(plainText, key.getBytes(StandardCharsets.UTF_8), iv.getBytes(StandardCharsets.UTF_8));}/*** 目前,标准的Java库如Bouncy Castle并不直接支持SM9算法;* 因此可能需要使用特定的国密算法支持库或遵循国家密码管理局推荐的实现;*/abstract void sm9();public static void main(String[] args) throws Exception {// sm2 演示// 生成密钥对KeyPair keyPair = sm2GenerateKeyPair();System.out.println(keyPair.getPrivate());System.out.println(keyPair.getPublic());String x = sm2Sign(keyPair.getPrivate(), "12谢谢哈哈");System.out.println(sm2VerifySign(keyPair.getPublic(), "12谢谢哈哈", x));String y = sm2Encrypt(keyPair.getPublic(), "12谢谢哈哈");System.out.println(sm2Decrypt(keyPair.getPrivate(), y));// sm3 演示String s = sm3Sign("12谢谢哈哈");System.out.println(s);// sm4String key = "jsikjrblkwqb79ik";String iv = "1224567890998880";String sm4Encrypt = sm4Encrypt("123测试!@456",key, iv);System.out.println(sm4Encrypt);String sm4Decrypt = sm4Decrypt(sm4Encrypt, key, iv);System.out.println(sm4Decrypt);}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/34960.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Studying-代码随想录训练营day20| 235.二叉搜索树的最近公共祖先、701.二叉搜索树中的插入操作、450.删除二叉搜索树中的节点

第二十天&#xff0c;二叉树part07&#xff0c;二叉树搜索树加油加油&#x1f4aa; 目录 235.二叉搜索树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点 拓展&#xff1a;普通二叉树的删除方式 总结 235.二叉搜索树的最近公共祖先 文档讲解&…

洁净室(区)浮游菌检测标准操作规程及GB/T 16292-2010测试方法解读

洁净室(区)空气中浮游菌的检测。洁净区浮游菌检测是一种评估和控制洁净区(如实验室、生产车间等)内空气质量的方法。这种检测的目的是通过测量空气中的微生物(即浮游菌)数量&#xff0c;来评估洁净区的清洁度或污染程度。下面中邦兴业小编带大家详细看下如何进行浮游菌采样检测…

RK3568技术笔记九 编译Linux详细介绍

在编译前需要按照前面的方法始化编译环境&#xff0c;否则会导致编译失败&#xff08;若配置过则无需重复配置&#xff09;。 全自动编译包含所有镜像编译&#xff0c;包括&#xff1a;uboot编译、Kernel编译、Recovey编译、文件系统编译、编译完成镜像的更新与打包。 按照前面…

阅读笔记——《Large Language Model guided Protocol Fuzzing》

【参考文献】Meng R, Mirchev M, Bhme M, et al. Large language model guided protocol fuzzing[C]//Proceedings of the 31st Annual Network and Distributed System Security Symposium (NDSS). 2024.&#xff08;CCF A类会议&#xff09;【注】本文仅为作者个人学习笔记&a…

【附精彩文章合辑】当谈到程序的“通用性”与“过度设计”的困境时,我们可以通过一些具体的例子来更直观地阐述这些解决方案

当谈到程序的“通用性”与“过度设计”的困境时&#xff0c;我们可以通过一些具体的例子来更直观地阐述这些解决方案。以下是一些示例&#xff1a; 一、明确需求与目标 例子1&#xff1a;在线购物平台 需求分析&#xff1a;平台需要支持用户注册、登录、浏览商品、下单购买、…

2024ciscn 华东北awdp pwn部分wp

pwn1 break 很简单&#xff0c;栈可执行。 先格式化字符串泄露出栈地址和canary&#xff0c;然后稍稍布置一下打orw就行 沙盒和没有一样 from pwn import *context(archamd64, oslinux)if __name__ __main__:# io remote(192.47.1.39, 80)io remote(192.168.142.137, 123…

初阶 《操作符详解》 10. 逗号表达式

10. 逗号表达式 exp1, exp2, exp3, …expN 注&#xff1a; 1.逗号表达式&#xff0c;就是用逗号隔开的多个表达式 2.逗号表达式&#xff0c;从左向右依次执行&#xff0c;整个表达式的结果是最后一个表达式的结果 代码1 #include <stdio.h> int main() {int a 1;int b…

【Qt6.3 基础教程 19】 设计直观用户界面(UI):Qt应用界面设计原则

文章目录 前言理解用户需求界面的简洁性一致性反馈利用布局管理美化你的应用结论 前言 用户界面(UI)设计对于任何软件项目的成功至关重要&#xff0c;因为它是用户与您的应用之间交流的桥梁。在Qt环境中&#xff0c;拥有一套清晰和直观的UI设计原则&#xff0c;将有助于您创建…

解决ubuntu18.04 安装vscode 报依赖库错误,以及打不开终端的问题。

其实很简单&#xff0c;ubuntu18.04太老了&#xff0c;官网最新版本的vscode对ubuntu18.04会有些依赖库的问题。 一顿查资料后发现2023.11月的1.85版本正常使用&#xff0c;于是完美解决。 下载链接 Visual Studio Code November 2023 点击这里下载。 下载完成&#xff0c;…

golang 获取字符串切割之后的最后一个字符串

有些场景需要获取字符串按某个字符切割之后&#xff0c;获取最后&#xff0c;有个比较好的实践分享 strings.LastIndex 如果没有匹配到&#xff0c;则返回-1 package mainimport ("fmt""strings" )func main() {ss : []string{"", ":&quo…

数据结构需要每个都具体实现吗?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「数据结构的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;用c的stl能刷算法题是不…

【INTEL(ALTERA)】运行配置找不到导入的自定义 makefile 项目

目录 说明 解决方法 说明 在使用 Import Custom Makefile 用于Nios II软件构建工具项目 选项导入项目后&#xff0c;Nios II SBT 无法将导入的自定义 makefile 识别为Nios II C/C 应用项目。因此&#xff0c;项目名称不出现在运行配置中的列表中。 解决方法 在 "运行配置 …

clean code-代码整洁之道 阅读笔记(第十三章)

第十三章 并发编程 "对象是过程的抽象。线程是调度的抽象。" --James O Coplien 13.1 为什么要并发 并发是一种解耦策略。它帮助我们把做什么&#xff08;目的&#xff09;和何时&#xff08;时机&#xff09;做分解开。在单线 程应用中&#xff0c;目的与时机紧密耦…

【OpenCV 图像处理 Python版】OpenCV 简介及安装

文章目录 1.OpenCV 介绍1.1 OpenCV 的特点1.2 OpenCV 的主要模块1.3 OpenCV 的应用场景 2.OpenCV-Python 库3.OpenCV 安装 1.OpenCV 介绍 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉和机器学习软件库。它由英特尔公司于1999年…

API的优势及应用场景(淘宝API测试的详细步骤)

一、API的优势 API的出现为应用程序间的通信提供了一种新的方式&#xff0c;它有以下优势&#xff1a; 1、降低开发难度 开发者可以通过API访问其他应用程序的数据和功能&#xff0c;避免了重复开发&#xff0c;降低了开发难度。 2、提高开发效率 API提供了一种标准化的通…

Transformer 模型全解析:NLP领域的变革者与任务精粹

标题&#xff1a;Transformer 模型全解析&#xff1a;NLP领域的变革者与任务精粹 引言 Transformer 模型自问世以来&#xff0c;已成为自然语言处理&#xff08;NLP&#xff09;领域的一大突破&#xff0c;其基于自注意力机制的架构为各种语言任务带来了革命性的进展。本文将…

使用AES,前端加密,后端解密,spring工具类,直接c就完事了

学习python的时候&#xff0c;看到很多会对参数进行加密&#xff0c;于是好奇心驱使下&#xff0c;让我去了解了下AES加密如何在java中实现。 首先 npm install crypto-js 然后在你的方法中&#xff0c;给你们前端源码看看&#xff0c;因为我用的ruoyi框架做的实验&#xff…

Java中的消息队列与事件总线设计

Java中的消息队列与事件总线设计 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将探讨Java中的消息队列与事件总线设计&#xff0c;这两者在现代分布式…

构建一个检索增强生成(RAG)应用程序

:::tips 此文档是LangChain官方教程的实践总结&#xff1a;https://python.langchain.com/v0.2/docs/tutorials/rag/实践前你需要准备&#xff1a;OPENAI_API_KEY Generator&#xff1a;根据检索到的信息和用户的查询生成自然语言的回答。LANGCHAIN_API_KEY 密切监控和评估您的…

【自然语言处理系列】掌握NLP基础:去停用词、词性标注与命名实体识别实战教程

摘要&#xff1a;本系列教程专注于自然语言处理&#xff08;NLP&#xff09;中的基础元素&#xff0c;包括去停用词、词性标注以及命名实体识别。这些步骤是文本预处理和分析不可或缺的组成部分。我们将通过具体的实例和技术演示&#xff0c;讲解如何使用Python及其相关库&…