我試圖解密從標準的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」。任何想法我做錯了什麼?
解密密碼?咦?它們應該存儲爲單向散列,對吧? – 2011-04-13 00:48:13
我看到一個'iv',但沒有[操作模式](http://en.wikipedia.org/wiki/Modes_of_operation)或[填充](http://en.wikipedia.org/wiki/Padding_(cryptography) )) - 也許密碼被加密到數據庫中,使用不同的加密或填充模式,而不是你用來解密的密碼? (操作方式似乎不太可能,因爲你確實得到了一些有意義的數據,但是仍然可以找到加密程序做了什麼,並將其準確反向。:) – sarnold 2011-04-13 00:57:43
@Mitch小麥,這些來自遺留系統,我遺傳。我正在對它們進行解密,以便我可以使用salted hash來恢復它們。 – 2011-04-13 01:01:41