Och felet var ju lite pinsamt ... lösenordet för filen hashades vid kryptering, men jag hade missat att göra det vid dekryptering.
Sitter och försöker spara ner en krypterad sträng i en fil, för att sedan läsa tillbaka den i programmet, men stöter på patrull.
Hittade en klass på nätet som jag försöker använda för krypteringen:
http://hectorcorrea.com/blog/Encrypt-and-Decrypt-a-string-in-C-Sharp
Får inga felmeddelanden vid skrivning till fil, men när jag försöker hämta innehållet och dekryptera det får jag följande:
Felmeddelande skrev:
CryptographicException
Utfyllnaden är ogiltig och går inte att ta bort.
Jag tror att det är något fel i sättet jag sparar filen, för om jag öppnar filen i en textredigerare och kopierar innehållet och lägger in i en strängvariabel i C# och försöker dekryptera det så får jag samma fel. Om jag däremot dekrypterar det värdet jag skriver till filen så funkar det.
Markerar i koden nedan vilken rad felmeddelandet visas för.
Cryptoklassen
class Crypto {
private static readonly byte[] SALT = Encoding.ASCII.GetBytes("12345678");
public static string Encrypt(string textToEncrypt, string encryptionPassword)
{
var algorithm = GetAlgorithm(encryptionPassword);
byte[] encryptedBytes;
using (ICryptoTransform encryptor = algorithm.CreateEncryptor(algorithm.Key, algorithm.IV))
{
byte[] bytesToEncrypt = Encoding.UTF8.GetBytes(textToEncrypt);
encryptedBytes = InMemoryCrypt(bytesToEncrypt, encryptor);
}
return Convert.ToBase64String(encryptedBytes);
}
public static string Decrypt(string encryptedText, string encryptionPassword)
{
var algorithm = GetAlgorithm(encryptionPassword);
byte[] decryptedBytes;
using (ICryptoTransform decryptor = algorithm.CreateDecryptor(algorithm.Key, algorithm.IV))
{
byte[] encryptedBytes = Convert.FromBase64String(encryptedText);
decryptedBytes = InMemoryCrypt(encryptedBytes, decryptor);
}
return Encoding.UTF8.GetString(decryptedBytes);
}
private static byte[] InMemoryCrypt(byte[] data, ICryptoTransform transform)
{
MemoryStream memory = new MemoryStream();
using (Stream stream = new CryptoStream(memory, transform, CryptoStreamMode.Write))
{
stream.Write(data, 0, data.Length);
} // <-- HÄR KOMMER FELMEDDELANDET
return memory.ToArray();
}
private static RijndaelManaged GetAlgorithm(string encryptionPassword)
{
var key = new Rfc2898DeriveBytes(encryptionPassword, SALT);
var algorithm = new RijndaelManaged();
int bytesForKey = algorithm.KeySize / 8;
int bytesForIV = algorithm.BlockSize / 8;
algorithm.Key = key.GetBytes(bytesForKey);
algorithm.IV = key.GetBytes(bytesForIV);
return algorithm;
}
}
}
Kod för att spara och läsa filinnehåll
public void SaveToFile(string Filename, string Password)
{
string contents = Crypto.Encrypt("Testar lite", Password);
System.Windows.Forms.MessageBox.Show(Crypto.Decrypt(contents, Password)); // Funkar, får "Testar lite" i en messagebox.
System.IO.File.WriteAllText(Filename, contents, Encoding.UTF8);
}
public void LoadFromFile(string Filename, string Password)
{
string contents = System.IO.File.ReadAllText(Filename, Encoding.UTF8);
System.Windows.Forms.MessageBox.Show(Crypto.Decrypt(contents, Password)); // Funkar inte, Unhandled CryptographicException enligt ovan
}