来自AES加密的解密文本有额外的空间

问题描述:

我试图解密从标准的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

我怀疑部分的问题可能是原始密码在加密前被编码为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