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

Java实战:国密SM4/ECB/PKCS7Padding加密解密全流程解析

1. 国密SM4算法基础认知第一次接触国密算法时我也被各种专业术语绕晕了。简单来说SM4就像是给数据上锁的国产密码锁——它用128位的密钥相当于16个字符的密码把数据切成固定大小的块进行加密。比起国际通用的AES算法SM4在政府和企业系统中更常见特别是在金融、政务这些对数据安全要求高的领域。这里有个生活化的比喻假设你要寄贵重物品SM4就像是用特制的中国制造保险箱加密算法打包物品。ECB模式相当于把物品分成多个小件每个都用相同的钥匙单独锁进保险箱而PKCS7Padding则是给最后一个小箱子塞泡沫垫填充数据确保所有箱子大小一致。最近给某银行做数据接口开发时就强制要求使用SM4/ECB/PKCS7Padding组合这也是今天重点讲解的方案。2. 开发环境快速搭建2.1 Maven依赖配置用IDEA新建项目后在pom.xml里添加这两个关键依赖dependencies !-- 提供国密算法实现 -- dependency groupIdorg.bouncycastle/groupId artifactIdbcprov-jdk15on/artifactId version1.70/version /dependency !-- Base64编码工具 -- dependency groupIdcommons-codec/groupId artifactIdcommons-codec/artifactId version1.16.0/version /dependency /dependencies踩坑提醒去年接手老项目时发现加密异常排查半天才发现是Bouncy Castle版本过旧。建议版本不低于1.66新版修复了不少安全漏洞。如果遇到NoSuchAlgorithmException大概率是依赖没加载成功可以试试Security.addProvider(new BouncyCastleProvider())手动注册。2.2 算法提供者配置在Java代码的静态块中初始化加密提供者static { if (Security.getProvider(BC) null) { Security.addProvider(new BouncyCastleProvider()); } }实测发现不同JDK版本有差异Oracle JDK8需要手动添加而OpenJDK11可能已经内置。建议加上判断条件避免重复注册。3. 核心工具类实现3.1 密钥生成模块生成随机密钥的两种实用方法// 生成默认128位密钥 public static byte[] generateKey() throws Exception { KeyGenerator kg KeyGenerator.getInstance(SM4, BC); kg.init(128, new SecureRandom()); return kg.generateKey().getEncoded(); } // 生成指定长度密钥单位bit public static byte[] generateKey(int keySize) throws Exception { KeyGenerator kg KeyGenerator.getInstance(SM4, BC); kg.init(keySize, new SecureRandom()); return kg.generateKey().getEncoded(); }密钥管理经验谈在金融项目中我们采用主密钥会话密钥的双层体系。主密钥由硬件加密机保管会话密钥则用主密钥加密后传输。这里演示的生成方法适合临时密钥场景。3.2 加密解密核心方法完整工具类代码结构public class Sm4EcbUtils { private static final String ALGORITHM_NAME SM4; private static final String ALGORITHM_NAME_ECB_PADDING SM4/ECB/PKCS7Padding; // ECB模式加密 public static byte[] encryptEcb(byte[] key, byte[] data) throws Exception { Cipher cipher Cipher.getInstance(ALGORITHM_NAME_ECB_PADDING, BC); SecretKeySpec sm4Key new SecretKeySpec(key, ALGORITHM_NAME); cipher.init(Cipher.ENCRYPT_MODE, sm4Key); return cipher.doFinal(data); } // ECB模式解密 public static byte[] decryptEcb(byte[] key, byte[] cipherText) throws Exception { Cipher cipher Cipher.getInstance(ALGORITHM_NAME_ECB_PADDING, BC); SecretKeySpec sm4Key new SecretKeySpec(key, ALGORITHM_NAME); cipher.init(Cipher.DECRYPT_MODE, sm4Key); return cipher.doFinal(cipherText); } }性能优化点实际测试发现频繁创建Cipher实例会影响性能。在高并发场景下可以考虑使用ThreadLocal来缓存Cipher实例。4. 完整应用示例4.1 控制台演示案例public class Sm4Demo { public static void main(String[] args) throws Exception { // 生成密钥建议实际项目中使用固定密钥 byte[] key Sm4EcbUtils.generateKey(); System.out.println(生成密钥 Hex.toHexString(key)); String originalText 这是一段需要加密的敏感数据; System.out.println(原始文本 originalText); // 加密流程 byte[] encrypted Sm4EcbUtils.encryptEcb(key, originalText.getBytes(StandardCharsets.UTF_8)); String encryptedBase64 Base64.encodeBase64String(encrypted); System.out.println(加密结果(Base64) encryptedBase64); // 解密流程 byte[] decrypted Sm4EcbUtils.decryptEcb(key, Base64.decodeBase64(encryptedBase64)); System.out.println(解密结果 new String(decrypted, StandardCharsets.UTF_8)); } }4.2 常见问题调试填充异常遇到BadPaddingException时首先检查密钥是否正确。曾有个故障是因为前端传的密钥被URLDecode了一次导致长度变化。中文乱码加解密时务必统一字符编码推荐全程使用UTF-8。遇到过团队用GBK加密UTF-8解密的坑。数据截断ECB模式下加密结果长度原始数据长度16 - 原始数据长度%16。如果解密时长度不对可能是传输过程中丢失了部分数据。5. 生产环境实践建议5.1 安全增强方案密钥存储切忌硬编码在代码中推荐方案开发环境配置文件加密存储生产环境使用KMS或HSM硬件加密机模式选择虽然ECB实现简单但相同明文会生成相同密文。对安全性要求高的场景建议改用CBC模式示例public static byte[] encryptCbc(byte[] key, byte[] iv, byte[] data) throws Exception { Cipher cipher Cipher.getInstance(SM4/CBC/PKCS7Padding, BC); IvParameterSpec ivSpec new IvParameterSpec(iv); SecretKeySpec sm4Key new SecretKeySpec(key, SM4); cipher.init(Cipher.ENCRYPT_MODE, sm4Key, ivSpec); return cipher.doFinal(data); }5.2 性能优化技巧对象复用Cipher实例的创建成本较高可通过对象池复用批量处理大文件加密时采用分块处理避免内存溢出try (InputStream in new FileInputStream(input.txt); OutputStream out new FileOutputStream(encrypted.txt)) { Cipher cipher Cipher.getInstance(SM4/ECB/PKCS7Padding, BC); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] buffer new byte[8192]; int bytesRead; while ((bytesRead in.read(buffer)) ! -1) { byte[] output cipher.update(buffer, 0, bytesRead); if (output ! null) out.write(output); } byte[] output cipher.doFinal(); if (output ! null) out.write(output); }最近在数据中台项目中通过线程池Cipher对象池的方案将加密吞吐量从原来的1200QPS提升到了8500QPS。关键点是避免每次加密都创建新对象同时控制好并发线程数。

