国密sm4加密算法

国密sm4加密算法国密sm4加解密算法工具类,可用于生产环境packagecom.example.demo.endecryption.utils;importorg.apache.commons.codec.binary.Base64;importorg.bouncycastle.jce.provider.BouncyCastleProvider;importjavax.crypto.BadPa…

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

Jetbrains全系列IDE稳定放心使用

国密sm4加解密算法工具类,可用于生产环境
package com.example.demo.endecryption.utils;
import org.apache.commons.codec.binary.Base64;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.Charset;
import java.security.InvalidKeyException;
import java.security.Security;
/** * 国密sm4加解密 */
public class Sm4Util { 

public enum Algorithm { 

SM4("SM4","SM4","key长度:16 byte");
private String keyAlgorithm;
private String transformation;
private String description;//描述
Algorithm(String keyAlgorithm, String transformation, String description) { 

this.keyAlgorithm = keyAlgorithm;
this.transformation = transformation;
this.description = description;
}
public String getKeyAlgorithm() { 

return this.keyAlgorithm;
}
public String getTransformation() { 

return this.transformation;
}
public String getDescription() { 

return this.description;
}
}
private static final String PROVIDER_NAME = "BC";//BouncyCastleProvider的名字
static { 

Security.addProvider(new BouncyCastleProvider());
}
/** * 自定字符串产生密钥 * @param algorithm 加解密算法 * @param keyStr 密钥字符串 * @param charset 编码字符集 * @return 密钥 */
public static SecretKey genKeyByStr(Algorithm algorithm, String keyStr, Charset charset) { 

return readKeyFromBytes(algorithm, keyStr.getBytes(charset));
}
/** * 根据指定字节数组产生密钥 * @param algorithm 加解密算法 * @param keyBytes 密钥字节数组 * @return 密钥 */
public static SecretKey readKeyFromBytes(Sm4Util.Algorithm algorithm, byte[] keyBytes) { 

return new SecretKeySpec(keyBytes, algorithm.getKeyAlgorithm());
}
/****************************加密*********************************/
/** * 加密字符串,并进行base64编码 * @param algorithm 加解密算法 * @param key 密钥 * @param data 明文 * @param charset 编码字符集 * @return 密文 * @throws InvalidKeyException 密钥错误 */
public static String encryptBase64(Sm4Util.Algorithm algorithm, SecretKey key, String data, Charset charset) throws InvalidKeyException { 

return Base64.encodeBase64String(encrypt(algorithm, key, data.getBytes(charset)));
}
/** * 加密字节数组 * @param algorithm 加解密算法 * @param key 密钥 * @param data 明文 * @return 密文 * @throws InvalidKeyException 密钥错误 */
public static byte[] encrypt(Sm4Util.Algorithm algorithm, SecretKey key, byte[] data) throws InvalidKeyException { 

try { 

return cipherDoFinal(algorithm, Cipher.ENCRYPT_MODE, key, data);
} catch (BadPaddingException e) { 

throw new RuntimeException(e);//明文没有具体格式要求,不会出错。所以这个异常不需要外部捕获。
}
}
/** * 加解密字节数组 * @param algorithm 加解密算法 * @param opmode 操作:1加密,2解密 * @param key 密钥 * @param data 数据 * @throws InvalidKeyException 密钥错误 * @throws BadPaddingException 解密密文错误(加密模式没有) */
private static byte[] cipherDoFinal(Sm4Util.Algorithm algorithm, int opmode, SecretKey key, byte[] data) throws InvalidKeyException, BadPaddingException { 

Cipher cipher;
try { 

cipher = Cipher.getInstance(algorithm.getTransformation(), PROVIDER_NAME);
} catch (Exception e) { 

//NoSuchAlgorithmException:加密算法名是本工具类提供的,如果错了业务没有办法处理。所以这个异常不需要外部捕获。
//NoSuchProviderException:Provider是本工具类提供的,如果错了业务没有办法处理。所以这个异常不需要外部捕获。
//NoSuchPaddingException:没有特定的填充机制,与环境有关,业务没有办法处理。所以这个异常不需要外部捕获。
throw new RuntimeException(e);
}
cipher.init(opmode, key);
try { 

return cipher.doFinal(data);
} catch (IllegalBlockSizeException e) { 

throw new RuntimeException(e);//业务不需要将数据分块(好像由底层处理了),如果错了业务没有办法处理。所以这个异常不需要外部捕获。
}
}
/****************************解密*********************************/
/** * 对字符串先进行base64解码,再解密 * @param algorithm 加解密算法 * @param key 密钥 * @param data 密文 * @param charset 编码字符集 * @return 明文 * @throws InvalidKeyException 密钥错误 * @throws BadPaddingException 密文错误 */
public static String decryptBase64(Sm4Util.Algorithm algorithm, SecretKey key, String data, Charset charset)
throws InvalidKeyException, BadPaddingException { 

return new String(decrypt(algorithm, key, Base64.decodeBase64(data)), charset);
}
/** * 解密字节数组 * @param algorithm 加解密算法 * @param key 密钥 * @param data 密文 * @return 明文 * @throws InvalidKeyException 密钥错误 * @throws BadPaddingException 密文错误 */
public static byte[] decrypt(Sm4Util.Algorithm algorithm, SecretKey key, byte[] data) throws InvalidKeyException, BadPaddingException { 

return cipherDoFinal(algorithm, Cipher.DECRYPT_MODE, key, data);
}
}
测试
 /** * 国密sm4加解密 */
