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

SM2解密报错InvalidCipherTextException?可能是密文格式惹的祸(附BC库1.65解决方案)

SM2解密报错InvalidCipherTextException的深度解析与实战解决方案1. 问题现象与背景分析当Java开发者使用Bouncy CastleBC库进行SM2算法解密时经常会遇到InvalidCipherTextException异常。这个异常表面看起来是无效密文但实际上可能隐藏着更深层次的原因。SM2作为我国商用密码体系中的非对称加密算法标准在金融、政务等领域广泛应用。但在实际开发中不同系统间的SM2实现存在细微差异特别是在密文格式方面。以下是典型的错误场景// 使用BC 1.65版本解密时抛出异常 SM2Engine sm2Engine new SM2Engine(); sm2Engine.init(false, privateKeyParams); byte[] decrypted sm2Engine.processBlock(cipherText, 0, cipherText.length); // 抛出InvalidCipherTextException2. 根本原因探究2.1 密文格式的历史演变SM2密文由三部分组成C1椭圆曲线点坐标04||X||YC2实际密文数据C3SM3摘要值在BC库的实现历史中存在两种排列方式格式类型组成顺序使用场景传统格式C1C2C3BC 1.60-1.64默认格式新标准格式C1C3C2国标推荐格式加密机常用2.2 异常产生的深层机制当解密引擎预期某种格式而实际收到另一种格式时会导致摘要验证失败C3值位置错误密文解析错位C2被当作C3处理最终抛出InvalidCipherTextException注意公私钥不匹配、数据篡改也会导致相同异常需要先排除这些基础问题3. BC 1.65的解决方案BC 1.65版本开始引入了显式的模式设置API// 明确指定密文格式 SM2Engine sm2Engine new SM2Engine(SM2Engine.Mode.C1C3C2); // 根据对端系统选择模式 sm2Engine.init(false, privateKeyParams); byte[] decrypted sm2Engine.processBlock(cipherText, 0, cipherText.length);关键改进点新增Mode枚举类明确支持两种格式不再依赖隐式默认值代码可读性更强4. 跨系统联调实战指南4.1 判断对端系统使用的格式通过以下特征识别加密机厂商多数采用C1C3C2前端库版本较新的sm-crypto通常用C1C3C2早期实现可能用C1C2C3密文长度分析C1固定65字节04开头C3固定32字节SM3输出4.2 完整加解密示例代码// 加密端使用C1C3C2格式 public static byte[] sm2Encrypt(byte[] plainText, PublicKey publicKey) { BCECPublicKey bcPubKey (BCECPublicKey) publicKey; ECPublicKeyParameters ecPubKey new ECPublicKeyParameters(bcPubKey.getQ(), ecDomainParams); SM2Engine engine new SM2Engine(SM2Engine.Mode.C1C3C2); engine.init(true, new ParametersWithRandom(ecPubKey, new SecureRandom())); try { return engine.processBlock(plainText, 0, plainText.length); } catch (InvalidCipherTextException e) { throw new RuntimeException(SM2加密失败, e); } } // 解密端 public static byte[] sm2Decrypt(byte[] cipherText, PrivateKey privateKey) { BCECPrivateKey bcPrivKey (BCECPrivateKey) privateKey; ECPrivateKeyParameters ecPrivKey new ECPrivateKeyParameters(bcPrivKey.getD(), ecDomainParams); SM2Engine engine new SM2Engine(SM2Engine.Mode.C1C3C2); // 必须与加密端一致 engine.init(false, ecPrivKey); try { return engine.processBlock(cipherText, 0, cipherText.length); } catch (InvalidCipherTextException e) { // 首先检查模式是否匹配 if(e.getMessage().contains(invalid cipher text)) { throw new RuntimeException(密文格式不匹配请确认使用C1C3C2还是C1C2C3, e); } throw new RuntimeException(SM2解密失败, e); } }4.3 常见问题排查表现象可能原因解决方案解密报错但密钥确认正确密文格式不匹配尝试切换Mode.C1C3C2/C1C2C3前端加密后端解密失败前后端格式不一致统一使用C1C3C2格式加密机生成的密文无法解密加密机使用特殊格式确认加密机文档调整BC模式升级BC后解密失败默认格式变化显式指定Mode而非依赖默认值5. 进阶格式自动检测与转换对于需要兼容两种格式的场景可以实现智能检测public static byte[] autoDecrypt(byte[] cipherText, PrivateKey privateKey) { // 尝试C1C3C2格式 try { return decryptWithMode(cipherText, privateKey, Mode.C1C3C2); } catch (InvalidCipherTextException e1) { // 尝试C1C2C3格式 try { return decryptWithMode(cipherText, privateKey, Mode.C1C2C3); } catch (InvalidCipherTextException e2) { throw new RuntimeException(无法识别密文格式, e2); } } } private static byte[] decryptWithMode(byte[] cipherText, PrivateKey privateKey, Mode mode) { // ... 实现指定模式的解密逻辑 }6. 版本兼容性建议针对不同BC版本的适配策略BC 1.65推荐显式设置ModeBC 1.60-1.64需要手动转换格式// 将C1C3C2转换为C1C2C3 byte[] convertC1C3C2ToC1C2C3(byte[] cipherText) { int c1Len 65; // 04 32字节X 32字节Y int c3Len 32; // SM3输出长度 byte[] result new byte[cipherText.length]; // 复制C1 System.arraycopy(cipherText, 0, result, 0, c1Len); // 复制C2 System.arraycopy(cipherText, c1Lenc3Len, result, c1Len, cipherText.length-c1Len-c3Len); // 复制C3 System.arraycopy(cipherText, c1Len, result, cipherText.length-c3Len, c3Len); return result; }在实际项目中遇到这类问题时最稳妥的做法是与对端系统明确约定使用的密文格式标准并在代码中显式声明而非依赖默认实现。

