sm4 前后端 加密_sm4加密[通俗易懂]

sm4 前后端 加密_sm4加密[通俗易懂]前言项目里需要用到sm4加密,在这里记录一下(springboot)。依赖bouncycastleorg.bouncycastlebcmail-jdk15on1.66cn.hutoolhutool-all5.4.1代码直接贴代码,可以根据自己的需要封装相对应的代码逻辑。//需要注意的是,使用KeyGenerator生成密钥种子的时候,windows和linux上会产生不一致。//例如:KeyGen…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

前言

项目里需要用到sm4加密,在这里记录一下(springboot)。

依赖

bouncycastle

org.bouncycastle

bcmail-jdk15on

1.66

cn.hutool

hutool-all

5.4.1

代码

直接贴代码,可以根据自己的需要封装相对应的代码逻辑。

//需要注意的是,使用KeyGenerator生成密钥种子的时候,windows和linux上会产生不一致。

//例如:

KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, PROVIDER_NAME);

SecureRandom random = new SecureRandom();

if(null != seed && !””.equals(seed)){

random.setSeed(seed.getBytes());

}

kg.init(keySize, random);

//解决办法

SecureRandom random = SecureRandom.getInstance(“SHA1PRNG”);

import cn.hutool.core.util.HexUtil;

import com.spinfo.common.constants.UserConstants;

import com.spinfo.controller.UserController;

import org.bouncycastle.jce.provider.BouncyCastleProvider;

import org.bouncycastle.util.encoders.Base64;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.util.DigestUtils;

import javax.crypto.*;

import javax.crypto.spec.IvParameterSpec;

import javax.crypto.spec.SecretKeySpec;

import java.security.*;

import java.util.Arrays;

public class SM4Util {

private static Logger logger = LoggerFactory.getLogger(SM4Util.class);

private static final String PROVIDER_NAME = “BC”;

public static final String ALGORITHM_NAME = “SM4”;

public static final String ALGORITHM_NAME_ECB_PADDING = “SM4/ECB/PKCS5Padding”;

public static final String ALGORITHM_NAME_CBC_PADDING = “SM4/CBC/PKCS5Padding”;

public static final String DEFAULT_KEY = “random_seed”;

public static final int DEFAULT_KEY_SIZE = 128;

private static final int ENCRYPT_MODE = 1;

private static final int DECRYPT_MODE = 2;

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, PROVIDER_NAME);

SecureRandom random = SecureRandom.getInstance(“SHA1PRNG”);

if(null != seed && !””.equals(seed)){

random.setSeed(seed.getBytes());

}

kg.init(keySize, random);

return kg.generateKey().getEncoded();

}

/**

* ecb 加密

* @param key

* @param data

*/

public static byte[] encryptEcbPadding(byte[] key, byte[] data) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {

Cipher cipher = generateEcbCipher(ENCRYPT_MODE, key);

return cipher.doFinal(data);

}

/**

* ecb 解密

* @param key

* @param cipherText

*/

public static byte[] decryptEcbPadding(byte[] key, byte[] cipherText) throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException {

Cipher cipher = generateEcbCipher(DECRYPT_MODE, key);

return cipher.doFinal(cipherText);

}

/**

* cbc 加密

* @param key

* @param data

*/

public static byte[] encryptCbcPadding(byte[] key, byte[] iv, byte[] data) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {

Cipher cipher = generateCbcCipher(ENCRYPT_MODE, key, iv);

return cipher.doFinal(data);

}

public static String encryptCbcPaddingString(byte[] key, byte[] iv, byte[] data) throws InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException {

Cipher cipher = generateCbcCipher(ENCRYPT_MODE, key, iv);

byte[] result = cipher.doFinal(data);

return Base64.toBase64String(result);

}

/**

* cbc 解密

* @param key

* @param iv

* @param cipherText

*/

public static byte[] decryptCbcPadding(byte[] key, byte[] iv, String cipherText) throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidAlgorithmParameterException {

byte[] cipherBytes = Base64.decode(cipherText);

Cipher cipher = generateCbcCipher(DECRYPT_MODE, key, iv);

return cipher.doFinal(cipherBytes);

}

public static byte[] decryptCbcPadding(byte[] key, byte[] iv, byte[] cipherText) throws IllegalBlockSizeException, BadPaddingException, InvalidKeyException, NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidAlgorithmParameterException {

Cipher cipher = generateCbcCipher(DECRYPT_MODE, key, iv);

return cipher.doFinal(cipherText);

}

/**

* ecb cipher

* @param mode

* @param key

* @return

*/

private static Cipher generateEcbCipher(int mode, byte[] key) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException {

Cipher cipher = Cipher.getInstance(ALGORITHM_NAME_ECB_PADDING, PROVIDER_NAME);

Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);

cipher.init(mode, sm4Key);

return cipher;

}

/**

* cbc cipher

* @param mode

* @param key

* @return

*/

private static Cipher generateCbcCipher(int mode, byte[] key, byte[] iv) throws InvalidKeyException, InvalidAlgorithmParameterException, NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException {

Cipher cipher = Cipher.getInstance(ALGORITHM_NAME_CBC_PADDING, PROVIDER_NAME);

Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME);

IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);

cipher.init(mode, sm4Key, ivParameterSpec);

return cipher;

}

/**

* ecb 加密 times 次

* @param data

* @param salt

* @param times

* @return=

*/

