解决DESCryptoServiceProvider加解密时弱密钥异常

数据加密标准 DES-密码学复习用(如侵则删) 数据加密标准 DES DES不安全主要原因:密钥空间太小 DES的特点: 分组长度:64位 (明文和密文 分组皆为64位) 密钥长度:56位(实际上是64位,8位用于奇偶校验) 轮数:16 16轮子密钥,每一个子密钥是48位 DES加密 加密的3个阶段: 初始置换:重排明文分组 16轮轮变换:Feistel结构 逆初始置换:前面有一个左右置换 初始置换: 64位明文分组M以位为一行,共8行(8*8置换表) IP:输入的第58位置换位输出的第一位,输入的第50位置换位输出的. 阅读详情

DES算法的密钥是8字节,由于其算法的特性所致,有一些密钥是不安全的,比如0xFF0xFF0xFF0xFF0xFF0xFF0xFF0xFF,
用该密钥对数据进行加密与解密运算,得到的结果是一样的,这样的密钥被称为弱密钥。在.NET中我们一般用DESCryptoServiceProvider
来进行DES运算,但是该类会去检测传入的密钥是否为弱密钥,如果是,就直接抛出异常。先看下面的代码:

复制代码
 1         public static string DESEncode(byte[] str, byte[] key)
 2         {
 3                 DESCryptoServiceProvider des = new DESCryptoServiceProvider();
 4                 des.Mode = CipherMode.ECB;
 5                 des.Padding = PaddingMode.None;
 6                 des.Key = key;
 7                 ICryptoTransform desCrypt = des.CreateEncryptor();
 8                 byte[] result = desCrypt.TransformFinalBlock(str, 0, str.Length);
 9                 return BitConverter.ToString(result).Replace("-", "");
10         }
复制代码

上面的代码网上到处能找到,但是如果你传入0xFF0xFF0xFF0xFF0xFF0xFF0xFF0xFF这样的密钥,在des.Key = key;这一行就会抛出
“不能为弱密钥”的异常。这在正常情况下是没问题的,微软为我们考虑的很周到,强制我们不要用安全性低的弱密钥。但是有时需求是万变
的,比如你操作的是一个硬件设备,往它里面写入一个密钥,但是厂家规定了第一次写入时必须用8个0xFF密钥进行加密,后面就用原密钥加密后
写入(银行的金融POS机几乎都是这种模式的),那岂不是就没法用C#来操作了吗?
我之前也是这么认为的,甚至都决定用C写个DES算法(这个网上有现成的),编译成DLL后用C#去调用。后来想到了反射,去绕过弱密钥的检测。
于是我先反编译了DESCryptoServiceProvider.Key这个属性的set方法,看看里面做了什么操作:

复制代码
 1 public override byte[] Key
 2 {
 3     set
 4     {
 5         if (value == null)
 6         {
 7             throw new ArgumentNullException("value");
 8         }
 9         if (!base.ValidKeySize(value.Length * 8))
10         {
11             throw new ArgumentException(Environment.GetResourceString("Cryptography_InvalidKeySize"));
12         }
13         if (IsWeakKey(value))
14         {
15             throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidKey_Weak"), "DES");
16         }
17         if (IsSemiWeakKey(value))
18         {
19             throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidKey_SemiWeak"), "DES");
20         }
21         base.KeyValue = (byte[]) value.Clone();
22         base.KeySizeValue = value.Length * 8;
23     }
24 }
复制代码

Key这个属性是DESCryptoServiceProvider的父类DES类的属性。果然,我们在里面发现了检测弱密钥的代码if (IsWeakKey(value))和
if (IsSemiWeakKey(value)),后者是检测半弱密钥的。那么抛除前面的检测语句,真正有作用的只有这两句

1 base.KeyValue = (byte[]) value.Clone();
2 base.KeySizeValue = value.Length * 8;

那么,下面的事情就明朗了,用反射去对这两个属性进行赋值

复制代码
 1         public static string DESEncode(byte[] str, byte[] key)
 2         {
 3             DESCryptoServiceProvider des = new DESCryptoServiceProvider();
 4             des.Mode = CipherMode.ECB;
 5             des.Padding = PaddingMode.None;
 6 
 7             FieldInfo fi = des.GetType().GetField("KeyValue", BindingFlags.Instance | BindingFlags.NonPublic);
 8             fi.SetValue(des, key);
 9             fi = des.GetType().GetField("KeySizeValue", BindingFlags.Instance | BindingFlags.NonPublic);
10             fi.SetValue(des, key.Length * 8);
11 
12             ICryptoTransform desCrypt = des.CreateEncryptor();
13             byte[] result = desCrypt.TransformFinalBlock(str, 0, str.Length);
14             return BitConverter.ToString(result).Replace("-", "");
15         }
复制代码

