package com.abc.apollo.common.util;

import javax.crypto.IllegalBlockSizeException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;
import java.util.concurrent.TimeUnit; public class SmUtil {
private static PublicKey publicKey = null;
private static PrivateKey privateKey = null;
private static byte[] key = null;
private static byte[] iv = null; static {
try {
setup();
} catch (Exception e) {
e.printStackTrace();
}
} /**
* 生成公私钥对
* @throws Exception
*/
public static void setup() throws Exception {
String[] keys = KeyUtils.generateSmKey();
publicKey = KeyUtils.createPublicKey(keys[0]);
privateKey = KeyUtils.createPrivateKey(keys[1]); key = Sm4.generateKey();
iv = AbstractSymmetric.initIv(16);
} public static void main(String[] args) throws Exception {
// System.out.println(encryptSm4String("apollo"));
// System.out.println(encryptSm4String("Apollo_123")); // System.out.println(decryptSm4String("P82APgvQtFuBVT2Sg4ycdA=="));
// System.out.println(decryptSm4String("2NT7rME/kkcTMRV8xNjsig==")); System.out.println(sm3Hex("158"));
System.out.println(sm3bcHex("158"));
System.out.println(hmacSm3Hex("".getBytes(), "abc"));
} public static void main2(String[] args) throws InterruptedException {
List<String> algorithm = new ArrayList<>();
algorithm.add(("SM4/ECB/NOPADDING"));
algorithm.add(("SM4/ECB/PKCS5PADDING"));
algorithm.add(("SM4/ECB/ISO10126PADDING"));
algorithm.add(("SM4/CBC/NOPADDING"));
algorithm.add(("SM4/CBC/PKCS5PADDING"));
algorithm.add(("SM4/CBC/ISO10126PADDING"));
algorithm.add(("SM4/PCBC/NOPADDING"));
algorithm.add(("SM4/PCBC/PKCS5PADDING"));
algorithm.add(("SM4/PCBC/ISO10126PADDING"));
algorithm.add(("SM4/CTR/NOPADDING"));
algorithm.add(("SM4/CTR/PKCS5PADDING"));
algorithm.add(("SM4/CTR/ISO10126PADDING"));
algorithm.add(("SM4/CTS/NOPADDING"));
algorithm.add(("SM4/CTS/PKCS5PADDING"));
algorithm.add(("SM4/CTS/ISO10126PADDING"));
if (iv == null)
iv = AbstractSymmetric.initIv(16); String text = "apollo";
for (String s : algorithm) {
//SM4加密
try {
System.out.println("SM4加密算法: " + s);
System.out.println("SM4加密原始数据: " + text);
System.out.println("SM4加密key: " + Base64.getEncoder().encodeToString(key));
System.out.println("SM4加密iv: " + Base64.getEncoder().encodeToString(iv)); byte[] encrypt = Sm4.encrypt(s, key, iv, text.getBytes());
System.out.println("SM4加密数据密文: " + Base64.getEncoder().encodeToString(encrypt)); //SM4解密
byte[] decrypt = Sm4.decrypt(s, key, iv, encrypt);
System.out.println("SM4解密数据: " + new String(decrypt));
} catch (Exception e) {
if (e instanceof IllegalBlockSizeException) {
System.err.println("SM4解密数据:算法 " + s + "数据需自己手工对齐");
} else {
System.err.println("SM4解密数据:算法 " + s +"::"+ e.getMessage());
}
} finally {
System.err.println("---------------------------------------");
TimeUnit.SECONDS.sleep(1);
}
}
} public static byte[] decryptSm2(byte[] encryptByte) {
return Sm2.decrypt(encryptByte, privateKey);
} public static byte[] encryptSm2(String text) {
return Sm2.encrypt(text.getBytes(), publicKey);
} public static String sm3Hex(String text){
return Sm3.sm3Hex(text.getBytes());
} public static String sm3bcHex(String text) throws Exception {
return Sm3.sm3bcHex(text.getBytes());
} public static String hmacSm3Hex(byte[] key, String text) {
return Sm3.hmacSm3Hex(key ,text.getBytes());
} public static byte[] decryptSm4(byte[] encryptByte) throws Exception {
return Sm4.decrypt("SM4/CBC/PKCS5PADDING", key, iv, encryptByte);
} public static byte[] encryptSm4(String text) throws Exception {
byte[] encrypt = Sm4.encrypt("SM4/CBC/PKCS5PADDING", key, iv, text.getBytes());
return encrypt;
} public static String encryptSm4String(String text) throws Exception {
return encodeToString(encryptSm4(text));
} public static String decryptSm4String(String text) throws Exception {
return new String(decryptSm4(Base64.getDecoder().decode(text)));
} public static byte[] signByPrivateKey(byte[] data, PrivateKey pk) throws Exception {
return Sm2.signByPrivateKey(data, pk);
} public static boolean verifyByPublicKey(byte[] data, PublicKey publicKey, byte[] signature) throws Exception {
return Sm2.verifyByPublicKey(data, publicKey, signature);
} public static String encryptSm2String(String text) {
return encodeToString(encryptSm2(text));
} public static String decryptSm2String(String text) {
return new String(decryptSm2(Base64.getDecoder().decode(text)));
} public static String encodeToString(byte[] input){
return Base64.getEncoder().encodeToString(input);
} public static byte[] decodeToByte(String src){
return Base64.getDecoder().decode(src);
}
}
package com.abc.apollo.common.util;

