SM2前后端加密和解密

2024-08-21 12:52
文章标签 解密 加密 sm2

本文主要是介绍SM2前后端加密和解密,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一:前端vue

二:后端解密

三:后端详解

3.1maven文件 

<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15to18</artifactId><version>1.66</version>
</dependency>

3.2工具类(生成公钥、私钥、加密、解密)

public class Sm2Utils {private static final X9ECParameters X9_EC_PARAMETERS = GMNamedCurves.getByName("sm2p256v1");private static final ECParameterSpec EC_DOMAIN_PARAMETERS = new ECParameterSpec(X9_EC_PARAMETERS.getCurve(), X9_EC_PARAMETERS.getG(), X9_EC_PARAMETERS.getN());static {if (Security.getProvider(BouncyCastleProvider.PROVIDER_NAME) == null) {Security.addProvider(new BouncyCastleProvider());}}/*** 生成公私钥对** @return* @throws Exception*/public static KeyPair genePublicPrivate() throws Exception {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC");// 初始化密妈生感器keyPairGenerator.initialize(new ECGenParameterSpec("sm2p256v1"), new SecureRandom());//SM2算法所使用的曲线//生成密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();//获公钥PublicKey publicKey = keyPair.getPublic();// 获私钥PrivateKey privateKey = keyPair.getPrivate();System.out.println("publicKey" + publicKey);System.out.println("privateKey" + privateKey);return keyPair;}/*** 生成公私钥十六进制String* @return* @throws Exception*/public static Map<String, Object> genePublicPrivateMap() throws Exception {Map<String, Object> back = new HashMap<>();KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC");// 初始化密妈生感器keyPairGenerator.initialize(new ECGenParameterSpec("sm2p256v1"), new SecureRandom());//是、SM2算法所使用的曲线//生密钥对KeyPair keyPair = keyPairGenerator.generateKeyPair();//获公钥PublicKey publicKey = keyPair.getPublic();BCECPublicKey p = (BCECPublicKey) publicKey;String hexPubString = Hex.toHexString(p.getQ().getEncoded(false));System.out.println("publicKeyHex:" + hexPubString);back.put("publicKey", hexPubString);// 获私钥PrivateKey privateKey = keyPair.getPrivate();ECPrivateKey ecprivateKey = (ECPrivateKey) privateKey;String hexPriString = ecprivateKey.getD().toString(16);System.out.println("privateKeyHex:" + hexPriString);back.put("privateKey", hexPriString);return back;}/***字符串转公钥** @param* @return BCECPublicKey*/public static BCECPublicKey convertHexToPublicKey(String publicKeyHex) throws InvalidKeySpecException {if (publicKeyHex.length() > 128) {publicKeyHex = publicKeyHex.substring(publicKeyHex.length() - 128);}String xCoord = publicKeyHex.substring(0, 64);String yCoord = publicKeyHex.substring(64);BigInteger x = new BigInteger(xCoord, 16);BigInteger y = new BigInteger(yCoord, 16);ECPublicKeySpec publicKeySpec = new ECPublicKeySpec(X9_EC_PARAMETERS.getCurve().createPoint(x, y), EC_DOMAIN_PARAMETERS);return new BCECPublicKey("EC", publicKeySpec, BouncyCastleProvider.CONFIGURATION);}/*** 字符串转私钥.* @return BCECPrivateKey*/public static BCECPrivateKey convertHexToPrivateKey(String privateKeyHex) throws InvalidKeySpecException {BigInteger d = new BigInteger(privateKeyHex, 16);ECPrivateKeySpec privateKeySpec = new ECPrivateKeySpec(d, EC_DOMAIN_PARAMETERS);return new BCECPrivateKey("EC", privateKeySpec, BouncyCastleProvider.CONFIGURATION);}/*** 私钥解密* @param cipherData* @param privateKey* @return*/public static String decrypt(String cipherData, String privateKey) {if (!cipherData.startsWith("04")) {cipherData = "04" + cipherData;}byte[] cipherDataByte = Hex.decode(cipherData);BigInteger privateKeyD = new BigInteger(privateKey, 16);//获取一条SM2曲线参数X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");//构造domain参数ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters);SM2Engine sm2Engine = new SM2Engine(SM2Engine.Mode.C1C3C2);// 设置sm2为解密模式sm2Engine.init(false, privateKeyParameters);String back = "";try {byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length);return new String(arrayOfBytes);} catch (Exception e) {System.out.println("SM2解密异常:" + e.getMessage());}return back;}/*** 公钥加密* @param publicKey* @param data* @return*/public static String encrypt(String publicKey, String data) {// 获取一条SM2曲线参数X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1");// 构造ECC算法参数,曲线方程、椭圆曲线G点、大整数NECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), sm2ECParameters.getG(), sm2ECParameters.getN());//提取公钥点ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(Hex.decode(publicKey));// 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters);SM2Engine sm2Engine = new SM2Engine(SM2Engine.Mode.C1C3C2);// 设置sm2为加密模式sm2Engine.init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom()));byte[] arrayOfBytes = null;try {byte[] in = data.getBytes();arrayOfBytes = sm2Engine.processBlock(in, 0, in.length);} catch (Exception e) {System.out.println("SM2加密异常:" + e.getMessage());}return Hex.toHexString(arrayOfBytes);}/*** 私钥签名*/public static byte[] signByPrivateKey(byte[] data, PrivateKey privateKey) throws Exception {Signature sig = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), BouncyCastleProvider.PROVIDER_NAME);sig.initSign(privateKey);sig.update(data);return sig.sign();}/*** 公钥验签*/public static boolean verifyByPublicKey(byte[] data, PublicKey publicKey, byte[] signature) throws Exception {Signature sig = Signature.getInstance(GMObjectIdentifiers.sm2sign_with_sm3.toString(), BouncyCastleProvider.PROVIDER_NAME);sig.initVerify(publicKey);sig.update(data);return sig.verify(signature);}
}