相关文章:

Java实战:国密SM4/ECB/PKCS7Padding加密解密全流程解析

1. 国密SM4算法基础认知 第一次接触国密算法时,我也被各种专业术语绕晕了。简单来说,SM4就像是给数据上锁的国产密码锁——它用128位的密钥(相当于16个字符的密码)把数据切成固定大小的块进行加密。比起国际通用的AES算法&#xf…...

Phi-4-reasoning-vision-15B实际效果:电商后台界面截图→权限漏洞提示生成

Phi-4-reasoning-vision-15B实际效果:电商后台界面截图→权限漏洞提示生成 1. 模型能力概述 Phi-4-reasoning-vision-15B是微软推出的视觉多模态推理模型,专门针对图像理解和复杂视觉推理任务进行了优化。这个模型最令人印象深刻的能力之一&#xff0c…...

Qwen3-Reranker-0.6B在Keil5嵌入式开发环境中的集成

Qwen3-Reranker-0.6B在Keil5嵌入式开发环境中的集成 让AI重排序模型在资源受限的嵌入式设备上跑起来 作为一名嵌入式开发者,你可能已经习惯了在Keil5这样的IDE中编写代码、调试硬件。但说到在嵌入式设备上运行AI模型,特别是像Qwen3-Reranker-0.6B这样的重…...

计算机网络原理在Z-Image-Turbo模型分布式推理中的应用与优化

计算机网络原理在Z-Image-Turbo模型分布式推理中的应用与优化 最近和几个做AI应用落地的朋友聊天,大家普遍有个头疼的问题:单机跑大模型,尤其是像Z-Image-Turbo这种高性能图像生成模型,一旦请求量上来,要么排队等半天…...

工业级机械臂抓取避坑指南:从相机标定到PnP位姿估计的10个实战技巧

工业级机械臂抓取避坑指南:从相机标定到PnP位姿估计的10个实战技巧 在智能制造和自动化物流领域,机械臂视觉抓取系统的稳定性直接决定了生产线的效率和可靠性。许多工程师在完成基础功能开发后,往往会在实际部署阶段遇到各种"玄学"…...

MySQL实时同步实战:Canal vs Flink CDC性能对比与选型指南

MySQL实时同步技术深度解析:Canal与Flink CDC的工程实践与性能优化 在数据驱动的业务环境中,MySQL作为核心数据存储系统,其数据实时同步能力直接关系到业务的敏捷性和决策时效性。面对Canal和Flink CDC这两种主流的实时同步方案,技…...

