JAVA 使用国密 SM4 加解密

news/2025/12/8 15:25:51/文章来源:https://www.cnblogs.com/aerfazhe/p/19320090

SM4算法

百度百科

中华人民共和国政府采用的分组密码标准
SM4.0(原名SMS4.0)是中华人民共和国国家密码管理局于2012年3月21日发布的分组密码标准,对应行业标准为GM/T 0002-2012,采用128位分组长度和128位密钥结构,加密过程基于32轮非线性迭代,并配置固定8比特输入8比特输出的S盒,主要应用于商用数据加密领域

在密码学领域,国密算法 SM4 是我国自主研发的分组对称加密算法,凭借 128 位分组长度、128 位密钥长度的设计,在金融、政务、物联网等领域广泛应用。但分组密码本身仅能处理固定长度(SM4 为 128 位)的明文数据,而现实中需要加密的文件、数据流、存储块等往往是任意长度的。为解决这一问题,“工作模式” 应运而生 —— 它相当于分组密码的 “应用框架”,定义了如何将固定长度的分组加密逻辑扩展到任意长度数据,同时兼顾安全性、性能与实际场景需求。SM4 的 8 种主流工作模式:ECB、CBC、CFB、OFB、CTR、GCM、CCM 与 XTS

本文简单介绍SM4以下常用的加解密模式

  • ECB模式(电子密码本):工作原理:将明文分成固定长度的块(如SM4的16字节),每个块独立加密,互不影响。相同明文块会生成相同的密文块
    • 优点:ECB模块可以并行处理数据。
    • 缺点:同样原文生成同样的密文,并不能很好地保护数据。
    • 安全性:存在致命缺陷 —— 相同明文分组会生成相同密文分组。例如用 ECB 加密图片,若图片中有重复像素块(如背景),密文会呈现明显的 “块重复”,攻击者可通过统计分析还原明文结构,甚至篡改单个密文块(对应明文块也会被篡改,不影响其他块);
    • 适用场景:仅用于加密 “短且唯一” 的数据(如密钥封装、固定标识),绝对禁止用于文件、数据流等大数据加密。
  • CBC模式(密码分组链接模式):工作原理:通过 “链式关联” 解决 ECB 的关联性问题:
    1. 明文分组按 128 位拆分,最后一块补全;
    2. 第一个明文分组与 “初始化向量(IV)” 进行异或运算,再用 SM4 加密得到第一个密文分组;
    3. 后续每个明文分组先与前一个密文分组异或,再加密,形成 “前密文影响后明文” 的链式结构。
  • CBC模式特点和应用
    • 安全性:相同明文分组因 “前密文异或” 的干扰,会生成不同密文,抵御统计分析攻击;但密文块被篡改后,会影响后续所有明文块的解密(链式传播);
    • 性能:加密无法并行(需等待前一个密文块),解密可并行(已知密文块即可独立解密,再与前一个密文块异或);
    • IV要求:需随机生成且唯一(无需保密),若 IV 重复,相同明文会生成相同密文;
    • 适用场景:文件加密、早期 SSL/TLS 协议(如 TLS 1.0)、IPsec VPN,适合对并行性要求不高的场景。
  • CFB模式:将分组密码转化为流密码

其余工作模式可参考博客:https://blog.csdn.net/openHiTLS/article/details/151288800

以下使用Bouncy Castle 开源加密库进行加解密

<!-- Maven 方式 -->
<!--  Bouncy Castle 开源加密库      -->
<dependency><groupId>org.bouncycastle</groupId><artifactId>bcprov-jdk15on</artifactId><version>1.70</version>
</dependency><!-- Gradle 方式 -->
implementation 'org.bouncycastle:bcprov-jdk15on:1.70'

ECB模式

SM4Utils
 package com.isoftstone.cascade02.utils;import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Base64;/*** @Author:wk* @Slogan:无论风雨,和自己一决胜负吧* @Create:2025/12/5/18:16* @Description:SM4算法 ECB 模式* @Version:1.0*/
