JAVA 使用国密 SM4 加解密 📅 2026/7/1 2:49:39 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 的关联性问题明文分组按 128 位拆分最后一块补全第一个明文分组与 “初始化向量IV” 进行异或运算再用 SM4 加密得到第一个密文分组后续每个明文分组先与前一个密文分组异或再加密形成 “前密文影响后明文” 的链式结构。CBC模式特点和应用安全性相同明文分组因 “前密文异或” 的干扰会生成不同密文抵御统计分析攻击但密文块被篡改后会影响后续所有明文块的解密链式传播性能加密无法并行需等待前一个密文块解密可并行已知密文块即可独立解密再与前一个密文块异或IV要求需随机生成且唯一无需保密若 IV 重复相同明文会生成相同密文适用场景文件加密、早期 SSL/TLS 协议如 TLS 1.0、IPsec VPN适合对并行性要求不高的场景。CFB模式将分组密码转化为流密码其余工作模式可参考博客https://blog.csdn.net/openHiTLS/article/details/151288800以下使用Bouncy Castle 开源加密库进行加解密!-- Maven 方式 --!-- Bouncy Castle 开源加密库 --dependencygroupIdorg.bouncycastle/groupIdartifactIdbcprov-jdk15on/artifactIdversion1.70/version/dependency!-- Gradle 方式 --implementation org.bouncycastle:bcprov-jdk15on:1.70