2014-02-14 1 views
0

0의 키를 사용하여 DES 암호화 및 암호 해독 작업을 수행해야합니다. 내가 암호화 및 암호 해독 캡슐이 클래스를 사용하고.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); 
    } 
} 

을 : 내가 체크 .NET은 DES 키에 부과 우회 social.msdn.microsoft.com에이 코드를 발견

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 마일 = cryptoProvider.GetType() getMethod 메소드 ("_ NewEncryptor", BindingFlags.NonPublic | BindingFlags.Instance).;

은 항상 암호화 프로그램 방법을 반환합니다. 그 메소드를 호출하는 동안 항상 0을 마지막 매개 변수로 전달합니다. 마지막 매개 변수는 항상 CryptoAPITransformMode.Encrypt 열거 형과 같습니다.

대신 당신은 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) 나는 같은 결론에 도달했다. 고마워 .-) –

관련 문제