import org.bouncycastle.asn1.gm.GMObjectIdentifiers;
import org.bouncycastle.crypto.InvalidCipherTextException;
import org.bouncycastle.crypto.engines.SM2Engine;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.crypto.params.ParametersWithRandom;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey;
import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.jce.spec.ECParameterSpec; import java.security.*; public class Sm2 {
static {
Security.addProvider(new BouncyCastleProvider());
} /**
* 根据publicKey对原始数据data,使用SM2加密
*/
public static byte[] encrypt(byte[] data, PublicKey publicKey) {
ECPublicKeyParameters localECPublicKeyParameters = null; if (publicKey instanceof BCECPublicKey) {
BCECPublicKey localECPublicKey = (BCECPublicKey) publicKey;
ECParameterSpec localECParameterSpec = localECPublicKey.getParameters();
ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(),
localECParameterSpec.getG(), localECParameterSpec.getN());
localECPublicKeyParameters = new ECPublicKeyParameters(localECPublicKey.getQ(), localECDomainParameters);
}
SM2Engine localSM2Engine = new SM2Engine();
localSM2Engine.init(true, new ParametersWithRandom(localECPublicKeyParameters, new SecureRandom()));
byte[] arrayOfByte2;
try {
arrayOfByte2 = localSM2Engine.processBlock(data, 0, data.length);
return arrayOfByte2;
} catch (InvalidCipherTextException e) { e.printStackTrace();
return null;
}
} /**
* 根据privateKey对加密数据encodedata,使用SM2解密
*/
public static byte[] decrypt(byte[] encodedata, PrivateKey privateKey) {
SM2Engine localSM2Engine = new SM2Engine();
BCECPrivateKey sm2PriK = (BCECPrivateKey) privateKey;
ECParameterSpec localECParameterSpec = sm2PriK.getParameters();
ECDomainParameters localECDomainParameters = new ECDomainParameters(localECParameterSpec.getCurve(),
localECParameterSpec.getG(), localECParameterSpec.getN());
ECPrivateKeyParameters localECPrivateKeyParameters = new ECPrivateKeyParameters(sm2PriK.getD(),
localECDomainParameters);
localSM2Engine.init(false, localECPrivateKeyParameters);
try {
byte[] arrayOfByte3 = localSM2Engine.processBlock(encodedata, 0, encodedata.length);
return arrayOfByte3;
} catch (InvalidCipherTextException e) {
e.printStackTrace();
return null;
}
} /**
* 私钥签名
*/
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);
byte[] ret = sig.sign();
return ret;
} /**
* 公钥验签
*/
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);
boolean ret = sig.verify(signature);
return ret;
}
}
package com.abc.apollo.common.util;

