解决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

Basilisk库教程

要在仿真中执行模块,其调度由Basilisk的[Process]和[Task]容器控制。BSK[Task]包含一系列模块,这些模块都以相同的更新频率执行。一个[Process]本质上是一个任务组,可以包含多个相关的任务。例如,在多星仿真中,你可以为每颗卫星创建一个[Process],以便将相关任务和嵌入式模块有序地组织起来。下图展示了一个示例布局,其中bskSat卫星的动力学被添加到与飞行软件(FSW)算法分开的进程中,这些算法在该卫星上执行。在每个进程中,设置了若干任务,这些任务以指定的频率进行评估。

weixin_57997461的博客 1137

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

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

weixin_33980459的博客 337

RK3588部署Zipformer模型问题总结

本文分享了在RK3588嵌入式设备上部署小米Zipformer语音识别模型时遇到的问题及解决方法。主要遇到两个问题:1)在rknn_model_zoo例程编译时出现静态库版本不兼容,通过重新编译kaldi-native-fbank库并修改链接路径解决;2)sherpa-onnx编译时提示缺少portaudio库,通过修改编译脚本启用相关宏定义后成功编译。最终成功在RK3588上运行Zipformer模型,测试结果显示该模型具有较好的识别效果和实时性(RTF=0.22),验证了其在边缘设备上的适用性。

pkyang2004的博客 2145

瑞芯微RK3506开发板Ethercat主站性能优化实战:从内核配置到微秒级延迟控制

本文详细介绍了在瑞芯微RK3506开发板上实现EtherCAT主站微秒级延迟控制的实战优化方案。核心在于部署Preempt-RT实时内核,并进行深度系统调优,包括CPU隔离、中断亲和性设置、内存锁定及电源管理调整。通过绕过Linux网络栈的专用驱动加载与配置,最终实现了稳定的高性能实时控制,满足工业自动化需求。

tcp8optimizer的博客 315

关于DESCryptoServiceProvider类

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

qq_64410237的博客 986

IMU标定中的Allen方差

Allen方差 Allen方差是IMU标定任务中的常用工具。IMU标定可以分为确定性误差和随机误差,确定性误差包括:scale、bias、misalignment。随机误差则主要是高斯白噪声和bias随机游走。Allen方差主要用于标定随机误差。 Allen方差获取 Allen方差的计算方法如下: 保持IMU静止, 采集N个数据点。 将N个点定长分组,常用的交叠式Allen方差如下(n=3): 对于每个子集,计算均值后,计算相邻两组的方差,得到的时间-方差曲线即为Allen方差。 Alle

realjc的博客 5734

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

华为OD机试真题 新系统2026-04-01 C语言 实现【计算数列位置N的值】

1、输入M、N两个数,则按照以下规则形成一个数列; 2、数列的前M个元素的值为1到M; 3、从M+1个元素开始,计算的逻辑为: 如果其前面的M个元素中,存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之如果其前面的M个元素中,不存在值相同的元素,则该位置上的数值等于前面M个数中最大的数值与最小的数值之差;

MISAYAONE的博客 589

【制作100个unity游戏之28】花半天时间用unity复刻童年4399经典小游戏《黄金矿工》(附带项目源码)

在游戏发展史上,有些游戏以其简单而耐玩的特性,深深地烙印在了玩家的记忆中。《黄金矿工》就是其中之一,它曾经在4399等游戏平台上掀起了一股游戏热潮。这款游戏不仅给无数玩家带来了欢乐,还让他们体验到了挖掘金矿的刺激与乐趣。在这个项目中,我们将花费半天的时间,利用Unity引擎,重新打造这款经典小游戏。通过复刻《黄金矿工》,我们不仅是在向童年的回忆致敬,更是在挖掘游戏设计的精髓。在这个过程中,我们将学习如何实现游戏的核心玩法,设计简洁而有效的游戏机制。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2902

DES弱密钥

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

qq_44290978的博客 9062

YOLOv11改进 | 注意力篇 | YOLOv11引入CA注意力机制

摘要:最近关于移动网络设计的研究已经证明了通道注意力(例如,挤压和激励注意力)对于提升模型性能的显着有效性,但它们通常忽略了位置信息,而位置信息对于生成空间选择性注意力图很重要。到此本文的正式分享内容就结束了,在这里给大家推荐我的YOLOv11改进有效涨点专栏,本专栏目前为新开的,后期我会根据各种前沿顶会进行论文复现,也会对一些老的改进机制进行补充,如果大家觉得本文帮助到你了,订阅本专栏,关注后续更多的更新~3.2 在Extramodule里创建CA。在CA.py文件里添加给出的CA代码。

tsg6698的博客 2979

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

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

MHSMIE的专栏 5716

2026最新版OpenClaw安装:Windows WSL2从零到跑通

Windows WSL2安装OpenClaw指南 本文详细介绍了在Windows系统上通过WSL2部署OpenClaw AI助理的完整流程。WSL2结合了Windows易用性和Linux高性能,特别适合Windows用户、开发者、学生和技术爱好者。文章涵盖硬件要求(推荐i5/16GB/SSD)、系统准备(Windows 10/11+WSL2)、环境部署(Python/Node.js/Redis)和OpenClaw配置(克隆/编译/初始化)等关键步骤。通过WSL2,用户可在保留Windows操作习惯的同

一键难忘的博客 2345

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

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

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

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

weixin_30381317的博客 637

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

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

dotNET跨平台 2992

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

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、付费专栏及课程。

余额充值