这时发现des.CreateEncryptor()这句还是抛出弱密钥异常,继续反编译

1 public virtual ICryptoTransform CreateEncryptor()
2 {
3     return this.CreateEncryptor(this.Key, this.IV);
4 }
复制代码
 1 public override ICryptoTransform CreateEncryptor(byte[] rgbKey, byte[] rgbIV)
 2 {
 3     if (DES.IsWeakKey(rgbKey))
 4     {
 5         throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidKey_Weak"), "DES");
 6     }
 7     if (DES.IsSemiWeakKey(rgbKey))
 8     {
 9         throw new CryptographicException(Environment.GetResourceString("Cryptography_InvalidKey_SemiWeak"), "DES");
10     }
11     return this._NewEncryptor(rgbKey, base.ModeValue, rgbIV, base.FeedbackSizeValue, CryptoAPITransformMode.Encrypt);
12 }
复制代码

它里面果然又进行了一次弱密钥判断,最终调用的是_NewEncryptor这个私有方法,于是就要反射去调用它。注意参数里的rgbIV是向量,
feedbackSize不清楚是干嘛的,但是这两个参数在ECB加解密模式下是不需要的,可以随便传。CryptoAPITransformMode这个枚举是internal的,
一样要用反射去得到。最终的代码如下:

复制代码
 1         public static string DESEncode(byte[] str, byte[] key)
 2         {
 3             DESCryptoServiceProvider des = new DESCryptoServiceProvider();
 4             des.Padding = PaddingMode.None;
 5 
 6             Type t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
 7             object obj = t.GetField("Encrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);
 8 
 9             MethodInfo mi = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic);
10             ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(des, new object[] { key, CipherMode.ECB, null, 0, obj });
11 
12             byte[] result = desCrypt.TransformFinalBlock(str, 0, str.Length);
13             return BitConverter.ToString(result).Replace("-", "");
14         }
复制代码
下面是解密的代码:
复制代码
 1         public static string DESDecode(byte[] str, byte[] key)
 2         {
 3             DESCryptoServiceProvider des = new DESCryptoServiceProvider();
 4             des.Padding = PaddingMode.None;
 5 
 6             Type t = Type.GetType("System.Security.Cryptography.CryptoAPITransformMode");
 7             object obj = t.GetField("Decrypt", BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly).GetValue(t);
 8 
 9             MethodInfo mi = des.GetType().GetMethod("_NewEncryptor", BindingFlags.Instance | BindingFlags.NonPublic);
10             ICryptoTransform desCrypt = (ICryptoTransform)mi.Invoke(des, new object[] { key, CipherMode.ECB, null, 0, obj });
11 
12             byte[] result = desCrypt.TransformFinalBlock(str, 0, str.Length);
13             return BitConverter.ToString(result).Replace("-", "");
14         }
复制代码

DESCryptoServiceProvider加密app.config winform中对数据库连接字符串的加密解密,string strProvider = "DataProtectionConfigurationProvider"; // string strProvider = "RSAProtectedConfigurationProvider"; 这两种只能在本机加密解密,我上传的代码是只能在程序中加密解密,原因在于加密时添加了自己的标识 - ouylvr ,解密后移除 - ouylvr ,并对配置文件进行读写操作。 立即下载

相关推荐

DESCryptoServiceProvider密码加密与解密

用户注册密码存入数据库经过DESCryptoServiceProvider加密,在用户登录的时候对密码进行解密或者把用户输入的密码再次进行加密查看和数据库是否一样。

3DES算法

本文基于.NET的C#实现3DES算法的加密和解密过程。可以用在加密软件、加密狗等。

路过 654

别再写前端了!用Gradio 3.x + HuggingFace Spaces,5分钟把你的Python算法变成网页应用

本文介绍如何利用Gradio 3.x和HuggingFace Spaces快速将Python算法转化为网页应用,无需前端开发经验。通过5行代码和简单的Git命令,即可实现专业级Web界面部署,大幅提升算法展示效率。特别适合算法工程师和数据科学家快速分享模型成果。

weixin_33443333的博客 332

