java实现国密SM4加密「建议收藏」

java实现国密SM4加密「建议收藏」前言最近世界政治影响,我国也开始要求算法的使用,以避免来自外国的黑客入侵。我们在使用加密算法时,有必要选择使用国密算法进行加密一、国密SM4是什么? 国密即国家密码局认定的国产密码算法。 主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。 SM1为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。 SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA ECC2.


Jetbrains全系列IDE稳定放心使用


前言

在这里插入图片描述

最近世界政治影响,我国也开始要求算法的使用,以避免来自外国的黑客入侵。我们在使用加密算法时,有必要选择使用国密算法进行加密


一、国密SM4是什么?

	国密即国家密码局认定的国产密码算法。
	
	主要有SM1,SM2,SM3,SM4。密钥长度和分组长度均为128位。
	SM1 为对称加密。其加密强度与AES相当。该算法不公开,调用该算法时,需要通过加密芯片的接口进行调用。
	
	SM2为非对称加密,基于ECC。该算法已公开。由于该算法基于ECC,故其签名速度与秘钥生成速度都快于RSA
	ECC 256位(SM2采用的就是ECC 256位的一种)安全强度比RSA 2048位高,但运算速度快于RSA。
	
	SM3 消息摘要。可以用MD5作为对比理解。该算法已公开。校验结果为256位。
	
	SM4 无线局域网标准的分组数据算法。对称加密,密钥长度和分组长度均为128位。

二、使用步骤

1.引入hutool依赖

Hutool借助Bouncy Castle库可以支持国密算法

<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-all</artifactId>
    <version>5.4.5</version>
</dependency>
<dependency>
    <groupId>org.bouncycastle</groupId>
    <artifactId>bcprov-jdk15on</artifactId>
    <version>1.58</version>
</dependency>

2.示例代码

2.1 使用秘钥

import cn.hutool.crypto.symmetric.SymmetricCrypto;

public class sm4Demo { 
   

    //key必须是16字节,即128位
    final static String key = "sm4demo123456789";

    //指明加密算法和秘钥
    static SymmetricCrypto sm4 = new SymmetricCrypto("SM4/ECB/PKCS5Padding", key.getBytes());

    //加密为16进制,也可以加密成base64/字节数组
    public static String encryptSm4(String plaintext) { 
   
        return sm4.encryptHex(plaintext);
    }

    //解密
    public static String decryptSm4(String ciphertext) { 
   
        return sm4.decryptStr(ciphertext);
    }

    public static void main(String[] args) { 
   
        String content = "hello sm4";
        String plain = encryptSm4(content);
        String cipher = decryptSm4(plain);
        System.out.println(plain + "\n" + cipher);
    }
}

2.2 不使用秘钥

构造SymmetricCrypto 对象时,不传秘钥即可。

SymmetricCrypto sm4 = new SymmetricCrypto("SM4/ECB/PKCS5Padding");

2.3 使用SmUtil快速创建SymmetricCrypto对象

//不带秘钥
SymmetricCrypto sm4 = SmUtil.sm4();

//带秘钥
String key = "1234567812345678";
SymmetricCrypto sm4 = SmUtil.sm4(key.getBytes());

三、API介绍

3.1 加密方法

SymmetricCrypto 类方法 返回类型
encrypt (byte[] data) byte[]
encrypt (String data,Charset charset) byte[]
encryptBase64(byte[] data) String
encrypt(Inputstream data) byte[]
encrypt (String data) byte[]
encrypt (String data,String charset) byte[]
encryptBase64(String data) String
encryptBase64(InputStream data) String
encryptBase64(String data,String charset) String
encryptBase64(String data,Charset charset) String
encryptHex (byte[] data) String
encryptHex (String data) String
encryptHex (Inputstream data) String
encryptHex(String data,string charset) String
encryptHex (String data,Charset charset) String

3.2 解密方法

SymmetricCrypto 类方法 返回类型
decryptstr (String data) String
decryptstr (byte[] bytes,Charset charset) String
decrypt (byte[] bytes)) byte[]
decrypt (String data) byte[]
decryptstr (byte[] bytes) String
decrypt (InputStream data) byte[]
decryptStr (InputStream data) String
decryptstr (String data,Charset charset) String
decryptstr (String data,Charset charset) String

总结

SymmetricCrypto类的构造方法非常灵活,可以灵活根据自己需要的方式进行构造

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

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

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

相关推荐

  • MySQL 之全文索引「建议收藏」

    MySQL 之全文索引「建议收藏」最近在复习数据库索引部分,看到了fulltext,也即全文索引,虽然全文索引在平时的业务中用到的不多,但是感觉它有点儿意思,所以花了点时间研究一下,特此记录。引入概念通过数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。你可能会说,用like…

    2022年6月21日
  • 关于java类加载正确的是_java运行无法加载主类

    关于java类加载正确的是_java运行无法加载主类注意我们当在另一个类中引用其他类的final静态值的时候,编译器把其他类的final符号引用存储在自己类的常量池中了

    2022年8月8日
  • 44h11资料_acwing是什么

    44h11资料_acwing是什么原题链接给定 N 个正整数 A1,A2,…,AN,从中选出若干个数,使它们的和为 M,求有多少种选择方案。输入格式第一行包含两个整数 N 和 M。第二行包含 N 个整数,表示 A1,A2,…,AN。输出格式包含一个整数,表示可选方案数。数据范围1≤N≤100,1≤M≤10000,1≤Ai≤1000输入样例:4 41 1 2 2输出样例:3#include<bits/stdc++.h>using namespace std;const int M = 1e4

    2022年8月8日
  • 利用Java+DOS批处理实现网站刷流量

    利用Java+DOS批处理实现网站刷流量最近开了个小店,木流量更木信誉,虽然东西已经便宜到要低于进价了。在不断向广大亲朋好友推荐的同时,想身为程序猿的我应该要做些什么,于是想到能否编程刷流量,网上一大堆刷流量的软件不敢用,搞不好店就得关门,还是自己解决吧。刷流量需要解决两个题,一是怎样访问算流量;二是怎样获取多个IP来访问,因为大家知道像淘宝这样的大型商城肯定是有各种防刷机制,一个IP肯定刷不了多少,搞不好就被封了,况且一个IP刷只能…

    2022年9月29日
  • IDEA + Groovy脚本一键生成实体类,用法舒服,高效!

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:悲凉的秋风 blog.csdn.net/qq_34371461/article/details/8057128…

    2021年6月27日
  • 如何求平均数众数中位数_离散系数

    如何求平均数众数中位数_离散系数平均数、中位数、众数,在分析中如何使用?01平均值的种类02平均数、中位数还是众数?03全距和数值分布01平均值的种类请检查下面的陈述:1、一个快速致富的方法就是做一名职业橄榄球员,2015年美国国家橄榄球联盟球星的平均收入是220万美元。2.、为在大学里取得好成绩,学生需要付出的努力越来越少了。根据最近一项调查,大学生每周平均花在学习上的时间是12.8小时,和20年前大学生的学习时长相比,前者大概只有后者的一半。两个例子当中都使用了“平均”这个词,但是实际上有三种不同的方法来测定平

    2022年9月17日

发表回复

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

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