public static String encryptEcbDataTimes(String data, String salt, int times) throws GeneralSecurityException {

try {

byte[] key = HexUtil.decodeHex(salt);

byte[] bytes = data.getBytes();

for(int i = 0; i < times; ++i) {

bytes = encryptEcbPadding(key, bytes);

}

data = Base64.toBase64String(bytes);

return data;

} catch (BadPaddingException | IllegalBlockSizeException | NoSuchPaddingException | NoSuchProviderException | NoSuchAlgorithmException | InvalidKeyException var5) {

throw new GeneralSecurityException(“SM4加密失败”);

}

}

/**

* ecb 解密 times 次

* @param data

* @param salt

* @param times

* @return

* @throws GeneralSecurityException

*/

public static String decryptEcbDataTimes(String data, String salt, int times) throws GeneralSecurityException {

try {

byte[] bytes = Base64.decode(data);

byte[] key = HexUtil.decodeHex(salt);

for(int i = 0; i < times; ++i) {

bytes = decryptEcbPadding(key, bytes);

}

data = new String(bytes);

return data;

} catch (BadPaddingException | IllegalBlockSizeException | NoSuchPaddingException | NoSuchProviderException | NoSuchAlgorithmException | InvalidKeyException var5) {

throw new GeneralSecurityException(“SM4解密失败”);

}

}

/**

* cbc 加密 times 次

* @param data

* @param salt

* @param times

* @return=

*/

public static String encryptCbcDataTimes(String data, String salt, int times) {

try {

byte[] iv = generateKey();

byte[] key = generateKey(salt);

byte[] bytes = data.getBytes();

Cipher cipher = generateCbcCipher(ENCRYPT_MODE, key, iv);

for(int i = 0; i < times; ++i) {

bytes = cipher.doFinal(bytes);

}

data = Base64.toBase64String(bytes);

return data;

} catch (Exception e) {

e.printStackTrace();

return null;

}

}

/**

* cbc 解密 times 次

* @param data

* @param salt

* @param times

* @return

* @throws GeneralSecurityException

*/

public static String decryptCbcDataTimes(String data, String salt, int times) throws GeneralSecurityException {

try {

byte[] iv = generateKey();

byte[] bytes = Base64.decode(data);

byte[] key = generateKey(salt);

Cipher cipher = generateCbcCipher(ENCRYPT_MODE, key, iv);

for(int i = 0; i < times; ++i) {

bytes = cipher.doFinal(bytes);

}

data = new String(bytes);

return data;

} catch (BadPaddingException | IllegalBlockSizeException | NoSuchPaddingException | NoSuchProviderException | NoSuchAlgorithmException | InvalidKeyException var5) {

throw new GeneralSecurityException(“SM4解密失败”);

}

}

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/185313.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 谈磁盘列阵 raid0 raid1 raid3 raid5 raid10简介及区别

    谈磁盘列阵 raid0 raid1 raid3 raid5 raid10简介及区别转自:https://www.fengjunzi.com/blog-25108.htmlRAID简介随着服务器在企业的应用越来越广泛,数据安全,数据存储,数据恢复,存储速度等方面对企业用户来说越来越重要,而RAID卡在此过程中起着至关重要的作用,RAID卡本身的性能和特点往往会被一些用户忽视,而服务器厂商为节约成本也会搭配一些比较初级甚至一些小品牌的RAID卡产品,在使用过程中出现问题时用…

    2022年7月15日
  • java protostuff 序列化_使用Protostuff序列化

    java protostuff 序列化_使用Protostuff序列化序rpc调用,有多种序列化的方式,通用如json,mongodb使用的bson;java方面的,比如Java默认的序列化,比如hessian;还有跨语言的,比如thrift、protocolbuf。thrift和pb的好处是序列化后size比较小,但是缺点是得生成java代码,这个挺鸡肋的,所以不管二者运行时效率有多高,开发效率相对比较低的。像hessian,是有一些在用,但是感觉不如pb那样强大…

    2022年5月5日
  • 单片机指令周期_PIC单片机每MHZ多少指令

    单片机指令周期_PIC单片机每MHZ多少指令单片机指令周期传统的经典51单片机有,时钟周期、机器周期、指令周期,意义各不相同,下文做以分析。时钟周期:单片机外接晶振的震荡周期就是时钟周期,时钟周期=晶振震荡周期。例如,外接11.0592MHz的晶振那么时钟周期就是1/11.0592M。机器周期:MCU执行指令所消耗的最小时间单位。51单片机采用精简指令集(多嵌入式微处理器都是RISC,例如常用的ARM,MIPS,POWERPC等),部分指令所消耗的机器周期个数不一样,但必须是机器周期的整倍数。再此基础上,机器周期又划分为6个状态周期,S

    2022年10月13日
  • dpkg命令

    dpkg命令dpkg命令如果ubuntu要安装新软件,已有deb安装包(例如:iptux.deb),但是无法登录到桌面环境。那该怎么安装?答案是:使用dpkg命令。dpkg命令常用格式如下:sudodpkg-Iiptux.deb#查看iptux.deb软件包的详细信息,包括软件名称、版本以及大小等(其中-I等价于–info)sudodpkg-ciptux.deb#查看iptux.

    2022年5月22日
  • opencv之haar特征+AdaBoos分类器算法流程(二)[通俗易懂]

    opencv之haar特征+AdaBoos分类器算法流程(二)

    2022年1月24日
  • 操作系统——银行家算法

    操作系统——银行家算法自从写完第一篇博客,发现写博客也挺好玩的,比平时写word应付作业有趣的多,而且文章在网上还能帮助别人,自己平时也经常看CSDN,这不,老师要求我们实现一下操作系统的银行家算法,所以我就来了!那么,什么是银行家算法呢?如果你很了解请跳过这一段,就是解决死锁问题的一个算法,是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。它以银行借贷系统的分配策略为基础,判…

    2022年7月22日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号