效果惊艳!雯雯的后宫-造相Z-Image瑜伽女孩模型生成作品集

效果惊艳!雯雯的后宫-造相Z-Image瑜伽女孩模型生成作品集 1. 专业级瑜伽人像生成体验 当AI绘画技术遇上瑜伽美学,会碰撞出怎样的火花?"雯雯的后宫-造相Z-Image-瑜伽女孩"模型给出了令人惊艳的答案。这个基于Z-Image-Turbo技术、专…...

Open-AutoGLM进阶玩法:结合Python脚本,实现自动化测试与数据采集

Open-AutoGLM进阶玩法:结合Python脚本,实现自动化测试与数据采集 1. 前言:从基础到进阶 在前一篇文章中,我们已经介绍了Open-AutoGLM的基础使用方法,包括环境配置、设备连接和基本指令执行。本文将深入探讨如何通过P…...

Qwen3-ASR-0.6B在Linux环境下的高效部署方案

Qwen3-ASR-0.6B在Linux环境下的高效部署方案 1. 引言 语音识别技术正在快速改变我们与设备交互的方式,而Qwen3-ASR-0.6B作为一款轻量级但功能强大的语音识别模型,为开发者提供了在Linux服务器上部署高效语音识别服务的新选择。这个模型虽然只有6亿参数…...

手把手教你用LongCat-Image-Editn V2镜像:从部署到第一次成功改图

手把手教你用LongCat-Image-Editn V2镜像:从部署到第一次成功改图 想不想体验用一句话就能让照片里的猫变成狗,或者给风景照换个天空颜色?今天我要带大家从零开始,一步步教你使用LongCat-Image-Editn V2这个神奇的AI改图工具。这…...

Windows系统AI组件移除方案:数据守护者的安全防护指南

Windows系统AI组件移除方案:数据守护者的安全防护指南 【免费下载链接】RemoveWindowsAI Force Remove Copilot and Recall in Windows 项目地址: https://gitcode.com/GitHub_Trending/re/RemoveWindowsAI 在数字化办公环境中,某企业用户因Windo…...

Linux磁盘空间被‘幽灵文件‘占满?手把手教你用lsof+truncate彻底清理(附排查流程图)

Linux磁盘空间被幽灵文件占满?手把手教你排查与清理 你是否遇到过这样的场景:服务器磁盘明明显示已满,但用du命令统计却只占用了很小一部分空间?这种"空间消失"现象通常是由于文件被删除但仍在被进程占用导致的。本文将…...

UDS协议实战:如何用Python模拟单帧与多帧传输(附完整代码)

UDS协议实战:如何用Python模拟单帧与多帧传输(附完整代码) 在汽车电子开发领域,UDS(Unified Diagnostic Services)协议是诊断通信的核心标准。对于嵌入式开发者而言,掌握UDS网络层的单帧与多帧传…...

vCenter密码策略踩坑实录:如何用SSO账户绕过root密码过期问题

vCenter密码策略实战指南:SSO账户的权限管理与安全平衡术 那天凌晨三点,数据中心告警铃声刺破了夜的宁静。vCenter服务器因root密码过期而锁定了所有管理操作,整个虚拟化平台陷入半瘫痪状态。运维团队手忙脚乱地翻找密码本,却发现…...

从零开始打造个性化双语电子书:AI翻译工具的场景化实践指南

从零开始打造个性化双语电子书:AI翻译工具的场景化实践指南 【免费下载链接】bilingual_book_maker Make bilingual epub books Using AI translate 项目地址: https://gitcode.com/gh_mirrors/bil/bilingual_book_maker 一、核心价值:为什么需要…...

Coqui STT 文件下载效率优化实战:从原理到批量处理最佳实践

最近在做一个语音识别的项目,用到了 Coqui STT 这个很棒的开源工具。但在项目初期,我就遇到了一个不大不小的麻烦:下载那些动辄几百兆甚至上G的预训练模型文件,实在是太慢了!单线程下载不仅耗时,网络一波动…...

ECharts树形图实战:5分钟搞定企业组织架构可视化(附完整代码)

ECharts树形图实战:5分钟搞定企业组织架构可视化(附完整代码) 当企业规模扩大时,组织架构的复杂性往往呈指数级增长。传统的静态图表或PPT已经难以满足实时更新、动态展示的需求。ECharts作为一款强大的数据可视化库,其…...

MATLAB新手必看:5分钟搞定OBJ文件导入与3D模型可视化

MATLAB新手必看:5分钟搞定OBJ文件导入与3D模型可视化 当你第一次接触3D模型处理时,OBJ文件格式可能是最常遇到的挑战之一。作为MATLAB初学者,你可能已经发现这个强大的计算平台不仅能处理数值运算,还能成为3D可视化的得力助手。本…...

