2011-01-06 31 views
1

在解密的字符串我得到長度數據的解密是無效的錯誤,當我打電話FlushFinalBlock功能長度來解密數據是在C#無效

key = Encoding.UTF8.GetBytes(stringKey.Substring(0, 8)); 
DESCryptoServiceProvider des = new DESCryptoServiceProvider(); 
Byte[] byteArray = Convert.FromBase64String(text); 
MemoryStream memoryStream = new MemoryStream(); 
CryptoStream cryptoStream = new CryptoStream(memoryStream, des.CreateDecryptor(key, IV), CryptoStreamMode.Write); 
cryptoStream.Write(byteArray, 0, byteArray.Length); 
cryptoStream.FlushFinalBlock(); 
return Encoding.UTF8.GetString(memoryStream.ToArray()); 

問題是什麼,以及如何解決它?

+1

你可以看看byteArray的長度?如果我記得正確的話,它應該是DES的8倍。 – DReJ 2011-01-06 09:08:24

回答

2

你並沒有顯示該字符串的加密方式,無論您是使用相同的密鑰和IV,等等...這是一個完整的工作例如,你可以適應您的方案:

class Program 
{ 
    private static byte[] DESKey = { 200, 5, 78, 232, 9, 6, 0, 4 }; 
    private static byte[] DESInitializationVector = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 

    static void Main() 
    { 
     var encrypted = Encrypt("foo bar"); 
     Console.WriteLine(encrypted); 
     var decrypted = Decrypt(encrypted); 
     Console.WriteLine(decrypted); 
    } 

    public static string Encrypt(string value) 
    { 
     using (var cryptoProvider = new DESCryptoServiceProvider()) 
     using (var memoryStream = new MemoryStream()) 
     using (var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateEncryptor(DESKey, DESInitializationVector), CryptoStreamMode.Write)) 
     using (var writer = new StreamWriter(cryptoStream)) 
     { 
      writer.Write(value); 
      writer.Flush(); 
      cryptoStream.FlushFinalBlock(); 
      writer.Flush(); 
      return Convert.ToBase64String(memoryStream.GetBuffer(), 0, (int)memoryStream.Length); 
     } 
    } 

    public static string Decrypt(string value) 
    { 
     using(var cryptoProvider = new DESCryptoServiceProvider()) 
     using(var memoryStream = new MemoryStream(Convert.FromBase64String(value))) 
     using(var cryptoStream = new CryptoStream(memoryStream, cryptoProvider.CreateDecryptor(DESKey, DESInitializationVector), CryptoStreamMode.Read)) 
     using(var reader = new StreamReader(cryptoStream)) 
     { 
      return reader.ReadToEnd(); 
     } 
    } 
} 
相關問題