import org.bouncycastle.crypto.digests.SM3Digest;
import org.bouncycastle.crypto.macs.HMac;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.jce.provider.BouncyCastleProvider; import java.security.MessageDigest;
import java.security.Security; public class Sm3 {
static {
Security.addProvider(new BouncyCastleProvider());
} public static byte[] sm3(byte[] srcData) {
SM3Digest sm3Digest = new SM3Digest();
sm3Digest.update(srcData, 0, srcData.length);
byte[] hash = new byte[sm3Digest.getDigestSize()];
sm3Digest.doFinal(hash, 0);
return hash;
} public static String sm3Hex(byte[] srcData) {
byte[] hash = sm3(srcData);
String hexString = org.apache.commons.codec.binary.Hex.encodeHexString(hash);
return hexString;
} public static byte[] hmacSm3(byte[] key, byte[] srcData) {
KeyParameter keyParameter = new KeyParameter(key);
SM3Digest digest = new SM3Digest();
HMac mac = new HMac(digest);
mac.init(keyParameter);
mac.update(srcData, 0, srcData.length);
byte[] hash = new byte[mac.getMacSize()];
mac.doFinal(hash, 0);
return hash;
} public static String hmacSm3Hex(byte[] key, byte[] srcData) {
byte[] hash = hmacSm3(key, srcData);
String hexString = org.apache.commons.codec.binary.Hex.encodeHexString(hash);
return hexString;
} public static byte[] sm3bc(byte[] srcData) throws Exception {
MessageDigest messageDigest = MessageDigest.getInstance("SM3", "BC");
byte[] digest = messageDigest.digest(srcData);
return digest;
} public static String sm3bcHex(byte[] srcData) throws Exception {
byte[] hash = sm3bc(srcData);
String hexString = org.apache.commons.codec.binary.Hex.encodeHexString(hash);
return hexString;
}
}
package com.aaaa.apollo.common.util;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.security.*; public class Sm4 {
static {
Security.addProvider(new BouncyCastleProvider());
} public static final String ALGORITHM_NAME = "SM4";
public static final String DEFAULT_KEY = "random_seed";
// 128-32位16进制;256-64位16进制
public static final int DEFAULT_KEY_SIZE = 128; static {
Security.addProvider(new BouncyCastleProvider());
} public static byte[] generateKey() throws NoSuchAlgorithmException, NoSuchProviderException {
return generateKey(DEFAULT_KEY, DEFAULT_KEY_SIZE);
} public static byte[] generateKey(String seed) throws NoSuchAlgorithmException, NoSuchProviderException {
return generateKey(seed, DEFAULT_KEY_SIZE);
} public static byte[] generateKey(String seed, int keySize) throws NoSuchAlgorithmException, NoSuchProviderException {
KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME);
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
if (null != seed && !"".equals(seed)) {
random.setSeed(seed.getBytes());
}
kg.init(keySize, random);
return kg.generateKey().getEncoded();
} /**
* @description 加密
*/
public static byte[] encrypt(String algorithmName, byte[] key, byte[] iv, byte[] data) throws Exception {
return sm4core(algorithmName, Cipher.ENCRYPT_MODE, key, iv, data);
} /**
* @description 解密
*/
public static byte[] decrypt(String algorithmName, byte[] key, byte[] iv, byte[] data) throws Exception {
return sm4core(algorithmName, Cipher.DECRYPT_MODE, key, iv, data);
} private static byte[] sm4core(String algorithmName, int type, byte[] key, byte[] iv, byte[] data) throws Exception {
Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME);
Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);
if (algorithmName.contains("/ECB/")) {
cipher.init(type, sm4Key);
} else {
IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
cipher.init(type, sm4Key, ivParameterSpec);
} return cipher.doFinal(data);
}
}

