代码之家  ›  专栏  ›  技术社区  ›  iMan Biglari

.NET中DES的弱密钥

  •  0
  • iMan Biglari  · 技术社区  · 11 年前

    我需要执行 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() 加密() 。我对C#很陌生,我迷路了。有什么想法吗?

    1 回复  |  直到 11 年前
        1
  •  3
  •   Vijay    11 年前

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

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

    相反,您必须传递1哪个CryptoAPITransformMode。解密时解密。