相关文章:

SM2解密报错InvalidCipherTextException?可能是密文格式惹的祸(附BC库1.65解决方案)

SM2解密报错InvalidCipherTextException的深度解析与实战解决方案 1. 问题现象与背景分析 当Java开发者使用Bouncy Castle(BC)库进行SM2算法解密时,经常会遇到InvalidCipherTextException异常。这个异常表面看起来是"无效密文"&…...

GB28181 Catalog信令交互全解析:从SIP消息到设备列表获取

GB28181 Catalog信令交互全解析:从SIP消息到设备列表获取 在视频监控领域,GB28181协议作为国家标准,已经成为设备互联互通的重要技术规范。其中,Catalog信令交互作为设备发现和管理的核心环节,直接关系到监控系统的可用…...

阿里一年狂减 6.6 万人?!

3 月 19 日,阿里最新财报终于出炉。截至 2025 年 12 月 31 日,阿里员工总数定格 12,8197 人。对比 2024 年底的 19,4320 人,直接少了 6,6123 人,降幅高达 34%,数字看着触目惊心。很多人第一反应是大规模裁员&#xff0…...

SiameseAOE实战:电商评论分析神器,自动识别好评差评属性

SiameseAOE实战:电商评论分析神器,自动识别好评差评属性 1. 电商评论分析的痛点与解决方案 每天,电商平台都会产生海量的用户评论数据。这些评论蕴含着宝贵的用户反馈,但人工阅读和分析这些评论既耗时又低效。传统的关键词匹配方…...

DAB双有源桥-Plecs热仿真(损耗分析)+单移相SPS调制+电压闭环隔离型直流变换器

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

Pytorch-DirectML实战:用AMD显卡在Windows10/11上跑通第一个深度学习Demo

PyTorch-DirectML实战:在AMD显卡上快速搭建Windows深度学习环境 最近两年AMD显卡在深度学习领域的支持越来越完善,特别是微软推出的DirectML技术让Windows平台上的AMD显卡也能流畅运行PyTorch。作为一名长期使用NVIDIA显卡的开发者,我第一次尝…...

Linux命令-mkdir(创建目录)

mkdir 命令用于在 Linux 系统中创建新的目录(文件夹)。它是文件操作中最基础、最常用的命令之一。 📖 基本语法 mkdir [选项] 目录名...🎯 常用选项选项说明-p, --parents递归创建所需的所有父目录。如果目录已存在,不…...

RaiDrive+AList保姆级教程:5分钟搞定OneDrive/百度网盘挂载到本地(附WebDAV配置)

RaiDriveAList全链路云盘挂载指南:从协议原理到企业级实践 云存储碎片化管理的时代,当你的工作文件散落在OneDrive、百度网盘等不同平台时,每次查找文档都需要在多个网页间切换,效率低下且容易出错。本文将带你用RaiDriveAList构建…...

