【问题标题】:Weak Key for DES in .NET.NET 中 DES 的弱密钥
【发布时间】:2014-02-14 17:05:25
【问题描述】:

我需要使用零密钥执行DES 加密和解密操作。我在social.msdn.microsoft.com 上发现了这段代码,它绕过了.net 对 DES 密钥的检查:

public static class DESCryptoExtensions {
    public static ICryptoTransform CreateWeakEncryptor(this DESCryptoServiceProvider cryptoProvider, byte[] key, byte[] iv) {
        // reflective way of doing what CreateEncryptor() does, bypassing the check for weak keys
        MethodInfo mi = cryptoProvider.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);
        object[] Par = { key, cryptoProvider.Mode, iv, cryptoProvider.FeedbackSize, 0 };
        ICryptoTransform trans = mi.Invoke(cryptoProvider, Par) as ICryptoTransform;
        return trans;
    }

    public static ICryptoTransform CreateWeakEncryptor(this DESCryptoServiceProvider cryptoProvider) {
        return CreateWeakEncryptor(cryptoProvider, cryptoProvider.Key, cryptoProvider.IV);
    }

    public static ICryptoTransform CreateWeakDecryptor(this DESCryptoServiceProvider cryptoProvider, byte[] key, byte[] iv) {
        return CreateWeakEncryptor(cryptoProvider, key, iv);
    }

    public static ICryptoTransform CreateWeakDecryptor(this DESCryptoServiceProvider cryptoProvider) {
        return CreateWeakDecryptor(cryptoProvider, cryptoProvider.Key, cryptoProvider.IV);
    }
}

我正在使用这个类来封装加密和解密:

public class SimpleDES {
    private readonly byte[] IV = new byte[8] { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
    private byte[] mKey;
    private DESCryptoServiceProvider des;

    public SimpleDES(byte[] aKey) {
        if (aKey.Length != 8)
            throw new Exception("Key size must be 8 bytes");
        mKey = aKey;
        des = new DESCryptoServiceProvider();
        des.BlockSize = 64;
        des.KeySize = 64;
        des.Padding = PaddingMode.None;
    }

    public byte[] Encrypt(byte[] data) {
        if (data.Length != 8)
            throw new Exception("Data size must be 8 bytes");

        ICryptoTransform encryptor = des.CreateWeakEncryptor(mKey, IV);
        return encryptor.TransformFinalBlock(data, 0, data.Length);
    }

    public byte[] Decrypt(byte[] data) {
        if (data.Length != 8)
            throw new Exception("Data size must be 8 bytes");
        ICryptoTransform decryptor = des.CreateWeakDecryptor(mKey, IV);
        return decryptor.TransformFinalBlock(data, 0, data.Length);
    }
}

虽然Encrypt() 完美运行,但Decrypt() 的返回值与Encrypt() 相同。我对 C# 很陌生,我迷路了。有什么想法吗?

【问题讨论】:

    标签: c# .net reflection cryptography des


    【解决方案1】:

    这很简单。您在 CreateDecryptor 方法中调用相同的方法 CreateWeakEncryptor。所以,最后 MethodInfo mi = cryptoProvider.GetType().GetMethod("_NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance);

    总是返回一个加密方法。在调用该方法时,您将 0 作为最后一个参数传递,该参数始终等于枚举 CryptoAPITransformMode.Encrypt。

    相反,您必须在解密时传递 1 which CryptoAPITransformMode.Decrypt。

    【讨论】:

    • 对不起,我之前发布了一半的答案。现在我修改了。
    • 在检查了另一个代码 (stackoverflow.com/questions/744530/…) 之后,我得出了同样的结论。非常感谢:-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2015-06-22
    • 2017-06-09
    • 1970-01-01
    相关资源
    最近更新 更多