.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 |
分类:
.NET
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 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,谁才是开发者新宠?