零基础5分钟部署Phi-3-Vision:图文对话模型快速上手教程

零基础5分钟部署Phi-3-Vision:图文对话模型快速上手教程 1. 准备工作 1.1 了解Phi-3-Vision模型 Phi-3-Vision-128K-Instruct是微软推出的轻量级多模态模型,能够同时理解图像和文本内容。这个模型特别适合用于: 图片内容识别与描述图文混…...

Nacos版本升级必看:从1.x到3.0端口变化全解析(附配置清单)

Nacos版本升级必看:从1.x到3.0端口变化全解析(附配置清单) 在微服务架构的演进过程中,配置中心和服务发现组件扮演着至关重要的角色。作为阿里巴巴开源的一款集服务发现、配置管理、服务管理于一体的平台,Nacos凭借其轻…...

IDEA项目结构配置全攻略:从Sources到Artifacts的保姆级教程

IDEA项目结构配置全攻略:从Sources到Artifacts的保姆级教程 当你第一次在IDEA中创建项目时,是否曾被复杂的目录结构和配置项弄得晕头转向?作为Java开发者最常用的IDE之一,IntelliJ IDEA的项目结构配置直接关系到项目的编译、运行和…...

低代码平台集成AI能力:在Dify中快速调用BERT文本分割模型

低代码平台集成AI能力:在Dify中快速调用BERT文本分割模型 你是不是经常遇到这样的场景:手头有一份几十页的PDF报告,或者一篇上万字的长文,需要快速提炼出核心要点,或者把它拆分成几个逻辑清晰的部分?传统方…...

QMI8658A六轴传感器校准避坑指南:从硬件摆放到数据可视化

QMI8658A六轴传感器校准避坑指南:从硬件摆放到数据可视化 在物联网设备开发中,传感器数据的准确性直接影响最终产品的用户体验。QMI8658A作为一款高性能六轴惯性测量单元(IMU),其校准环节往往被开发者忽视,导致实际应用中出现数据…...

Gemma-3-12b-it本地AI策展助手:艺术作品图+风格流派自动归类

Gemma-3-12b-it本地AI策展助手:艺术作品图风格流派自动归类 1. 工具概述 Gemma-3-12b-it是一款基于Google Gemma-3-12b-it大模型开发的本地多模态交互工具,专门针对艺术作品的图像识别与风格流派分类进行了优化。这个工具能够帮助艺术从业者、策展人和…...

【第四周】论文精读:DARP: Difference-Aware Retrieval Policies for Imitation Learning

前言:行为克隆(Behavior Cloning, BC)是模仿学习中最简单且广泛使用的方法,但其在部署时极易受分布偏移(Covariate Shift)影响,导致误差累积和策略崩溃。来自华盛顿大学与丰田研究所等机构的研究…...

Phi-3-mini-128k-instruct入门:C语言基础问题解答与代码纠错

Phi-3-mini-128k-instruct入门:C语言基础问题解答与代码纠错 如果你刚开始学C语言,是不是经常被指针绕晕,或者对着自己写的代码不知道错在哪?别担心,这几乎是每个C语言初学者的必经之路。传统的学习方式,要…...

SOONet模型STM32项目展示:在嵌入式设备上实现离线视频摘要查询

SOONet模型STM32项目展示:在嵌入式设备上实现离线视频摘要查询 最近在捣鼓一些嵌入式设备上的AI应用,发现了一个挺有意思的方向:让那些资源受限的小设备,也能具备一些智能化的视频理解能力。比如,你车上的行车记录仪&…...

用Python和Pandas分析4万条攻击日志:从数据清洗到词云生成的全流程实战

用Python和Pandas分析4万条攻击日志:从数据清洗到词云生成的全流程实战 网络安全领域的数据分析正成为企业防御体系的核心能力。当面对数万条原始攻击日志时,如何快速提取有价值的信息?本文将手把手带你用Python完成从原始数据到可视化洞察的…...

基于Qwen3-ASR-1.7B的智能语音搜索系统

基于Qwen3-ASR-1.7B的智能语音搜索系统 1. 引言 想象一下这样的场景:你正在开车,突然想到要查一家餐厅的评价,但双手握着方向盘不方便打字。或者你在厨房做饭,手上沾满面粉,却想马上知道某个菜谱的详细步骤。这时候&…...

