2014-02-14 50 views
0

我需要使用零密钥执行DES加密和解密操作。我发现这social.msdn.microsoft.com代码绕过对DES密钥检查.NET规定:.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#很陌生,而且我迷路了。有什么想法吗?

回答

3

这很简单。您正在CreateDecryptor方法中调用CreateWeakEncryptor方法。因此,最后 MethodInfo mi = cryptoProvider.GetType()。GetMethod(“_ NewEncryptor”,BindingFlags.NonPublic | BindingFlags.Instance);

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

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

+0

对不起,一些我早些时候发布了一半的答案。现在我修改了。 – Vijay

+1

检查另一个代码后(http://stackoverflow.com/questions/744530/tripledes-specified-key-is-a-known-weak-key-for-tripledes-and-cannot-be-used?rq=1)我得出了同样的结论。非常感谢 :-) –