webForumDet fria alternativet

C# - Problem att spara och återläsa krypterad sträng

.NET

1 svar · 1 778 visningar · startad av metalboy

Medlem sedan jan. 2005953 inlägg
Frågan#1

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
}
Medlem sedan jan. 2005953 inlägg
#2

Och felet var ju lite pinsamt ... lösenordet för filen hashades vid kryptering, men jag hade missat att göra det vid dekryptering.

381 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
135 ms — deklarationer (db)
0 ms — hämta statistik (cache)
242 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)