Granite TimeSeries FlowState R1预测效果实测:销售额预测误差低于3%

Granite TimeSeries FlowState R1预测效果实测:销售额预测误差低于3% 最近和一位做零售的朋友聊天,他正为库存问题头疼。备货多了怕积压,备货少了又怕错失销售机会,传统的预测方法总是差那么点意思,尤其是在搞促销活动…...

别再只盯着像素了!用FreMIM的频域视角,5分钟看懂医学图像分割的“全局观”

频域革命:FreMIM如何用傅里叶变换重塑医学图像分割认知 当我们凝视一张X光片时,眼睛捕捉的是空间域中的明暗变化——骨骼的轮廓、组织的阴影。但若将视线转向频域,看到的将是完全不同的图景:低频分量勾勒器官的整体形态&#xff0…...

Windows 11下OpenVINO 2022.1保姆级安装指南(AMD CPU实测可用)

Windows 11下OpenVINO 2022.1在AMD平台的实战部署指南 当大多数开发者认为OpenVINO只能在Intel硬件上运行时,我们却在AMD Ryzen 7 5800H上成功完成了全套计算机视觉模型的部署。本文将打破"Intel Only"的认知局限,手把手带你完成从环境准备到模…...

收藏!小白也能看懂:Anthropic 大模型 Agent 技术深度解析 (MCP+PTC+Skills+Subagents)

本文深入剖析了 Anthropic 公司提出的 MCP、PTC、Skills 和 Subagents 四大 Agent 技术概念,旨在帮助开发者更好地理解和构建智能 Agent 系统。MCP 作为标准化工具连接协议,PTC 优化了工具调用效率,Skills 以模块化方式为 LLM 注入专业知识&a…...

OpCore-Simplify:让黑苹果配置从复杂到简单的革命性工具

OpCore-Simplify:让黑苹果配置从复杂到简单的革命性工具 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在传统黑苹果配置领域&#xff0c…...

Qwen All-in-One避坑指南:纯净技术栈部署,彻底杜绝依赖冲突

Qwen All-in-One避坑指南:纯净技术栈部署,彻底杜绝依赖冲突 1. 引言:为什么需要All-in-One方案 1.1 传统多模型架构的痛点 在AI应用开发中,我们常常遇到这样的困境:为了实现一个完整的功能,需要组合多个…...

YOLOv13镜像新手教程:环境激活、代码目录,快速上手不求人

YOLOv13镜像新手教程:环境激活、代码目录,快速上手不求人 1. 从零开始:为什么你需要这个镜像 如果你刚接触目标检测,或者被YOLO系列复杂的依赖和环境配置搞得头大,那么这篇文章就是为你准备的。YOLOv13作为最新的实时…...

用MoveIt玩转机械臂:从RVIZ交互控制到真实硬件对接全流程

用MoveIt实现机械臂虚实联动的工程实践指南 当仿真环境中的机械臂轨迹规划已经稳定运行,如何将这套系统无缝迁移到真实硬件上?这是许多机器人开发者面临的第一个实质性挑战。MoveIt作为ROS生态中最成熟的运动规划框架,其价值不仅在于提供可视…...

前端密码安全实践:MD5加盐加密的深度解析与应用

1. 为什么前端密码加密非做不可? 几年前我接手过一个项目,客户数据库泄露导致所有用户密码裸奔。看着后台日志里那些明晃晃的"123456"和"password",我意识到前端加密不是选择题而是必答题。即便后端有加密措施&#xff…...

74HC590硬件计数器原理与Arduino工程实践

1. 74HC590 基础原理与工程定位 1.1 器件本质:非微控制器时代的精密时序协处理器 74HC590 并非传统意义上的“可编程器件”,而是一颗高度集成的 同步8位二进制计数器输出锁存器复合芯片 。其核心价值在于以纯硬件方式完成三项关键时序任务&#xff1a…...

计算机毕业设计springboot基于的就业推荐系统 基于Spring Boot框架的求职招聘智能撮合与人才推荐系统开发 Spring Boot驱动的个性化职业发展与岗位精准匹配系统构建

计算机毕业设计springboot基于的就业推荐系统(配套有源码 程序 mysql数据库 论文) 本套源码可以在文本联xi,先看具体系统功能演示视频领取,可分享源码参考。当前高校毕业生规模持续扩大,就业市场竞争日趋激烈,求职者面…...