用VB.NET实现DES-ECB加密(兼容弱密钥 Weak KEY)

首先,说一个标准的实现方法。(实现兼容Weak KEY的方向稍后再说)

此方法受.NET自身的限制,具有一定的局限性,无法使用DES弱密钥(Weak Key),如FFFFFFFFFFFFFFFF(十六进制),一旦使用程序就会报错(错误提示大意为:检测到弱密钥)。

因此,该代码无法用于设计智能卡应用(许多智能卡的初始DES密钥都属于.NET限制的“弱密钥”)。

'注:此处输入输出的字节数组内,均为二进制数据。如果需要使用文本(明文),请自行转换。
Dim inputByteArray As Byte()  '明文,以字节数组形式表达
Dim KeyAsBytes() As Byte  '密钥,以字节数组形式表达,8字节
Dim IVAsBytes() As Byte  '初始向量IV,以字节数组形式表达,8字节

Dim DES As New System.Security.Cryptography.DESCryptoServiceProvider()
DES.Key = KeyAsBytes
DES.IV = IVAsBytes
DES.Mode = Security.Cryptography.CipherMode.ECB  'DES-ECB模式
DES.Padding = Security.Cryptography.PaddingMode.None

Dim result() As Byte
result = DES.CreateEncryptor().TransformFinalBlock(inputByteArray, 0, inputByteArray.Length)  '运算结果为字节数组

下面讲实现兼容Weak KEY的方法。

网路上早已有大师们写出了功能相同的C#代码,主要原理是利用反射(reflection),绕过.Net对Weak KEY的侦测。

参考链接1:解决DESCryptoServiceProvider加解密时弱密钥异常_努力的犀牛的博客-CSDN博客_如何检测是否为弱密钥

参考链接2:C# 3DES加密及弱密钥处理_MHSMIE的专栏-CSDN博客

参考链接3:c# - Weak Key for DES in .NET - Stack Overflow

我们将C#的代码稍作修改,变成VB .Net代码。

    Private Function CreateWeakDESDecryptor(ByVal uKey() As Byte) As Security.Cryptography.ICryptoTransform
        Dim uIV() As Byte = New Byte() {&H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0}  'IV

        Dim DES As New System.Security.Cryptography.DESCryptoServiceProvider()
        DES.Mode = Security.Cryptography.CipherMode.ECB  'DES-ECB模式(该模式不需要IV)
        DES.Padding = Security.Cryptography.PaddingMode.None  '禁止自动填充

        Dim mi As System.Reflection.MethodInfo = DES.GetType().GetMethod("_NewEncryptor", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
        Dim Par() As Object = {uKey, DES.Mode, uIV, DES.FeedbackSize, 1}  '最后的1为解密,0为加密
        Dim trans As Security.Cryptography.ICryptoTransform = mi.Invoke(DES, Par)

        Return trans
    End Function

    Private Function CreateWeakDESEncryptor(ByVal uKey() As Byte) As Security.Cryptography.ICryptoTransform
        Dim uIV() As Byte = New Byte() {&H0, &H0, &H0, &H0, &H0, &H0, &H0, &H0}

        Dim DES As New System.Security.Cryptography.DESCryptoServiceProvider()
        DES.Mode = Security.Cryptography.CipherMode.ECB  'DES-ECB模式(该模式不需要IV)
        DES.Padding = Security.Cryptography.PaddingMode.None  '禁止自动填充

        Dim mi As System.Reflection.MethodInfo = DES.GetType().GetMethod("_NewEncryptor", Reflection.BindingFlags.NonPublic Or Reflection.BindingFlags.Instance)
        Dim Par() As Object = {uKey, DES.Mode, uIV, DES.FeedbackSize, 0}  '最后的1为解密,0为加密
        Dim trans As Security.Cryptography.ICryptoTransform = mi.Invoke(DES, Par)

        Return trans
    End Function


'使用如下方法调用
Dim uTmpEncText as Byte = New Byte() {&H6A, &HCC ,&H20 ,&H4F ,&H8E &HFB ,&HCC ,&HC7}
Dim uKey() as Byte = New Byte() {&H00 ,&H01 ,&H02 ,&H03 ,&H04 ,&H05 ,&H06 ,&H07}
Dim uTmpClearText() as Byte
 uTmpClearText = CreateWeakDESDecryptor(uKey).TransformFinalBlock(uTmpEncText, 0, 8)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值