C#与Node.js跨语言DES加解密互操作实战指南

对称加密是保障数据传输安全的基础技术,其核心原理是使用同一密钥进行加密和解密,确保只有授权方才能访问信息。DES(数据加密标准)作为一种经典的分组加密算法,因其实现广泛、计算资源消耗相对较低,在特定场景下仍有应用价值。在微服务架构和前后端分离的工程实践中,不同技术栈(如C#后端与Node.js前端)间的安全数据交换是常见需求。实现跨语言加解密互操作的关键在于精确对齐加密模式、填充方式和数据编码格式。本文聚焦DES算法,深入解析CBC与ECB模式、PKCS7填充等核心概念,并提供C#与Node.js两端完整、

weixin_33980459的博客 337

避坑指南:ZYNQ MPSOC QSPI固化时MT25QU256闪存的特殊配置

本文针对Xilinx ZYNQ UltraScale+ MPSoC平台,详细解析了使用Vitis工具将BOOT.bin固化至Micron MT25QU256ABA QSPI NOR Flash时的特殊配置与避坑指南。重点阐述了Init文件的真实作用、电压与频率的精确匹配策略,以及针对该闪存型号的初始化序列,帮助工程师解决烧录失败、启动异常等常见问题,确保系统可靠启动。

weixin_29175469的博客 270

【无标题】EXCEL实现刷题

运用Excel开发的刷题工具,具有普遍实用性,可将WORD的试题自动导入并实现刷题。

weixin_44081794的博客 2971

关于DESCryptoServiceProvider类

DESCryptoServiceProvider是.NET框架中提供的一个类,用于实现数据加密标准(DES)对称加密算法。DES是一种对称加密算法,用于对数据进行加密和解密。

qq_64410237的博客 986

视觉惯性SLAM系列——ORB-SLAM3的整体介绍及各个线程的功能(五)

跟踪线程(Tracking Thread)作用:负责处理每一帧图像,进行相机位姿的估计和定位。它首先执行与前一帧图像的特征匹配,然后通过仅运动(motion-only)BA(Bundle Adjustment)优化位姿。如果跟踪失败,它会尝试在所有地图中进行重定位。此外,跟踪线程还负责决定何时插入新的关键帧,以及何时将关键帧从局部地图中移除。详细介绍见局部建图线程(Local Mapping Thread)作用:管理局部地图,向活跃地图添加关键帧和点,移除多余的关键帧和点。

曾经也曾立志 1004

DESCryptoServiceProvider加密解密的简单使用例子

  DES.cs using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Security.Cryptography; namespace Wpfbinding { class DES { DESCry...

weixin_30740581的博客 520

免费AI视频生成全流程:通义千问+Seedance 2.5+Grok实战指南

AI视频生成正在成为内容创作的重要方式,但高昂的API费用常让个人创作者望而却步。实际上,通过合理组合云端免费工具,也能搭建一条完整的视频生产链路:利用大模型生成脚本,用视频生成模型将文本渲染成画面,再借助多模态模型进行一致性校验。这种“文本+视频+多模态”的协作模式,将复杂的生成任务解耦为可独立调用的模块,既降低了本地硬件要求,也为批量内容验证提供了低成本方案。该流程适用于短视频素材快速产出、产品Demo验证以及AI应用集成等场景,核心在于打通免费账号、API调用与批量任务调度。本文以通义千问、Seeda

weixin_29044157的博客 378

SAP Fiori 会话超时全解析:从 Launchpad 到 Identity Authentication 的统一策略

SAP Fiori会话超时机制解析与配置策略 本文深入探讨SAP Fiori项目中的会话超时机制,分析其对系统安全和用户体验的双重影响。文章系统拆解了SAP Fiori Launchpad与SAP Cloud Identity Services之间的会话超时工作原理,重点介绍了两种超时机制:服务器驱动的超时(通过SESSION_TIMEOUT_STOP_DATA_REFRESH参数控制)和UI驱动的超时(通过SESSION_TIMEOUT_INTERVAL_IN_MINUTES参数控制)。文中结合制造业产线

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 213

DES弱密钥

先来回顾一下des的加密过程 在不考虑奇偶校验的情况下DES的弱密钥共有以下8个: 0x0101010101010101 0xFEFEFEFEFEFEFEFE 0xE0E0E0E0F1F1F1F1 0x1F1F1F1F0E0E0E0E 0x0000000000000000 0xFFFFFFFFFFFFFFFF 0xE1E1E1E1F0F0F0F0 0x1E1E1E1E0F0F0F0F 这些...

qq_44290978的博客 9062

使用 vLLM 和 YaRN 扩展技术部署 Qwen3-32B 大模型:实现 80K 长文本推理

vLLM 是一个高性能的 LLM 推理和服务引擎,以其高效的注意力机制(PagedAttention)和优异的内存管理著称。它提供了与 OpenAI API 兼容的接口,使得现有应用可以无缝迁移。通过vLLM与YaRN技术的结合,我们成功将Qwen3-32B的上下文处理能力从32K扩展到80K,为长文本应用场景提供了强大的技术支持。这种部署方案兼具高效性和实用性,是处理大模型长上下文需求的优选方案。随着硬件和算法的不断进步,我们期待看到更大上下文窗口的模型服务成为可能。延伸阅读vLLM官方文档。

Ven%的博客 1748

C# 3DES加密及弱密钥处理

3DES加密,以及避过.net弱密钥检测。代码根据网上代码进行的修改 private static byte[] ThreeDES(byte[] key, byte[] str) { TripleDESCryptoServiceProvider tdsc = new TripleDESCryptoServiceProvider();

MHSMIE的专栏 5716

从零开始学习PX4源码0(固件下载及编译)

本节主要记录从零开始学习PX4源码1(固件下载)的过程,欢迎批评指正!!!下载固件主要分为两个版本,之前稳定版本和最新官网发布版本,为什么要下载两个版本,主要是说明两个版本有一定的差异(开发环境及源码文件格式等),我们是从之前版本开始学习,为什么不从最新的?因为之前版本代码文件格式还是固定的,最新的变化很大,不利于初学者学习,apm和px4不好的地方就是之前版本v1.7.2和最新版本v1.14.0有些文件总是在变化,这样很不好。

陌城烟雨 4616

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

.net中使用TripleDESCryptoServiceProvider进行3DES加密遇到弱密钥的问题

在使用TripleDESCryptoServiceProvider进行3DES加密的时候,使用16byte全F的密钥,抛出异常,提示弱密钥,但是该密钥是由上游厂商提供不能随意修改。因此只能想办法屏蔽掉弱密钥检查,即让isWeakKey方法返回false。 有2种解决方法: 一是重写TripleDESCryptoServiceProvider,虽然网上有现成的源码,但还是太麻烦。 二是利用.n...

weixin_30381317的博客 637

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

探讨NET Core数据进行3DES加密或解密弱密钥问题

【导读】之前写过一篇《探讨.NET Core数据进行3DES加密和解密问题》,最近看到有人提出弱密钥问题,换个强密钥不就完了吗,猜测可能是与第三方对接导致很无奈不能更换密钥,所以产生本文...

dotNET跨平台 2992

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C# RSACryptoServiceProvider加密解密签名验签和DESCryptoServiceProvider加解密

自己做数字签名加密解密这就了,对这些东西有一点点懂,可能自己整理的有些错误。  C#在using System.Security.Cryptography下有 DESCryptoServiceProvider RSACryptoServiceProvider  DESCryptoServiceProvider 是用于对称加密 RSACryptoServiceProvider是用于非对称加密

counterm的专栏 2059

C#中使用DESCryptoServiceProvider已过时的解决办法

C# DESCryptoServiceProvider已过时的解决办法

bianjian4802的博客 4539

DESCryptoServiceProvider 类加密解密

定义一个包装对象来访问加密服务提供程序 (CSP) 版本的数据加密标准 (DES) 算法。 此类不能被继承。

君子居易 1045

接口出现System.Security.Cryptography.CryptographicException 解决办法

我总结了一下出现证书无法加载的原因有以下三个 1.证书密码不正确,微信证书密码就是商户号 解决办法:请检查证书密码是不是和商户号一致 2.IIS设置错误,未加载用户配置文件 解决办法:找到网站使用的应用程序池-->右击-->高级设置-->打开如下图-->在加载用户配置文件选择true 3.如果以上两个方案都不能解决问题,就有可能是加载证书时没有给定证书存储标识 解决方法:在加载证书方法时使用以下方法,请注意第三个参数 X509C...

经历过大厂、小厂风风雨雨的程序佬 4903
上一篇: 对 PInvoke 函数的调用导致堆栈不对称的解决方法
下一篇: vs2010设置不自动加载DevExpress插件
lonet
博客等级 码龄22年 71粉丝 107原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值