手把手教你用PHPStudy搭建Pikachu靶场(附SSRF漏洞实战演示)

从零构建Pikachu靶场:SSRF漏洞攻防全景实战指南 当我在三年前第一次接触网络安全实训时,Pikachu靶场就像一扇神秘的大门。这个以宝可梦命名的开源漏洞演练平台,用卡通化的界面隐藏着真实世界中最危险的漏洞形态。今天,我将带您从环…...

通用物体识别-ResNet18快速入门:内置WebUI,拖拽上传图片即识别

通用物体识别-ResNet18快速入门:内置WebUI,拖拽上传图片即识别 1. 为什么你需要一个开箱即用的图像识别服务? 想象一下这个场景:你正在开发一个智能相册应用,用户上传了成千上万张照片,你需要自动为这些照…...

Unity游戏开发中的抽象类与虚方法:如何优雅地管理游戏状态?

Unity游戏开发中的抽象类与虚方法:如何优雅地管理游戏状态? 在Unity游戏开发中,状态管理是构建复杂游戏逻辑的核心挑战之一。想象一下,当玩家从主菜单切换到战斗场景,再进入暂停界面时,游戏需要精确控制每个…...

WeUI组件库避坑指南:如何按需引入Button组件不踩坑

WeUI组件库避坑指南:如何按需引入Button组件不踩坑 微信小程序开发中,组件库的使用一直是提升效率的关键。WeUI作为微信官方推出的样式库,与原生视觉体验高度一致,尤其适合追求界面统一性的项目。但在实际开发中,不少团…...

CUDA实战:用GPU加速TopK问题求解(附完整代码与性能对比)

CUDA实战:用GPU加速TopK问题求解(附完整代码与性能对比) 在处理海量数据时,如何快速找到前K个最大值(TopK问题)是许多数据密集型应用的核心需求。传统CPU串行处理方式在面对数亿级数据时往往力不从心&#…...

智能家居避坑指南:用Home Assistant桥接米家和HomeKit的5个关键设置

智能家居避坑指南:用Home Assistant桥接米家和HomeKit的5个关键设置 当你的床头灯能用Siri控制开关,而空气净化器却只能通过米家APP操作时,这种割裂感正是智能家居生态的典型痛点。本文将为苹果生态用户揭示如何通过Home Assistant这座"…...

手把手教你用Xilinx FPGA实现万兆以太网UDP传输(基于XC7K325T开发板)

基于Xilinx FPGA的万兆以太网UDP传输实战指南(XC7K325T开发板) 在高速数据传输领域,万兆以太网已成为工业自动化、数据中心和科研实验的关键基础设施。本文将带领读者从零开始,在Xilinx Kintex-7系列XC7K325T开发板上实现完整的UD…...

开源硬件监控工具全解析:守护你的电脑健康

开源硬件监控工具全解析:守护你的电脑健康 【免费下载链接】LibreHardwareMonitor Libre Hardware Monitor, home of the fork of Open Hardware Monitor 项目地址: https://gitcode.com/GitHub_Trending/li/LibreHardwareMonitor 在数字时代,电脑…...

Pi0模型优化升级:从演示模式到实际推理的性能提升方案

Pi0模型优化升级:从演示模式到实际推理的性能提升方案 1. 项目背景与现状分析 Pi0作为一款视觉-语言-动作流模型,在通用机器人控制领域展现出独特价值。当前版本虽然提供了直观的Web演示界面,但在实际部署中仍存在一些性能瓶颈:…...

RD-Agent:AI驱动研发自动化的技术架构与实践解析

RD-Agent:AI驱动研发自动化的技术架构与实践解析 【免费下载链接】RD-Agent Research and development (R&D) is crucial for the enhancement of industrial productivity, especially in the AI era, where the core aspects of R&D are mainly focused o…...

颠覆式照片管理:5大AI引擎重构你的数字记忆库

颠覆式照片管理:5大AI引擎重构你的数字记忆库 【免费下载链接】photoprism Photoprism是一个现代的照片管理和分享应用,利用人工智能技术自动分类、标签、搜索图片,还提供了Web界面和移动端支持,方便用户存储和展示他们的图片集。…...

Lingbot-Depth-Pretrain-VitL-14:驱动AIGC内容创作的深度感知新引擎

Lingbot-Depth-Pretrain-VitL-14:驱动AIGC内容创作的深度感知新引擎 最近在玩AIGC的时候,你是不是也遇到过这样的烦恼?让AI画一个房间,结果家具都飘在空中,透视关系乱七八糟;想生成一个带景深效果的人像&a…...