首页 > 编程语言 >Java SM4 工具类,依赖bcprov-jdk15on

Java SM4 工具类,依赖bcprov-jdk15on

时间:2024-02-24 17:12:22浏览次数:28  
标签:Java SM4 iv static key input byte jdk15on

Java实现SM4国密加解密,依赖bcprov-jdk15on.jar

<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.70</version>
</dependency>
/**
 * @author EvanY
 * @since 2021/11/30
 */
public class SM4Utils {
    public static final String SM4_ECB_PKCS7 = "SM4/ECB/PKCS7Padding";
    public static final String SM4_CBC_PKCS7 = "SM4/CBC/PKCS7Padding";
    public static final String PROVIDER_BC = "BC";


    public static byte[] encryptWithSM4(byte[] key, byte[] iv, byte[] input) throws Exception {
        return cryptWithSM4(key, iv, input, Cipher.ENCRYPT_MODE, SM4_CBC_PKCS7, PROVIDER_BC);
    }

    public static byte[] encryptWithSM4(byte[] key, byte[] iv, byte[] input, String algorithm, String provider) throws Exception {
        return cryptWithSM4(key, iv, input, Cipher.ENCRYPT_MODE, algorithm, provider);
    }

    public static byte[] decryptWithSM4(byte[] key, byte[] iv, byte[] input) throws Exception {
        return cryptWithSM4(key, iv, input, Cipher.DECRYPT_MODE, SM4_CBC_PKCS7, PROVIDER_BC);
    }

    public static byte[] decryptWithSM4(byte[] key, byte[] iv, byte[] input, String algorithm, String provider) throws Exception {
        return cryptWithSM4(key, iv, input, Cipher.DECRYPT_MODE, algorithm, provider);
    }

    public static byte[] cryptWithSM4(byte[] key, byte[] iv, byte[] input, int mode, String algorithm, String provider) throws Exception {
        SecretKeySpec spec = new SecretKeySpec(key, "SM4");
        Cipher cipher;
        if (provider == null || provider.isEmpty()) {
            cipher = Cipher.getInstance(algorithm);
        } else {
            cipher = Cipher.getInstance(algorithm, provider);
        }
        if (iv == null || iv.length == 0) {
            cipher.init(mode, spec);
        } else {
            IvParameterSpec ivParameterSpec = new IvParameterSpec(iv);
            cipher.init(mode, spec, ivParameterSpec);
        }
        return cipher.doFinal(input);
    }

    static {
        if (Security.getProvider("BC") == null) {
            Security.addProvider(new BouncyCastleProvider());
        }
    }
}

标签:Java,SM4,iv,static,key,input,byte,jdk15on
From: https://www.cnblogs.com/yy299/p/18031278

相关文章

  • Java基础05:类型转换
    类型转换1.由于Java是强类型语言,所以要进行有些运算的时候,需要用到类型转换低------------------------------------------------->高byte,short,char--->int--->long--->float--->double强制转换:由高类型转换到低类型  自动......
  • Java RSA 加解密工具类,直接用
    importorg.junit.Test;importjavax.crypto.Cipher;importjavax.crypto.NoSuchPaddingException;importjava.io.ByteArrayOutputStream;importjava.nio.charset.Charset;importjava.nio.charset.StandardCharsets;importjava.security.*;importjava.security.i......
  • Java_6 函数
    title:(在线学习平台)link:(https://www.acwing.com/)cover:(https://cdn.acwing.com/media/activity/surface/log.png)1函数基础一个典型的函数定义包括以下部分:修饰符、返回类型、函数名字、由0个或多个形参组成的列表以及函数体。1.1编写函数我们来编写一个求阶乘的......
  • java异常
    java异常异常分类Throwable是所有异常子类的超类exception子类:编译器异常,进行编译,java程序出现问题error子类:错误,必须修改源代码产生过程JVM判断异常,并产生包含异常信息的对象,如果异常产生的方法没有try--catch方法,如果没有则把异常对象返回main方法main方法也判......
  • Java锁的思想和区别
    乐观锁VS悲观锁乐观锁和悲观锁是两种处理并发访问的不同策略,用于确保多个操作不会同时修改同一资源而导致数据不一致的问题。它们的区别在于处理并发时的思想和实现方式:乐观锁:思想:认为在大多数情况下,读操作远远多于写操作,因此假设在绝大多数情况下并发冲突是不会发生的,直到出......
  • Javascript/DOM:如何删除 DOM 对象的所有事件侦听器
    Javascript/DOM:如何删除DOM对象的所有事件侦听器一、重写重写EventTarget添加监听事件方法addEventListenerif(EventTarget.prototype.original_addEventListener==null){EventTarget.prototype.original_addEventListener=EventTarget.prototype.addEventList......
  • Java语法之HelloWorld!
    HelloWorld入门随便新建一个文件夹(coed),存放代码新建一个Java文件文件后缀名为.JavaHello.java编写代码publicclassHello{ publicstaticvoidmain(String[]args){ System.out.print("Hello,World!"); }}编译javacjava文件,会生成一个class文件运......
  • 什么是Java中的SPI机制
    SPI,全称ServiceProviderInterface,是Java中提供的一种服务发现机制它允许应用程序动态地加载和使用第三方提供的服务实现,而无需在代码中引用这些实现类。JavaSPI是基于接口编程思想的具体体现,通过将服务接口和其实现分离,从而具备更好的可扩展性和可维护性如何定义一个Java......
  • Java事件侦听器学习记录
    前言我们监听事件之前要有事件源source,创建事件源(Event),发布事件(publishEvent),然后才能到监听事件。事件驱动机制是观察者模式(称发布订阅)具体实现,事件对象(Event)相当于被观察对象(Subject),事件监听(EventListener)相当于观察者(Observer)1、包结构(个人): 2、创建事件源(Event)......
  • java面向对象之封装-抽象-继承-组合-多态五种概念一网打尽
    说明曾经在学习java面向对象时,你是否会为面向对象的封装-继承-抽象-多态-组合等各种概念搞得稀里糊涂,乃至反复阅读,背诵其相关概念,结果一段时间过后又还给了时间。。。这种经历简直令人发指,让人无法忍受,难道就没有哪个地方能把它一次说清楚,老百姓看了以后纷纷醍醐灌顶,不再重蹈覆......