I'm trying to store a password in a file that I'd like to retrieve for later. Hashing is not an option as I need the password for connecting to a remote server for later.
The following code works well, but it creates a different output each time even though the key is the same. This is bad as when the application shuts down and restarts I won't be able to retrieve my password any more. How can I store passwords in a file and retrieve them later?
public class EncyptDecrypt {
    static System.Security.Cryptography.TripleDESCryptoServiceProvider keyProv = new System.Security.Cryptography.TripleDESCryptoServiceProvider();
    public static System.Security.Cryptography.TripleDESCryptoServiceProvider KeyProvider {
        get {
            keyProv.Key = new byte[] { /* redacted with prejudice */ };
            return keyProv;
        }
    }
    public static string Encrypt(string text, SymmetricAlgorithm key) {
        if (text.Equals(string.Empty)) return text;
        // Create a memory stream.
        MemoryStream ms = new MemoryStream();
        // Create a CryptoStream using the memory stream and the
        // CSP DES key.
        CryptoStream encStream = new CryptoStream(ms, key.CreateEncryptor(), CryptoStreamMode.Write);
        // Create a StreamWriter to write a string
        // to the stream.
        StreamWriter sw = new StreamWriter(encStream);
        // Write the plaintext to the stream.
        sw.WriteLine(text);
        // Close the StreamWriter and CryptoStream.
        sw.Close();
        encStream.Close();
        // Get an array of bytes that represents
        // the memory stream.
        byte[] buffer = ms.ToArray();
        // Close the memory stream.
        ms.Close();
        // Return the encrypted byte array.
        return System.Convert.ToBase64String(buffer);
    }
    // Decrypt the byte array.
    public static string Decrypt(string cypherText, SymmetricAlgorithm key) {
        if (cypherText.Equals(string.Empty)) return cypherText;
        string val;
        try {
            // Create a memory stream to the passed buffer.
            MemoryStream ms = new MemoryStream(System.Convert.FromBase64String(cypherText));
            // Create a CryptoStream using the memory stream and the
            // CSP DES key.
            CryptoStream encStream = new CryptoStream(ms, key.CreateDecryptor(), CryptoStreamMode.Read);
            // Create a StreamReader for reading the stream.
            StreamReader sr = new StreamReader(encStream);
            // Read the stream as a string.
            val = sr.ReadLine();
            // Close the streams.
            sr.Close();
            encStream.Close();
            ms.Close();
        }
        catch (System.Exception) {
            return string.Empty;
        }
        return val;
    }
}
                I believe that what's happening is that the crypto provider is randomly generating an IV. Specify this and it should no longer differ.
Edit: You can do this in your 'keyProvider' by setting the IV property.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With