这篇关于SM2前后端加密和解密的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1093213

相关文章

Java中的密码加密方式

《Java中的密码加密方式》文章介绍了Java中使用MD5算法对密码进行加密的方法,以及如何通过加盐和多重加密来提高密码的安全性,MD5是一种不可逆的哈希算法,适合用于存储密码,因为其输出的摘要长度固... 目录Java的密码加密方式密码加密一般的应用方式是总结Java的密码加密方式密码加密【这里采用的

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

Java 后端接口入参 - 联合前端VUE 使用AES完成入参出参加密解密

加密效果: 解密后的数据就是正常数据: 后端:使用的是spring-cloud框架,在gateway模块进行操作 <dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>30.0-jre</version></dependency> 编写一个AES加密

3.比 HTTP 更安全的 HTTPS(工作原理理解、非对称加密理解、证书理解)

所谓的协议 协议只是一种规则,你不按规则来就无法和目标方进行你的工作 协议说白了只是人定的规则,任何人都可以定协议 我们不需要太了解细节,这些制定和完善协议的人去做的,我们只需要知道协议的一个大概 HTTPS 协议 1、概述 HTTPS(Hypertext Transfer Protocol Secure)是一种安全的超文本传输协议,主要用于在客户端和服务器之间安全地传输数据

ja-netfilter的前世今生和非对称加密的欺骗原理

文章目录 ja-netfilter起源官网插件插件配置文件插件的综合应用更多用法 非对称加密欺骗原理非对称加密和数字证书激活过程和欺骗手段分析代码示例第一步:生成自签名证书脚本第二步:使用自签名证书对产品激活信息进行签名 样例数据样例激活码(注:用于代码演示,直接粘贴到JetBrains 家 IDE 中无法完成激活!不用试,肯定提示无效,无法激活!!)样例power.conf(配合ja-ne

Linux加密框架设计与实现

本文转自网络文章,内容均为非盈利,版权归原作者所有。 转载此文章仅为个人收藏,分享知识,如有侵权,马上删除。 原文作者:原文作者是独孤九贱大佬 原文地址:http://bbs.chinaunix.net/thread-3627341-1-1.html

Android的登陆MD5加密

1:导入代码 public class MD5Util {private static final String TAG = "MD5Util";/**** MD5加码 生成32位md5码*/public static String string2MD5(String inStr) {Log.e(TAG, "string2MD5: -------------------------");Mess

【C#生态园】解密C# Web框架:选对框架,事半功倍

探秘C# Web开发利器:六款高性能框架与库详细解读 前言 在当今的软件开发领域,C#作为一种多用途编程语言,被广泛应用于各种类型的应用程序开发。特别是在Web开发领域,有许多优秀的C# Web框架和库,本文将对其中一些备受关注的框架进行介绍和比较,帮助读者更好地选择适合其项目需求的工具。 欢迎订阅专栏:C#生态园 文章目录 探秘C# Web开发利器:六款高性能框架与库详细解

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html