2011-04-13 51 views
2

我試圖解密從標準的SqlMembershipProvider存儲在數據庫中的密碼。爲了做到這一點,我砍死在一起以下控制檯應用程序:來自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; 
    } 

這確實解密文本,但是,而不是生成的文本是類似於「密碼1」,它是「\ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0 \ 0P \ 0a \ 0s \ 0s \ 0w \ 0o \ 0r \ 0d \ 01 \ 0「寫入控制檯作爲一堆空格,然後是「密碼1」。任何想法我做錯了什麼?

+4

解密密碼?咦?它們應該存儲爲單向散列,對吧? – 2011-04-13 00:48:13

+0

我看到一個'iv',但沒有[操作模式](http://en.wikipedia.org/wiki/Modes_of_operation)或[填充](http://en.wikipedia.org/wiki/Padding_(cryptography) )) - 也許密碼被加密到數據庫中,使用不同的加密或填充模式,而不是你用來解密的密碼? (操作方式似乎不太可能,因爲你確實得到了一些有意義的數據,但是仍然可以找到加密程序做了什麼,並將其準確反向。:) – sarnold 2011-04-13 00:57:43

+4

@Mitch小麥,這些來自遺留系統,我遺傳。我正在對它們進行解密,以便我可以使用salted hash來恢復它們。 – 2011-04-13 01:01:41

回答

2

我懷疑部分的問題可能是原始密碼在加密前被編碼爲UTF-16,並且您將其解碼爲UTF-8。試着改變你的Decrypt方法的最後一行:

return Encoding.Unicode.GetString(resultArray); 

這可能沒有什麼解釋所有這些虛假的前導零。很奇怪...

編輯...

其實,我似乎記得SqlMembershipProvider前綴與加密前16個字節的鹽,你可能會能夠在這種情況下,密碼字節擺脫這樣的:

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

但是,這仍然沒有解釋爲什麼這16個字節都是零,而不是一堆隨機值...

+0

你是對的!這刪除了密碼中的空格,但不是主要的空格。 – 2011-04-13 01:53:10

+0

因此,在數據庫中有一個鹽字段,當我解密它時,它需要作爲「iv」的輸入。你可能是對的,我可以簡單地做你的建議,我會用密碼開始測試它,等等,以確保。 – 2011-04-13 02:32:58