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

在使用TripleDESCryptoServiceProvider进行3DES加密的时候,使用16byte全F的密钥,抛出异常,提示弱密钥,但是该密钥是由上游厂商提供不能随意修改。因此只能想办法屏蔽掉弱密钥检查,即让isWeakKey方法返回false。

有2种解决方法:

一是重写TripleDESCryptoServiceProvider,虽然网上有现成的源码,但还是太麻烦。

二是利用.net的反射机制,手动创建ICryptoTransform实例,绕过.net自身的弱密钥检查,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Public Function Encrypt3DES(ByVal strString As String, ByVal strKey As String) As String
       '密文
       Dim destStr As String = ""
       '3DES加密对象
       Dim DES As TripleDESCryptoServiceProvider = New TripleDESCryptoServiceProvider()
       '初始向量
       Dim Iv() As Byte = {&H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0}
       '密钥
       Dim Key() As Byte = format.HexStringToByteArray(strKey)
 
       Dim mi As MethodInfo = DES.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic Or BindingFlags.Instance)
       Dim param() As Object = {Key, CipherMode.CBC, Iv, DES.FeedbackSize, 0}
       Dim DESEncrypt As ICryptoTransform = CType(mi.Invoke(DES, param), ICryptoTransform)
 
       '明文的byte[]形式
       Dim Buffer() As Byte = format.HexStringToByteArray(strString)
       '加密得到密文的byte[]形式
       Dim tmpStr() As Byte = DESEncrypt.TransformFinalBlock(Buffer, 0, Buffer.Length)
 
       '将密文转为可见字符
       destStr = format.ByteArrayToHexString(tmpStr)
 
       Encrypt3DES = destStr
   End Function

posted @   诚实小郎君  阅读(1407)  评论(1编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
点击右上角即可分享
微信分享提示