@Test
public void sm4Test() throws InvalidKeyException, BadPaddingException { 

Sm4Util .Algorithm algorithm = SymEncUtil.Algorithm.SM4;
//16位密钥字符串
String encryptKey = "0123456789ABCDEF";
//编码格式
Charset encryptCharset = StandardCharsets.UTF_8;
//生产密钥
SecretKey key = Sm4Util .genKeyByStr(algorithm, encryptKey, encryptCharset);
//加密
String encryptBase64 = Sm4Util .encryptBase64(algorithm, key, "123456", encryptCharset);
System.out.println("encryptBase64 = " + encryptBase64);//encryptBase64=QtrH8m/aR9x/cySEoUb+Nw==
//解密
String decryptBase64 = Sm4Util .decryptBase64(algorithm, key, "QtrH8m/aR9x/cySEoUb+Nw==", encryptCharset);
System.out.println("decryptBase64 = " + decryptBase64);
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/185499.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • viewpager嵌套viewpager

    viewpager嵌套viewpagerviewpager嵌套viewpager要求:外层不可以滑动,内层可以滑动实现:重写外层的viewpager的2个方法即可publicclassNoScrollViewPagerextendsViewPager{publicNoScrollViewPager(Contextcontext){super(context);}public

  • java中的jQuery与Ajax的应用,菜鸟教程

    一、简介   1. Ajax,并不是指一种单一的技术,而是有机的利用了一系列交互式网页应用相关的技术所形成的结合体。Ajax揭开了无刷新更新页面的新时代,并有代替系统的Web方式和通过隐藏的框架来进行异步提交的趋势,是Web开发应用的一个里程碑。Ajax全称(AsynchronousJavaScriptandXML),即异步JavaScript和XML。实现客户端异步请求操作,不刷新整个…

  • Java分页显示(旅游线路)

    Java分页显示(旅游线路)

    2021年11月11日
  • android之Activity.startManagingCursor方法详解

    在使用数据库操作查询数据后,如果是在Activity里面处理,那么很可能就会用到startManagingCursor()方法,在这里讲一下它的作用和使用注意事项.调用这个方法,就是将获得的Cursor对象交与Activity 来管理,这样Cursor对象的生命周期便能与当前的Activity自动同步,省去了自己管理Cursor。看下文档里的注释This method allows

  • Enterprise Library5.0 配置Log时差问题

    Enterprise Library5.0 配置Log时差问题最近使用EnterpriseLibrary5.0配置Log日志时候出现的默认时间与本地系统时间不一致。默认时间为格里尼治时间,在一个log中出现两个时间会让人迷惑,这个事件到底是什么时候发生的呢?经过小弟我一上午多次尝试后,总算是解决了这个问题。解决方法:在LogMessageFormatters->Template->将Timestamp:{timestamp}{newline}

    2022年10月20日
  • 使用tcping命令ping指定端口「建议收藏」

    使用tcping命令ping指定端口「建议收藏」ping是简单的测试网络连接情况的小工具,对于一般用户很实用,但是ping有个缺点就是,不能指定端口,同时如果源地址禁ping的话,ping命令就形同虚设。——前言tcping命令是针对tcp监控的,也可以看到ping值,即使源地址禁ping也可以通过tcping来监控服务器网络状态,除了简单的ping之外,tcping最大的一个特点就是可以指定监控的端口。tcping命令使用方法很简单下载

发表回复

您的电子邮箱地址不会被公开。

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