当前位置: 首页 > article >正文

国密SM4算法在Web与Java应用中的跨平台加解密实战

1. 国密SM4算法简介与应用场景国密SM4算法是我国自主设计的分组对称加密算法于2012年成为国家密码行业标准GM/T 0002-2012。作为替换国际算法如AES的重要选择SM4在金融、政务、物联网等领域得到广泛应用。与AES-128类似SM4采用128位分组长度和128位密钥长度但在算法结构和S盒设计上具有独特优势。在实际项目中我经常遇到这样的需求Web前端JavaScript采集敏感数据后需要加密传输Java后端接收后解密处理。这个过程中最头疼的就是前后端加解密结果不一致的问题。经过多次踩坑我总结出三个关键点编码格式统一、加密模式匹配和填充方式一致。举个例子某政务系统需要传输身份证号前端用JavaScript加密后端用Java解密。如果前后端对123456的UTF-8字节表示理解不同或者ECB/CBC模式配置不一致就会导致解密失败。这就是为什么我们需要一套严格匹配的跨平台实现方案。2. 前端JavaScript实现详解2.1 基础加密模块搭建先来看完整的SM4 JavaScript实现。核心是SM4类包含加密所需的S盒、FK/CK常量等基础组件。我建议将这些常量单独声明为类属性避免每次加密重复计算function SM4() { this.SM4_ENCRYPT 1; this.SM4_DECRYPT 0; // S盒表256字节 this.SboxTable [ 0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05, // ...完整S盒数据 ]; // 系统参数FK this.FK [0xA3B1BAC6, 0x56AA3350, 0x677D9197, 0xB27022DC]; // 固定参数CK this.CK [ 0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269, // ...完整CK数据 ]; }关键点说明S盒是非线性变换的核心直接影响加密强度FK用于初始密钥扩展CK用于轮密钥生成所有常量值必须与国密标准完全一致2.2 ECB/CBC模式实现在实际项目中我推荐优先使用CBC模式因为它比ECB更安全。下面是两种模式的加密逻辑// ECB电子密码本模式 this.sm4_crypt_ecb function(ctx, input) { let blocks []; for(let i0; iinput.length; i16){ let block input.slice(i, i16); let out new Array(16); this.sm4_one_round(ctx.sk, block, out); blocks blocks.concat(out); } return blocks; } // CBC密码分组链接模式 this.sm4_crypt_cbc function(ctx, iv, input) { let blocks []; let prev iv.slice(0, 16); // 初始化向量 for(let i0; iinput.length; i16){ let block input.slice(i, i16); // 加密时明文与IV异或 if(ctx.mode this.SM4_ENCRYPT) { for(let j0; j16; j) block[j] ^ prev[j]; } let out new Array(16); this.sm4_one_round(ctx.sk, block, out); // 解密时保存当前密文块作为下个IV if(ctx.mode this.SM4_DECRYPT) { for(let j0; j16; j) out[j] ^ prev[j]; prev block.slice(0, 16); } else { prev out.slice(0, 16); } blocks blocks.concat(out); } return blocks; }踩坑记录CBC模式的IV必须与后端一致建议固定为16字节0x00或随机生成加密前必须进行PKCS#7填充否则会报错字节处理时要注意符号位JavaScript的byte可能变成负数3. Java后端实现关键点3.1 基础工具类准备Java实现需要特别注意字节序处理。我封装了Util类处理各种转换public class Util { // 16进制字符串转字节数组 public static byte[] hexToByte(String hex) { byte[] b new byte[hex.length() / 2]; for(int i0; ib.length; i){ b[i] (byte) Integer.parseInt(hex.substring(i*2, i*22), 16); } return b; } // 字节数组转16进制字符串 public static String byteToHex(byte[] b) { StringBuilder sb new StringBuilder(); for(byte bb : b){ sb.append(String.format(%02X, bb 0xFF)); } return sb.toString(); } }3.2 加解密核心逻辑Java的SM4实现与JavaScript保持严格一致public class SM4 { // 轮函数F private int sm4F(int x0, int x1, int x2, int x3, int rk) { return x0 ^ sm4Lt(x1 ^ x2 ^ x3 ^ rk); } // 密钥扩展算法 private void sm4_setkey(int[] SK, byte[] key) { int[] MK new int[4]; int[] k new int[36]; MK[0] GET_ULONG_BE(key, 0); MK[1] GET_ULONG_BE(key, 4); MK[2] GET_ULONG_BE(key, 8); MK[3] GET_ULONG_BE(key, 12); k[0] MK[0] ^ FK[0]; k[1] MK[1] ^ FK[1]; k[2] MK[2] ^ FK[2]; k[3] MK[3] ^ FK[3]; for(int i0; i32; i){ k[i4] k[i] ^ sm4CalciRK(k[i1]^k[i2]^k[i3]^CK[i]); SK[i] k[i4]; } } }联调技巧先用固定IV和密钥测试ECB模式确保Java的getBytes(UTF-8)与JavaScript的文本编码一致调试时打印中间结果的16进制字符串对比4. 前后端联调实战4.1 统一参数配置创建配置类保证两端参数一致// 前端配置 const sm4Config { key: d8f37edaf21f4373, // 16字节密钥 iv: ed32fb5d34388842, // CBC模式需要的IV mode: cbc // 可选ecb/cbc };// 后端配置 public class Sm4Config { public static final String KEY d8f37edaf21f4373; public static final String IV ed32fb5d34388842; public static final String MODE cbc; }4.2 完整加解密流程示例前端加密示例function encrypt(text) { let sm4 new SM4(); let ctx new SM4_Context(); ctx.isPadding true; ctx.mode sm4.SM4_ENCRYPT; // 设置密钥 let keyBytes hexToBytes(sm4Config.key); sm4.sm4_setkey_enc(ctx, keyBytes); // 文本转字节 let input stringToBytes(text); // 选择模式加密 let output; if(sm4Config.mode ecb) { output sm4.sm4_crypt_ecb(ctx, input); } else { let ivBytes hexToBytes(sm4Config.iv); output sm4.sm4_crypt_cbc(ctx, ivBytes, input); } // 返回Base64 return base64js.fromByteArray(output); }后端解密示例public String decrypt(String ciphertext) throws Exception { SM4_Context ctx new SM4_Context(); ctx.isPadding true; ctx.mode SM4.SM4_DECRYPT; // Base64解码 byte[] encrypted Base64.getDecoder().decode(ciphertext); // 设置密钥 byte[] keyBytes Sm4Config.KEY.getBytes(); SM4 sm4 new SM4(); sm4.sm4_setkey_dec(ctx, keyBytes); // 选择模式解密 byte[] decrypted; if(ecb.equals(Sm4Config.MODE)) { decrypted sm4.sm4_crypt_ecb(ctx, encrypted); } else { byte[] ivBytes Sm4Config.IV.getBytes(); decrypted sm4.sm4_crypt_cbc(ctx, ivBytes, encrypted); } return new String(decrypted, UTF-8); }4.3 常见问题排查解密乱码检查前端是否对密钥和IV进行了正确的hex解码确认后端没有自动去除PKCS#7填充在两端打印加密前后的字节数组对比跨平台编码问题// Java端需要显式指定编码 String plaintext 测试; byte[] bytes plaintext.getBytes(UTF-8);// JavaScript文本转字节 function stringToBytes(str) { let bytes []; for(let i0; istr.length; i) { let code str.charCodeAt(i); if(code 0x80) { bytes.push(code); } else if(code 0x800) { bytes.push(0xC0 | (code 6)); bytes.push(0x80 | (code 0x3F)); } else { bytes.push(0xE0 | (code 12)); bytes.push(0x80 | ((code 6) 0x3F)); bytes.push(0x80 | (code 0x3F)); } } return bytes; }性能优化前端使用Web Worker处理大数据加密Java端缓存SM4_Context对象启用服务器硬件加速指令(AES-NI兼容模式)

相关文章:

国密SM4算法在Web与Java应用中的跨平台加解密实战

1. 国密SM4算法简介与应用场景 国密SM4算法是我国自主设计的分组对称加密算法,于2012年成为国家密码行业标准(GM/T 0002-2012)。作为替换国际算法(如AES)的重要选择,SM4在金融、政务、物联网等领域得到广泛…...

终极VSCode Blade格式化器高级技巧:自定义HTML属性排序与组件前缀配置指南

终极VSCode Blade格式化器高级技巧:自定义HTML属性排序与组件前缀配置指南 【免费下载链接】vscode-blade-formatter An opinionated Blade file formatter for VSCode 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-blade-formatter vscode-blade-fo…...

Spring Boot 与 Prometheus 监控实战

Spring Boot 与 Prometheus 监控实战 引言 大家好,今天想和大家聊聊 Spring Boot 与 Prometheus 的监控实践。作为一名 Java 架构师,我深知监控对于生产环境的重要性。Prometheus 作为云原生监控的事实标准,与 Spring Boot 的集成非常顺畅。让…...

深入解析acts-as-taggable-on:Rails标签系统的终极实现指南

深入解析acts-as-taggable-on:Rails标签系统的终极实现指南 【免费下载链接】acts-as-taggable-on A tagging plugin for Rails applications that allows for custom tagging along dynamic contexts. 项目地址: https://gitcode.com/gh_mirrors/ac/acts-as-tagg…...

无需编程!cv_resnet18_ocr-detection WebUI界面操作详解

无需编程!cv_resnet18_ocr-detection WebUI界面操作详解 1. 开篇:为什么选择这个OCR工具? 在日常工作和生活中,我们经常需要从图片中提取文字信息。传统OCR工具要么需要复杂的编程接口,要么功能单一难以满足需求。今…...

Wan2.2-T2V-A5B案例分享:用简单提示词生成流畅运动视频

Wan2.2-T2V-A5B案例分享:用简单提示词生成流畅运动视频 1. 模型简介与核心优势 Wan2.2-T2V-A5B是由通义万相开源的一款轻量级文本到视频生成模型,拥有50亿参数规模。这款模型专为快速内容创作优化,支持480P视频生成,具备优秀的时…...

通义千问3-4B降本增效:单卡实现2560维向量生成案例

通义千问3-4B降本增效:单卡实现2560维向量生成案例 1. 引言:当向量生成不再需要“大力出奇迹” 如果你正在搭建一个智能知识库,或者想为自己的应用增加语义搜索能力,那你一定遇到过这个难题:如何高效、低成本地生成高…...

终极指南:Elasticsearch架构设计原理从倒排索引到分布式搜索的完整解析

终极指南:Elasticsearch架构设计原理从倒排索引到分布式搜索的完整解析 【免费下载链接】awesome-elasticsearch A curated list of the most important and useful resources about elasticsearch: articles, videos, blogs, tips and tricks, use cases. All abou…...

如何构建可靠的HTML5解析测试框架:全面指南与最佳实践

如何构建可靠的HTML5解析测试框架:全面指南与最佳实践 【免费下载链接】gumbo-parser An HTML5 parsing library in pure C99 项目地址: https://gitcode.com/gh_mirrors/gum/gumbo-parser HTML5解析器是现代Web开发的核心组件,而构建一个可靠的测…...

深入解析vscode-blade-formatter安全性与隐私保护:开发者必知的终极指南

深入解析vscode-blade-formatter安全性与隐私保护:开发者必知的终极指南 【免费下载链接】vscode-blade-formatter An opinionated Blade file formatter for VSCode 项目地址: https://gitcode.com/gh_mirrors/vs/vscode-blade-formatter vscode-blade-form…...

Labelme标注的坑我帮你踩完了:Win/Mac/Linux三大系统安装避坑指南与界面汉化

Labelme三大系统安装避坑全指南:从环境配置到界面汉化实战 第一次打开Labelme时,那个满屏英文的界面和莫名其妙的报错提示,是不是让你瞬间想起了被毕业设计支配的恐惧?作为计算机视觉领域最受欢迎的标注工具之一,Label…...

Java GeoTools实战:5分钟搞定热力图生成与TIFF文件导出(附完整代码)

Java GeoTools实战:5分钟搞定热力图生成与TIFF文件导出(附完整代码) 热力图作为一种直观的数据密度可视化工具,在GIS开发中扮演着重要角色。本文将带你快速掌握使用Java GeoTools库生成热力图并导出为TIFF文件的核心技巧&#xff…...

深入理解VideoCrafter:DDPM3D和DDIM采样算法在高质量视频生成中的应用

深入理解VideoCrafter:DDPM3D和DDIM采样算法在高质量视频生成中的应用 【免费下载链接】VideoCrafter VideoCrafter1: Open Diffusion Models for High-Quality Video Generation 项目地址: https://gitcode.com/gh_mirrors/vi/VideoCrafter VideoCrafter是一…...

3步破解音乐平台碎片化困局:Listen1多源聚合技术深度实践

3步破解音乐平台碎片化困局:Listen1多源聚合技术深度实践 【免费下载链接】listen1_chrome_extension one for all free music in china (chrome extension, also works for firefox) 项目地址: https://gitcode.com/gh_mirrors/li/listen1_chrome_extension …...

COMSOL 钢制支架静态分析:从建模到结果解析

comsol支架-静态分析, COMSOL Multiphysics 和“结构力学模块”中对结构力学问题进行建模的基本原理及操作。 介绍线性静态分析,包括材料属性和边界条件的定义。 在计算出解之后,学习如何分析结果并检查反作用力。 模型是钢制支架。 这种支架…...

OpCore-Simplify:黑苹果配置的终极简化指南,零基础也能轻松上手

OpCore-Simplify:黑苹果配置的终极简化指南,零基础也能轻松上手 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 还在为复杂的黑…...

从CTF题到实战:手把手教你用Python的sympy和gmpy2破解RSA变种(附完整脚本)

从CTF题到实战:手把手教你用Python的sympy和gmpy2破解RSA变种(附完整脚本) 在网络安全竞赛和实际渗透测试中,RSA加密算法的各种变种经常出现。这些变种往往通过引入特殊的数学性质或构造方式,使得标准的RSA攻击方法失效…...

LongCat动物百变秀快速入门:上传图片+输入文字=神奇效果

LongCat动物百变秀快速入门:上传图片输入文字神奇效果 1. 认识动物百变秀 你是否想过给家里的宠物猫换个造型?或者把普通的狗狗照片变成威风凛凛的狼?LongCat动物百变秀让这些想象变成现实。这是一个基于美团开源技术的智能图片编辑工具&am…...

Comsol瓦斯抽采:多物理场耦合的奇妙探索

comsol瓦斯抽采 该案例涉及有效应力场,瓦斯渗流场等多物理场耦合。 包括钻孔瓦斯抽采模型,热流固耦合模型,顺层瓦斯抽采模型,注氮驱替瓦斯模型,水力压裂模型,三轴裂隙岩体渗流应力耦合,采空区瓦…...

终极指南:如何用qmc-decoder轻松解锁QQ音乐加密文件

终极指南:如何用qmc-decoder轻松解锁QQ音乐加密文件 【免费下载链接】qmc-decoder Fastest & best convert qmc 2 mp3 | flac tools 项目地址: https://gitcode.com/gh_mirrors/qm/qmc-decoder 你是否曾经从QQ音乐下载了喜爱的歌曲,却发现只能…...

终极指南:如何自定义 rust-analyzer 扩展功能与插件开发

终极指南:如何自定义 rust-analyzer 扩展功能与插件开发 【免费下载链接】rust-analyzer A Rust compiler front-end for IDEs 项目地址: https://gitcode.com/gh_mirrors/ru/rust-analyzer rust-analyzer 是一款强大的 Rust 编译器前端工具,专为…...

揭秘抖音批量采集神器:从技术内核到实战突破

揭秘抖音批量采集神器:从技术内核到实战突破 【免费下载链接】douyin-downloader 项目地址: https://gitcode.com/GitHub_Trending/do/douyin-downloader 在数字内容创作与研究的浪潮中,抖音作为全球最大的短视频平台,其丰富的内容资…...

微信小程序UI组件库终极指南:WeUI-WXSS与Vant、ColorUI深度对比分析

微信小程序UI组件库终极指南:WeUI-WXSS与Vant、ColorUI深度对比分析 【免费下载链接】weui-wxss A UI library by WeChat official design team, includes the most useful widgets/modules. 项目地址: https://gitcode.com/gh_mirrors/we/weui-wxss WeUI-WX…...

Sealos安全架构完全指南:多租户环境下的终极防护策略

Sealos安全架构完全指南:多租户环境下的终极防护策略 【免费下载链接】sealos Sealos is a production-ready Kubernetes distribution that provides a one-stop solution for both public and private cloud. https://sealos.io 项目地址: https://gitcode.com/…...

easy-connect-gr-peach:GR-PEACH多网络连接抽象库详解

1. easy-connect-gr-peach 项目概述 easy-connect-gr-peach 是专为 Renesas GR-PEACH 开发板设计的轻量级网络连接抽象库,属于 mbed OS 生态中 easy-connect 系统在特定硬件平台上的适配实现。其核心目标并非提供底层驱动,而是构建一套 统一、可配置…...

流处理 vs 批处理:大数据时代的技术选择指南

流处理 vs 批处理:大数据时代的技术选择指南 关键词:流处理、批处理、大数据、实时计算、离线计算、延迟、吞吐量 摘要:在大数据时代,数据处理就像一场永不停歇的"数据马拉松"。流处理和批处理是两种最核心的技术方案&a…...

分解+组合+RUL预测!MVMD-Transformer-BiLSTM锂电池剩余寿命预测(容量特征提取+剩余寿命预测)

这段代码实现了一套完整的基于MVMD-Transformer-BiLSTM的电池剩余寿命预测:一、研究背景 锂离子电池在长期充放电循环中会发生容量衰减,准确预测其剩余使用寿命(RUL)对设备健康管理、安全保障与运维决策至关重要。传统预测方法常受…...

如何评估企业的敏捷管理能力价值

如何评估企业的敏捷管理能力价值关键词:企业敏捷管理能力、评估价值、敏捷方法、绩效指标、价值驱动因素摘要:本文旨在深入探讨如何评估企业的敏捷管理能力价值。首先介绍了评估的背景,包括目的、预期读者、文档结构和相关术语。接着阐述了敏…...

解锁AI原生应用领域多代理系统的潜力

解锁AI原生应用领域多代理系统的潜力 关键词:多代理系统(MAS)、AI原生应用、智能体(Agent)、协作式AI、涌现行为 摘要:在AI从“工具辅助”向“原生驱动”进化的今天,多代理系统(Multi-Agent System, MAS)正成为构建复杂智能应用的核心引擎。本文将通过生活类比、技术原…...

5分钟掌握WaveTools:让你的《鸣潮》游戏体验提升200%

5分钟掌握WaveTools:让你的《鸣潮》游戏体验提升200% 【免费下载链接】WaveTools 🧰鸣潮工具箱 项目地址: https://gitcode.com/gh_mirrors/wa/WaveTools 还在为《鸣潮》的卡顿和掉帧烦恼吗?无论你是刚入坑的新手还是追求极致体验的资…...