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.