public class SM4Utils {public final static String KEY = "4c73aae48f4d5edba3a365837904dbc8";private static final String ALGORITHM = "SM4";private static final String TRANSFORM  = "SM4/ECB/PKCS5Padding";static {Security.addProvider(new BouncyCastleProvider());}/** 生成 128-bit(16 字节)SM4 密钥,返回 Base64 字符串 *//*public static String generateKey() throws Exception {KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM, "BC");kg.init(128, new SecureRandom());byte[] keyBytes = kg.generateKey().getEncoded();return Base64.getEncoder().encodeToString(keyBytes);}*//** 生成UUID随机数,作为16进制密钥 */public static String generateKey() throws Exception {return CommonUtils.getUUID();
//        byte[] keyBytes = kg.generateKey().getEncoded();
//        return Base64.getEncoder().encodeToString(keyBytes);}/** 加密:明文 + Base64 密钥 → Base64 密文 */public static String encrypt(String plainText, String base64Key) {String encrypt = "";try {byte[] key = Hex.decodeHex(base64Key);
//        byte[] key = Base64.getDecoder().decode(base64Key);SecretKeySpec keySpec = new SecretKeySpec(key, ALGORITHM);Cipher cipher = Cipher.getInstance(TRANSFORM, "BC");cipher.init(Cipher.ENCRYPT_MODE, keySpec);byte[] encrypted = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));encrypt = Base64.getEncoder().encodeToString(encrypted);} catch (DecoderException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchProviderException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return encrypt;}/** 解密:Base64 密文 + Base64 密钥 → 明文 */public static String decrypt(String base64Cipher, String base64Key) {String decrypt = "";try {byte[] key = Hex.decodeHex(base64Key);
//        byte[] key = Base64.getDecoder().decode(base64Key);SecretKeySpec keySpec = new SecretKeySpec(key, ALGORITHM);Cipher cipher = Cipher.getInstance(TRANSFORM, "BC");cipher.init(Cipher.DECRYPT_MODE, keySpec);byte[] decrypted = cipher.doFinal(Base64.getDecoder().decode(base64Cipher));decrypt = new String(decrypted, StandardCharsets.UTF_8);} catch (DecoderException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchProviderException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return decrypt;}/* ------ 简单测试 ------ */public static void main(String[] args) throws Exception {String plain = "你好,国密 SM4!";String key  = generateKey();String cipher = encrypt(plain, key);String result = decrypt(cipher, key);System.out.println("密钥 :" + key);System.out.println("密钥 :" + KEY);System.out.println("明文 :" + plain);System.out.println("密文 :" + cipher);System.out.println("解密 :" + result);}}

CBC模式

SM4IVUtils
package com.isoftstone.cascade02.utils;import org.apache.commons.codec.DecoderException;
import org.apache.commons.codec.binary.Hex;
import org.bouncycastle.jce.provider.BouncyCastleProvider;import javax.crypto.*;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
import java.nio.charset.StandardCharsets;
import java.security.*;
import java.util.Base64;/*** @Author:wk* @Slogan:无论风雨,和自己一决胜负吧* @Create:2025/12/5/18:16* @Description:SM4 IV 算法* @Version:1.0*/
public class SM4IVUtils {public final static String KEY = "4c73aae48f4d5edba3a365837904dbc8";private static final String ALGORITHM = "SM4";private static final String TRANSFORM  = "SM4/CBC/PKCS5Padding";static {Security.addProvider(new BouncyCastleProvider());}/** 生成 128-bit(16 字节)SM4 密钥,返回 Base64 字符串 *//*public static String generateKey() throws Exception {KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM, "BC");kg.init(128, new SecureRandom());byte[] keyBytes = kg.generateKey().getEncoded();return Base64.getEncoder().encodeToString(keyBytes);}*//** 生成UUID随机数,作为16进制密钥 */public static String generateKey() throws Exception {return CommonUtils.getUUID();}/** 生成 16 字节 IV */public static byte[] generateIV() {byte[] iv = new byte[16];new SecureRandom().nextBytes(iv);return iv;}/** 加密:返回 “Base64(IV) : Base64(密文)” 的拼接字符串 */public static String encrypt(String plainText, String base64Key){String encrypt = "";try {byte[] key = Hex.decodeHex(base64Key);
//        byte[] key = Base64.getDecoder().decode(base64Key);SecretKeySpec keySpec = new SecretKeySpec(key, ALGORITHM);byte[] iv  = generateIV();IvParameterSpec ivSpec = new IvParameterSpec(iv);Cipher cipher = Cipher.getInstance(TRANSFORM, "BC");cipher.init(Cipher.ENCRYPT_MODE, keySpec, ivSpec);byte[] cipherBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8));// 把 IV 和密文一起发出去String ivBase64     = Base64.getEncoder().encodeToString(iv);String cipherBase64 = Base64.getEncoder().encodeToString(cipherBytes);encrypt = ivBase64 + ":" + cipherBase64;} catch (DecoderException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchProviderException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (InvalidAlgorithmParameterException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return encrypt;}/** 解密:传入 “Base64(IV) : Base64(密文)” 的拼接字符串 */public static String decrypt(String pack, String base64Key) {String decrypt = "";try {String[] parts = pack.split(":");if (parts.length != 2) throw new IllegalArgumentException("数据格式错误");byte[] key = Hex.decodeHex(base64Key);
//        byte[] key = Base64.getDecoder().decode(base64Key);SecretKeySpec keySpec = new SecretKeySpec(key, ALGORITHM);byte[] iv  = Base64.getDecoder().decode(parts[0]);byte[] cipherBytes = Base64.getDecoder().decode(parts[1]);Cipher cipher = Cipher.getInstance(TRANSFORM, "BC");cipher.init(Cipher.DECRYPT_MODE, keySpec, new IvParameterSpec(iv));byte[] plainBytes = cipher.doFinal(cipherBytes);decrypt = new String(plainBytes, StandardCharsets.UTF_8);} catch (DecoderException e) {e.printStackTrace();} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (NoSuchProviderException e) {e.printStackTrace();} catch (NoSuchPaddingException e) {e.printStackTrace();} catch (InvalidKeyException e) {e.printStackTrace();} catch (InvalidAlgorithmParameterException e) {e.printStackTrace();} catch (IllegalBlockSizeException e) {e.printStackTrace();} catch (BadPaddingException e) {e.printStackTrace();}return decrypt;}/* ------ 测试 ------ */public static void main(String[] args) throws Exception {String plain = "你好,国密 SM4-CBC!";String key   = generateKey();   // 复用上一篇的生成方法String pack  = encrypt(plain, KEY);String ret   = decrypt(pack, KEY);System.out.println("密钥 :" + KEY);System.out.println("明文 :" + plain);System.out.println("包   :" + pack);System.out.println("解密 :" + ret);}
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/992985.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海豚调度(DolphinScheduler_3.3.2)+ Datax_3.0 + SeaTunnel_2.3.12 + DEMO演示

海豚调度(DolphinScheduler_3.3.2)+ Datax_3.0 + SeaTunnel_2.3.12 + DEMO演示一、海豚调度(DolphinScheduler_3.3.2)的使用DAG --有向无环图,有顺序,但是不会形成环的图表。 海豚调度的API接口:http://YOURID:12…

2025年专业 GEO 公司排名前十:独家榜单深度揭秘

2025年专业 GEO 公司排名前十:独家榜单深度揭秘在AI重塑信息检索逻辑的当下,越来越多企业将目光投向生成式引擎优化,以期在AI答案中赢得先机。然而,当用户试图甄选专业GEO公司时,往往陷入多重焦虑:95%的品牌在AI…

2025年性价比高的 GEO 公司有哪些?:十大精选报告推荐

2025年性价比高的 GEO 公司有哪些?:十大精选报告推荐在AI搜索加速替代传统流量入口的当下,越来越多企业将目光投向GEO优化,以期在生成式引擎的答案生态中抢占品牌露出先机。然而,面对市场上琳琅满目的服务商,许多…

阿里云ESA实测效果

实测下来,阿里云ESA在亚太地区的表现很实在。对国内业务来说,它最大的优点是支持CNAME接入,能轻松搞定国内外流量的精细拆分,这点比Cloudflare免费版灵活。再加上国内有大量节点,实测延迟能稳在200ms内,比从海外…

2025年终盘点:有机肥生产设备厂家综合能力推荐榜

随着2025年我国绿色农业战略的深入推进,有机肥行业迎来千亿级市场爆发期,而设备的品质直接决定着有机肥生产的效率、环保性与成品质量。为帮助有机肥生产企业精准选型,本次盘点基于EEAT(经验、专业性、权威性、可信…

诚信的高考志愿填报指导公司TOP5权威推荐:深度测评帮你选对

高考志愿填报作为连接寒窗苦读与理想大学的关键桥梁,其专业性与科学性直接影响考生的未来发展轨迹。2024年教育咨询行业报告显示,高考志愿填报指导市场规模突破60亿元,年增速达38%,但35%的投诉集中在虚假宣传方案脱…

链表:头插法与尾插法 - Higurashi

一、头插法 定义:头插法是指在链表头部进行节点插入的方法。其核心特点是,新插入的节点总成为链表的第一个有效节点。因此,如果按数据1, 2, 3的顺序进行头插操作,最终链表的节点排列顺序将是3, 2, 1。简而言之,头…

2025年十大液压站厂家排行榜,液压站标准件厂家与定制生产服

为帮工业企业高效锁定适配润滑液压需求的合作伙伴,避免选型走弯路,我们从技术转化能力(如国际技术引进适配性、定制化开发实力)、产品品质可靠性(含ISO9001认证、极端工况适配性)、全周期服务覆盖(从方案设计到…

北京翻译服务公司选型决策:2025年12月北京优质翻译服务公司综合实力解析

在首都北京这座国际化程度极高的城市,企业全球化布局、国际学术交流以及多元文化互动等活动愈发频繁,专业且精准的翻译服务已然成为连接世界的关键纽带。面对市场上琳琅满目的翻译机构,如何精准甄别出真正专业可靠、…

机械制造企业高性价比磨床评测:上海佑台如何平衡品质与成本

机械制造企业高性价比磨床评测:上海佑台如何平衡品质与成本一、用户痛点:机械制造企业亟需高性价比磨床对于机械制造行业企业而言,磨床是金属加工环节的关键设备,直接影响零件的精度与生产效率。但市场上磨床产品鱼…

2025上海商业场所保洁优质品牌推荐指南

2025上海商业场所保洁优质品牌推荐指南根据《2025中国商业保洁行业发展白皮书》(以下简称《白皮书》)数据,2025年国内商业场所保洁市场规模达468亿元,预计2025年将以8.2%的年增速增至507亿元。驱动这一增长的核心因…

百奈子产品耐用吗?用户群体解析TOP5榜单:中国国货眼部抗衰

近年来,眼部抗衰护肤市场规模持续扩张,2024年数据显示其年增速达32%,但消费者投诉中35%聚焦产品耐用性、适配性等核心问题——例如部分眼周产品因成分不稳定导致效果衰减,或因肤质适配偏差引发敏感。在国货美妆崛起…

2025年最新快充/重卡/商用/电动车/新能源充电桩厂家 TOP5 推荐:技术落地 + 全域服务的实力之选

随着新能源汽车渗透率突破 45%,充电桩行业已从 “数量填补” 迈入 “质量竞争” 深水区。家庭用户看重安全性价比,运营商聚焦县域下沉与运维效率,商用车领域则急需大功率补能方案。基于全国 100 余座城市实地调研、…

2025年宁波高精度地磅厂家推荐,智能地磅厂家哪家靠谱?十大

在工业称重、物流仓储、市政交通等领域,地磅作为核心计量设备,其精度、稳定性与智能化水平直接影响企业运营效率与成本控制。面对市场上良莠不齐的地磅供应商,如何选择靠谱的厂家?以下结合产品性能、技术实力、服务…

2025年数字人厂商哪家好?哪家性价比更高?TOP10深度解析与推荐

2025年数字人厂商哪家好?哪家性价比更高?TOP10深度解析与推荐在数字化表达日益成为商业与个人竞争力的核心要素之际,越来越多用户与机构涌向数字人赛道,却在选型路上陷入多重焦虑:市面厂商林立,口碑与实力信息真…

jenkins 通过ssh配置 将java应用程序部署到远程服务器

背景,近期在测试服务器上安装了jenkins,经常在编译项目的时候,导致服务器宕机,经排查发现,jenkins编译项目需要占用大量的cpu资源 由于测试服务器已经运行了大量的服务,以及软件,所以每次打包都会导致服务器经常宕机,在…

CVE-2025-11778:Circutor PLC设备中危及内存的堆栈缓冲区溢出漏洞深度解析

本文详细分析了CVE-2025-11778高危漏洞,该漏洞影响Circutor SGE-PLC1000/SGE-PLC50设备的TACACS+实现,攻击者可远程通过‘read_packet()’函数触发内存破坏。文章提供了漏洞概述、影响产品、CVSS评分及缓解方案。CVE…

selenium常用界面交互操作

浏览器操作 浏览器显示范围 窗口最大化: driver.maximize_window()设置窗口大小: dirver.set_window_size(width, height)设置窗口位置: dirver.set_window_position(x, y)浏览器显示页面操作 页面后退操作: drive…

大屏适缩放

大屏适缩放<template><div class="screen-adapter"><div class="big-screen-page"><div class="header-box"><div class="meteorology-box">晴…

某中心ICASSP 2022五十余篇论文技术概览

本文概述了某研究机构在ICASSP 2022会议上发表的超过50篇论文,涵盖自动语音识别、信号处理、计算机视觉、联邦学习等多个前沿技术领域,展示了在声学事件检测、个性化建模、多模态学习等方面的最新研究成果。某中心IC…