2011-04-13 5 views
2

표준 SqlMembershipProvider에서 데이터베이스에 저장된 암호를 해독하려고합니다. 그것은 "의 \ 0 \ 0 \ 0 \ 0이 실제로 텍스트를 해독 않습니다AES 암호화의 암호문에 여분의 공백이 있습니다.

static void Main(string[] args) 
    { 
     const string encryptedPassword = @"wGZmgyql4prPIr7t1uaxa+RBRJC51qOPBO5ZkSskUtUCY1aBpqNifQGknEfWzky4"; 
     const string iv = @"Jc0RhfDog8SKvtF9aI+Zmw=="; 
     var password = Decrypt(encryptedPassword, iv); 

     Console.WriteLine(password); 
     Console.ReadKey(); 
    } 

    public static string Decrypt(string toDecrypt, string iv) 
    { 
     var ivBytes = Convert.FromBase64String(iv); 
     const string decryptKey = "DECRYPTION_KEY_HERE"; 
     var keyArray = StringToByteArray(decryptKey); 
     var toEncryptArray = Convert.FromBase64String(toDecrypt); 
     var rDel = new AesCryptoServiceProvider() { Key = keyArray, IV = ivBytes}; 
     var cTransform = rDel.CreateDecryptor(); 
     var resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); 
     return Encoding.UTF8.GetString(resultArray); 
    } 

    public static byte[] StringToByteArray(String hex) 
    { 
     var numberChars = hex.Length; 
     var bytes = new byte[numberChars/2]; 
     for (var i = 0; i < numberChars; i += 2) 
      bytes[i/2] = Convert.ToByte(hex.Substring(i, 2), 16); 
     return bytes; 
    } 

그러나 대신"가 password1 "와 같은 결과 텍스트 인 무언가 :이 작업을 수행하기 위해, 나는 콘솔 응용 프로그램 다음과 함께 해킹 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0P \ 0a \ 0s \ 0s \ 0w \ 0o \ 0r \ 0d \ 01 \ 0 " 공백이 많으면 "P assword 1". 내가 뭘 잘못하고 있는거야?

+4

암호를 해독 하시겠습니까? 응? 그들은 단방향 해시로 저장해야합니다. 맞습니까? –

+0

'iv'가 표시되지만 [운영 모드] (http://en.wikipedia.org/wiki/Modes_of_operation) 또는 [패딩] (http://en.wikipedia.org/wiki/Padding_ (암호화))) - 아마도 암호가 암호 해독에 사용하는 것보다 다른 암호화 또는 패딩 모드를 사용하여 데이터베이스에 암호화 되었습니까? (작동 모드가 의미있는 데이터를 얻었으므로 보이지는 않지만 여전히 암호화 루틴이 수행하는 작업을 찾아 정확하게 되돌려 야합니다. :) – sarnold

+4

@Mitch 밀, 이것들은 이전 시스템의 것입니다. 상속 된. 나는 해독 된 해시를 사용하여 복원 할 수 있도록 정확하게 해독합니다. –

답변

2

부분의은 원래 암호가 암호화되기 전에 UTF-16으로 인코딩되어 UTF-8로 디코딩 한 것으로 의심됩니다. 당신의 Decrypt 방법의 마지막 줄을 변경해보십시오 :

return Encoding.Unicode.GetString(resultArray); 

비록 모든 의사 앞에 0을 설명하지 않습니다. 아주 이상한 ...

편집 ... 사실

, 기억하는 것 당신이 아마 수행 할 수 있습니다이 경우 암호화 전에 16 바이트 소금과 SqlMembershipProvider 접두사 암호 바이트 이 같은 뭔가 도망 ...

return Encoding.Unicode.GetString(resultArray, 16, resultArray.Length - 16); 

하지만 그 16 바이트 모두 0이 아닌 임의의 값의 무리는 이유 여전히는 설명하지 않습니다

+0

네가 맞아! 그것은 패스워드 안에서 공백을 제거했지만 선두 패스는 제거하지 않았습니다. –

+0

데이터베이스에는 salt 필드가 있습니다. 소금 필드는 해독 할 때 "iv"에 대한 입력으로 필요합니다. 당신이 제안한 것을 단순히 할 수 있다는 것이 옳을 수도 있습니다. 공백으로 시작하는 암호로 테스트 할 것입니다. –

관련 문제