SM国密算法的更多相关文章

  1. SM 国密算法踩坑指南

    各位,好久不见~ 最近接手网联的国密改造项目,由于对国密算法比较陌生,前期碰到了一系列国密算法加解密的问题. 所以这次总结一下,分享这个过程遇到的问题,希望帮到大家. 国密 什么是国密算法? 国密就是 ...

  2. SM系列国密算法(转)

    原文地址:科普一下SM系列国密算法(从零开始学区块链 189) 众所周知,为了保障商用密码的安全性,国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2).SM2.SM3.SM4.SM7. ...

  3. Hyperledger Fabric密码模块系列之BCCSP(五) - 国密算法实现

    Talk is cheap, show me your code. 代码也看了,蛋也扯了,之后总该做点什么.响应国家政策,把我们的国密算法融合进去吧--  先附两张bccsp下国密算法的设计实现图. ...

  4. 关于国密算法 SM1,SM2,SM3,SM4 的笔记

    国密即国家密码局认定的国产密码算法.主要有SM1,SM2,SM3,SM4.密钥长度和分组长度均为128位. SM1 为对称加密.其加密强度与AES相当.该算法不公开,调用该算法时,需要通过加密芯片的接 ...

  5. 20155206赵飞 基于《Arm试验箱的国密算法应用》课程设计个人报告

    20155206赵飞 基于<Arm试验箱的国密算法应用>课程设计个人报告 课程设计中承担的任务 完成试验箱测试功能1,2,3 . 1:LED闪烁实验 一.实验目的  学习GPIO原理  ...

  6. 《基于Arm实验箱的国密算法应用》课程设计 结题报告

    <基于Arm实验箱的国密算法应用>课程设计 结题报告 小组成员姓名:20155206赵飞 20155220吴思其 20155234昝昕明 指导教师:娄嘉鹏 设计方案 题目要求:基于Arm实 ...

  7. 2015520吴思其 基于《Arm试验箱的国密算法应用》课程设计个人报告

    20155200吴思其 基于<Arm试验箱的国密算法应用>课程设计个人报告 课程设计中承担的任务 完成试验箱测试功能4,5,6以及SM3加密实验的实现 测试四 GPIO0按键中断实验 实验 ...

  8. 20155234 昝昕明《基于ARM实验箱的国密算法应用》课程设计个人报告

    20155234 昝昕明<基于ARM实验箱的国密算法应用>课程设计个人报告 个人贡献 参与课设题目讨论及完成全过程: 资料收集: SM1算法及和ARM之间通信 负责串口代码调试: 协调完成 ...

  9. java sm4国密算法加密、解密

      java sm4国密算法加密.解密 CreationTime--2018年7月5日09点20分 Author:Marydon 1.准备工作 所需jar包: bcprov-jdk15on-1.59. ...

  10. 国密算法--Openssl 实现国密算法(基础介绍和产生秘钥对)

    国密非对称加密算法 又称sm2,它是采取了ECC(曲线加密算法)中的一条固定的曲线,实际上就是ECC算法. 因为openssl里面不包含sm2算法,所以就要重新进行封装-. - 对于ECC算法我就不介 ...

随机推荐

  1. 标准库之 datetime和time 模块

    一.time 模块 time模块是Python标准库中最基础.最常用的模块之一.它提供了各种处理时间的方法和函数,如获取当前时间.格式化时间.计算时间差等.time模块大部分函数的底层实现是 C 语言 ...

  2. uniapp中前端canvas合成图片使用详解

    项目开发中用到了定位打卡,保存当前位置到上传图片的功能.刚开始想着后端人员合成,前端上传经纬度.位置信息和图片就OK,没想到后端人员以使用项目中现有的组件为借口,让前端合成图片,造成前端工作量大增,再 ...

  3. Android复习(三)清单文件中的元素——> provider、receiver、service

    <provider> 语法:   <provider android:authorities="list" android:directBootAware=[&q ...

  4. ToDesk云电脑手机也能玩?安卓系统已上线!

    近日,ToDesk云电脑首次发布移动端!这次云电脑将安卓和iOS双系统都安排上了,基本照顾到所有移动端的用户.并且性能也保持了电脑版的高配置,价格还是那么优惠. 我用了一次都有点不想退出了,用来打游戏 ...

  5. RAC环境中某数据文件(非system表空间)创建在本地,不停机迁移到ASM磁盘中

    Datafiles are mistakenly built into the local file system for processing in the RAC environment The ...

  6. Hadoop习题汇总

    目录 选择 单选 多选 判断 填空 简答 选择 单选 查看HDFS系统版本的Shell命令,以下正确的是(). hdfs -ver hdfs version (答案) dfsadmin version ...

  7. 在昇腾Ascend 910B上运行Qwen2.5推理

    目前在国产 AI 芯片,例如昇腾 NPU 上运行大模型是一项广泛且迫切的需求,然而当前的生态还远未成熟.从底层芯片的算力性能.计算架构的算子优化,到上层推理框架对各种模型的支持及推理加速,仍有很多需要 ...

  8. 局部加权回归(Lowess)

    代码示例:(源自:https://blog.csdn.net/weixin_71158509/article/details/136060826) import numpy as np import ...

  9. 基于sqli-labs Less-7 的sql高权读写注入详解

    1. MySQL高权限读写简介 1.1 前置知识 数据库的高权用户对服务器上的文件进行读取写入操作,从而可以进行写入一句话木马来获得服务器权限或者读取服务器上的配置型文件等注入行为. select l ...

  10. 异常断链的惨痛经历!拯救Air780EP模块紧急项目

    ​ 必须要吐槽一下:最近被老板驱使,要用Air780EP模块做几个紧急项目... 就怕紧急项目,时间紧任务重,遇到了一些棘手问题,可把我给折腾死了-- 这里把遇到的问题,排查记录下来,看能不能帮到因遇 ...