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)
上一篇 2022年10月6日 下午2:36
下一篇 2022年10月6日 下午2:46


相关推荐

  • MODIS数据wget下载[通俗易懂]

    MODIS数据wget下载[通俗易懂]运行/cmdwget.exe放在E:\DATA\MODIS\MCD12Q1目录下。wget-erobots=off-m-np-R.html,.tmp-nH–cut-dirs=3“https://ladsweb.modaps.eosdis.nasa.gov/archive/orders/501504344/”–header“Authorization:Bearera2ltaHl1bmpvb25nOmEybHRhSGwxYm1wdmIyNW5NakpBWjIxaGFXd3VZ

    2022年5月29日
    52
  • 京东猪脸识别比赛

    京东猪脸识别比赛最近参加京东的猪脸识别比赛,训练集是30个视频-需要数据集的朋友可以加qq:571082793

    2022年6月21日
    41
  • 数学函数图像处理_matlab基本图像处理

    数学函数图像处理_matlab基本图像处理文章目录1.imdilate2.imresize3.imfinfo4.imcomplement总结1.imdilate功能:进行膨胀操作介绍用法:IM2=imdilate(IM,SE)对灰度图像或二值图像IM进行膨胀操作,返回结果图像IM2。SE为由strel函数生成的结构元素对象。IM2=imdilate(IM,NHOOD)对灰度图像或二值图像IM进行膨胀操作,返回结果图像IM2。参量NHOOD是一个由O和1组成的矩阵,指定邻域。IM2=imdilate(…,SHAPE)对图

    2022年10月5日
    5
  • 即梦新升级了一个扶持计划,要让AI创作者不再“为爱发电”

    即梦新升级了一个扶持计划,要让AI创作者不再“为爱发电”

    2026年3月12日
    2
  • 与、或、非、与非、或非、异或、同或

    与、或、非、与非、或非、异或、同或首先把中文意思和英文简写一一作出对应 与 and 或 or

    2026年3月18日
    2
  • 备忘录模式实例_iphone语音备忘录无法分享

    备忘录模式实例_iphone语音备忘录无法分享备忘录模式 Motivation动机模式定义实例结构要点总结笔记动机在软件构建过程中,某些对象的状态在转换过程中,可能由于某种需要,要求程序能够回溯对象之前处于某个点时的状态.如果使用一些共有接口来让其他对象得到对象的状态,便会暴露对象的实现细节.如何实现对象状态的良好保存与回复?但同时又不会因此而破坏对象的封装性模式定义在不破坏封装性的前提下.捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可以将该对象恢复到原先保存的状态实例朴素class Memento{ stri

    2022年8月11日
    7

发表回复

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

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