来自AES加密的解密文本有额外的空格
本文关键字:空格 解密 AES 加密 来自 文本 | 更新日期: 2023-09-27 17:50:06
我试图从标准SqlMembershipProvider解密存储在数据库中的密码。为了做到这一点,我拼凑了以下控制台应用程序:
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;
}
这确实解密文本,但是产生的文本而不是类似的"密码",这是"' ' 0 ' ' 0 ' ' ' 0 ' 0 ' ' ' 0 ' 0 ' ' ' 0 ' 0 p ' ' 0 0 ' ' 0 w o ' ' 0 0 r ' 0 d ' 01 ' 0"写入控制台是一群空间,然后"p s s w o r d 1"。知道我哪里做错了吗?
我怀疑问题的部分可能是原始密码在加密之前被编码为UTF-16,而您将其解码为UTF-8。尝试更改Decrypt
方法的最后一行:
return Encoding.Unicode.GetString(resultArray);
这并不能解释所有那些虚假的前导零。非常奇怪…
编辑…
实际上,我似乎记得SqlMembershipProvider
在加密之前用16字节的salt作为密码字节的前缀,在这种情况下,您可能能够逃脱这样的事情:
return Encoding.Unicode.GetString(resultArray, 16, resultArray.Length - 16);
但是仍然不能解释为什么这16个字节都是零而不是一堆随机值…