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

[C#] 解决jsencrypt RSA加密后C#解密长度异常问题

1. 异常现象解析为什么C#解密会失败最近在做一个前后端分离项目时遇到了一个让人头疼的问题前端用jsencrypt做的RSA加密传到C#后端解密时经常报错。错误信息显示The length of the data to decrypt is not valid for the size of this key翻译过来就是要解密的数据长度不符合密钥大小。这个问题最诡异的地方在于它并不是每次都会出现而是有一定概率性。经过反复测试发现当加密的明文内容较短时出现这个错误的概率会明显增加。比如加密hello这种短字符串时十次里可能有六七次会失败而加密一段较长的JSON数据时可能十次才会失败一两次。通过抓包分析发现前端生成的Base64密文长度确实存在差异。正常情况下1024位RSA密钥加密后的密文Base64长度应该是固定的172个字符实际内容长度128字节。但出现问题时密文长度可能会缩短到170甚至168个字符。2. 深入理解RSA加密规范要彻底解决这个问题我们需要先了解RSA加密的标准规范。RFC 8017也就是PKCS #1 v2.2中明确规定RSA加密后的密文长度必须等于密钥模数长度。对于1024位密钥来说就是128字节。jsencrypt库在实现时做了个优化当加密结果的前几位是0x00时它会把这些前导零去掉以节省空间。这在纯JavaScript环境下没有问题因为jsencrypt的解密方法会自动补全这些零。但其他语言的标准库如C#的RSACryptoServiceProvider会严格校验密文长度导致解密失败。这种现象在密码学中被称为非确定性加密——同样的明文每次加密可能产生不同的密文。虽然增加了安全性但也带来了跨语言兼容性问题。3. 前端解决方案补全密文长度第一种解决思路是在前端对密文进行补全。具体操作是在调用jsencrypt加密后检查密文长度并进行必要的填充function encryptWithPadding(publicKey, plaintext) { const encrypt new JSEncrypt(); encrypt.setPublicKey(publicKey); const ciphertext encrypt.encrypt(plaintext); // 计算预期的字节长度1024位密钥128字节 const expectedLength 128; const binaryString atob(ciphertext); // 前补0x00直到达到预期长度 const padded binaryString.padStart(expectedLength, \0); return btoa(padded); }这个方案的优点是一次性解决问题后端无需修改保持前端加密的灵活性符合RFC标准规范但缺点也很明显需要修改所有调用加密的地方增加了前端代码复杂度可能影响性能特别是移动端4. 后端解决方案C#解密前补全第二种方案是在C#后端解密前先对密文进行校验和补全。这种方法更适合已有大量前端代码难以修改的场景public static string DecryptWithPadding(string privateKey, string ciphertext, int keySize 1024) { // 计算预期的字节长度 int expectedLength keySize / 8; byte[] data Convert.FromBase64String(ciphertext); // 前补0x00直到达到预期长度 if (data.Length expectedLength) { var newData new Listbyte(data); while (newData.Count expectedLength) { newData.Insert(0, 0x00); } data newData.ToArray(); } // 正常解密流程 using (var rsa new RSACryptoServiceProvider(keySize)) { rsa.FromXmlString(privateKey); byte[] decrypted rsa.Decrypt(data, false); return Encoding.UTF8.GetString(decrypted); } }这个方案的优势在于前端代码完全不用修改集中处理所有解密请求可以灵活调整密钥长度不过需要注意每次解密都需要额外处理要确保密钥长度参数正确需要处理可能的异常情况5. 密钥长度与密文关系详解很多开发者对RSA密钥长度和密文长度的关系存在误解。这里详细说明下密钥长度指模数n的比特数常见的有1024、2048、4096等密文长度等于模数的字节数即密钥长度/81024位 → 128字节2048位 → 256字节4096位 → 512字节Base64编码后的字符串长度计算公式为Math.Ceiling(byteLength / 3.0) * 4所以128字节 → 172字符128/3≈42.67 → 43×4172256字节 → 344字符512字节 → 684字符在调试时可以通过这个公式快速判断密文长度是否正确。6. 完整的前后端交互示例为了帮助大家更好地理解这里给出一个完整的前后端交互示例前端JavaScript代码// 加密函数 function encryptData(publicKey, data) { const encrypt new JSEncrypt(); encrypt.setPublicKey(publicKey); let ciphertext encrypt.encrypt(data); // 补全处理 const binaryStr atob(ciphertext); const padded binaryStr.padStart(128, \0); return btoa(padded); } // 使用示例 const pubKey -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC...省略... -----END PUBLIC KEY-----; const encrypted encryptData(pubKey, Hello World); console.log(加密结果:, encrypted);后端C#代码public class CryptoHelper { public static string DecryptRSA(string privateKey, string ciphertext, int keySize 1024) { try { byte[] data Convert.FromBase64String(ciphertext); int expectedLength keySize / 8; // 长度补全 if (data.Length expectedLength) { var list new Listbyte(data); while (list.Count expectedLength) { list.Insert(0, 0x00); } data list.ToArray(); } using (var rsa new RSACryptoServiceProvider(keySize)) { rsa.FromXmlString(privateKey); byte[] decrypted rsa.Decrypt(data, false); return Encoding.UTF8.GetString(decrypted); } } catch (Exception ex) { // 处理解密失败 return null; } } }7. 其他注意事项与优化建议在实际项目中除了解决基本的解密问题外还需要考虑以下方面性能优化避免频繁创建RSACryptoServiceProvider实例考虑使用RSA.Create()替代.NET Core推荐对公钥/私钥进行缓存错误处理添加详细的日志记录区分长度异常和其他解密错误考虑重试机制安全性增强使用OAEP填充模式RSACryptoServiceProvider参数设为true定期更换密钥对敏感数据添加额外的校验机制跨平台兼容性测试测试不同密钥长度1024/2048/4096测试不同语言/平台间的互操作性验证边缘情况空字符串、超长文本等我在实际项目中遇到过这样的情况测试环境一切正常但上线后解密失败率突然升高。后来发现是因为生产环境使用了2048位密钥而测试环境用的是1024位。所以一定要确保前后端使用的密钥长度一致。

相关文章:

[C#] 解决jsencrypt RSA加密后C#解密长度异常问题

1. 异常现象解析:为什么C#解密会失败? 最近在做一个前后端分离项目时,遇到了一个让人头疼的问题:前端用jsencrypt做的RSA加密,传到C#后端解密时经常报错。错误信息显示"The length of the data to decrypt is not…...

JavaScript输出技巧大揭秘

JavaScript 输出 尊重每一个选择,无论是对的还是错的,它们都是我们成长中的重要一环,让生命愈发丰盈。生命中的每一次努力都是对未来的美好期待,愿我们都能心怀感恩,迎接每一个崭新的日子。感恩生活中的每一份际遇&…...

MCP 2.0 TLS 1.3握手链路被绕过?深度解析PSK+ECH组合加密失效案例与3种国密SM2/SM4增强补丁

第一章:MCP 2.0协议安全规范概览MCP 2.0(Managed Control Protocol 2.0)是面向云原生环境设计的轻量级设备控制与状态同步协议,其安全规范聚焦于端到端通信机密性、身份强认证、操作不可抵赖性及最小权限访问控制。相比1.x版本&am…...

动态Vault:安全密钥管理的未来

动态Vault概述 动态Vault是一种用于安全存储和管理敏感数据的系统,能够在运行时动态生成和销毁密钥,确保数据的安全性。这种技术广泛应用于云计算、微服务架构和分布式系统中,提供了一种灵活且安全的密钥管理方案。动态Vault的核心在于其动态…...

WebSocket+Redis实现实时消息同步

WebsocketRedis实现微服务消息实时同步 在微服务架构中,实时消息同步是一个常见需求。WebSocket提供全双工通信能力,Redis作为高性能缓存和消息中间件,两者结合可实现高效的跨服务实时消息同步。以下方案详细描述了技术实现细节。 技术架构设…...

Hadoop MapReduce核心技术解析

Hadoop MapReduce 技术解析 Hadoop MapReduce 是一个分布式计算框架,用于处理大规模数据集。其核心思想是将计算任务分解为多个小任务,分布在集群中的多个节点上并行执行,最终合并结果。MapReduce 包含两个主要阶段:Map 和 Reduce…...

利用JDBG和SM37高效调试后台Job的实战指南

1. 为什么需要调试后台Job? 后台Job在SAP系统中扮演着重要角色,它们通常用于执行批量数据处理、报表生成等耗时操作。但问题来了:当这些Job在无人值守的状态下运行时,如果突然报错,我们该怎么快速定位问题?…...

跨平台开发新范式:Lima让macOS无缝运行Linux容器环境

跨平台开发新范式:Lima让macOS无缝运行Linux容器环境 【免费下载链接】lima Linux virtual machines, with a focus on running containers 项目地址: https://gitcode.com/GitHub_Trending/lim/lima 在macOS上开发Linux应用时,你是否曾为环境不一…...

轻量React开发利器:nextui组件库全解析

轻量React开发利器:nextui组件库全解析 【免费下载链接】nextui 🚀 Beautiful, fast and modern React UI library. 项目地址: https://gitcode.com/GitHub_Trending/ne/nextui 在现代前端开发领域,构建既美观又高性能的用户界面往往需…...

从零搭建个人语料库:比收藏Prompt重要10倍的AI提升秘籍

文章指出,影响AI输出质量的关键并非Prompt技巧,而是底层语料库的建设。作者详细阐述了个人语料库的三层结构(高质量输入、标准化处理、反馈闭环),并提供了从收集、清洗到向量化、使用的实操步骤。强调通过积累和整理个…...

全栈开发指南:从零构建模块化智能协作系统

全栈开发指南:从零构建模块化智能协作系统 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 理论认知:模块化智能系统的设计…...

五款优质WordPress原创主题

市面上WordPress主题品类繁多,不同主题针对不同建站需求打造专属特性。以下精选五款原创WordPress主题,深度解析每款主题的核心特色与核心优势,帮你精准匹配建站方案。一、Grace主题 —— 优雅大气的高品质WordPress主题Grace主题主打优雅大气…...

Postgres表结构迁移实战:用Navicat从导出到导入的完整流程(含常见错误修复)

Postgres表结构迁移实战:用Navicat从导出到导入的完整流程(含常见错误修复) 在数据库运维和开发过程中,表结构迁移是一项常见但容易出错的任务。无论是环境升级、数据同步还是备份恢复,掌握高效的Postgres表结构迁移方…...

Open-AutoGLM快速上手:用自然语言操控手机,小白也能轻松学会

Open-AutoGLM快速上手:用自然语言操控手机,小白也能轻松学会 1. 什么是Open-AutoGLM? Open-AutoGLM是智谱开源的一个手机端AI智能助理框架,它能让你的普通安卓手机瞬间拥有类似"豆包手机"的智能操作能力。简单来说&am…...

王伟光:学习先天易学,首要认识太极图,理解能量守恒

王伟光:学习先天易学,首要认识太极图,理解能量守恒。太极图为什么配先天八卦?因为先天八卦是真的,后天八卦是假的。太极图体现真太阳时变速定律,同时预示能量守恒定律。王伟光先天奇门属于先天易学&#xf…...

如何用轻量级React框架提升前端开发效率?

如何用轻量级React框架提升前端开发效率? 【免费下载链接】nextui 🚀 Beautiful, fast and modern React UI library. 项目地址: https://gitcode.com/GitHub_Trending/ne/nextui 项目定位与核心价值 为什么选择这款轻量级React框架?…...

chronyd配置实战:如何让Linux服务器时间同步快如闪电(附iburst参数详解)

Chronyd配置实战:如何让Linux服务器时间同步快如闪电(附iburst参数详解) 在分布式系统和云计算环境中,时间同步的准确性往往决定着整个系统的可靠性。想象一下这样的场景:当你在Kubernetes集群中部署微服务时&#xff…...

AI Agent 设计模式:从理论到实践的完整指南

AI Agent 设计模式:从理论到实践的完整指南 AI Agent 是一种能够感知环境、自主决策并执行动作的智能实体。其设计模式涵盖了从理论模型到实际实现的全过程,涉及感知、决策、执行和反馈等核心模块。以下从理论框架、设计模式分类、实现方法和代码示例展开…...

机器学习、数据科学、深度学习、神经网络的区别与联系

机器学习、数据科学、深度学习与神经网络的区别与联系 机器学习(Machine Learning)、数据科学(Data Science)、深度学习(Deep Learning)和神经网络(Neural Networks)是当前人工智能领…...

Golang指针的基本概念

Golang 指针的基本概念 指针是编程语言中一个重要的概念,它允许直接操作内存地址。在Golang中,指针的使用相对简单,但理解其基本原理和用法对于编写高效、安全的代码至关重要。 什么是指针 指针是一种变量,其值为另一个变量的内存…...

Youtu-VL-4B-Instruct多模态推理:化学分子式图像识别+反应路径推理案例

Youtu-VL-4B-Instruct多模态推理:化学分子式图像识别反应路径推理案例 1. 引言:当AI“看懂”化学结构图 想象一下,你是一位化学专业的学生或研究员,面对一篇文献中复杂的分子结构图,需要快速理解它的构成&#xff0c…...

基于 HTML/CSS 的毕业设计:从静态页面到工程化实践的深度指南

最近在帮学弟学妹们看毕业设计,发现一个挺普遍的现象:很多同学觉得用 HTML 和 CSS 做个静态页面,能看就行,任务就算完成了。结果交上去的代码,结构混乱、样式互相覆盖、手机上一打开布局全乱,更别提后续维护…...

第九章:装饰器模式 - 动态增强的艺术大师

第九章:装饰器模式 - 动态增强的艺术大师 人生如逆水行舟,要在不断的拼搏中成长,唯有在艰难困苦面前依然坚持,才能开辟辽阔未来。真正的勇气在于面对困惑时的微笑,不怕未知,让内心的坚定信念指引我们走向光…...

Qwen3-ASR-1.7B镜像免配置优势:无需ffmpeg编译,原生支持mp3解码

Qwen3-ASR-1.7B镜像免配置优势:无需ffmpeg编译,原生支持mp3解码 如果你曾经尝试过部署一个语音识别模型,大概率会遇到一个让人头疼的问题:音频格式支持。特别是当你兴致勃勃地准备处理一个mp3文件时,却发现模型只认wa…...

GitHub 官宣 GitHub Copilot CLI 开发公测:AI CLI 大战

GitHub Copilot CLI 公测:AI 驱动的命令行革命 GitHub 近期宣布 Copilot CLI 进入开发公测阶段,标志着 AI 在命令行工具领域的深度渗透。这一工具旨在通过自然语言理解能力,帮助开发者更高效地完成终端操作,同时减少对复杂命令的记…...

TradingAgents-CN智能交易系统:从基础到进阶的全方位应用指南

TradingAgents-CN智能交易系统:从基础到进阶的全方位应用指南 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 一、概念解析&#xff…...

PyCharm2025.2 大更新,AI是亮点!

PyCharm2025.2 大更新,AI是亮点! 生活中的每一个精彩都是用心编织的梦想,愿我们在每个转角都能迎来新的希望与喜悦。每一个清晨都是一扇新的窗,打开它的方式在于勇敢,而非犹豫,让生活焕发无限的光彩。每一份…...

Leather Dress Collection从零开始:LoRA微调入门——基于Leather Romper数据集

Leather Dress Collection从零开始:LoRA微调入门——基于Leather Romper数据集 1. 引言 你有没有想过,让AI帮你设计一套独一无二的皮革服装?或者你是个服装设计师,想快速生成不同款式的皮革服装概念图?今天我要分享的…...

工业自动化必备:三相异步电机不停机效率检测实战(附MATLAB代码)

工业自动化必备:三相异步电机不停机效率检测实战(附MATLAB代码) 在现代化工业生产中,电机作为核心动力源,其运行状态直接影响着生产线的稳定性和能效表现。传统电机效率检测方法往往需要停机拆卸,不仅影响生…...

【LM】(九)语言模型评估实战:从困惑度Perplexity到模型优化策略

1. 困惑度Perplexity的本质与实战意义 第一次接触困惑度(Perplexity)这个概念时,我盯着公式看了半天也没明白它到底想表达什么。直到在实际项目中用起来才发现,这个看似抽象的概念其实非常直观。简单来说,困惑度就是衡量语言模型"有多困…...