saída de criptografia mesmo sempre diferentes com a mesma chave
-
02-07-2019 - |
Pergunta
Eu estou tentando armazenar uma senha em um arquivo que eu gostaria de recuperar para mais tarde. Hashing não é uma opção como eu preciso a senha para se conectar a um servidor remoto para mais tarde.
O código a seguir funciona bem, mas ele cria uma saída diferente de cada vez, mesmo que a chave é a mesma. Isso é ruim como quando os fecha aplicações para baixo e reinicia eu não será capaz de recuperar minha senha mais. Como posso armazenar senhas em um arquivo e recuperá-los mais tarde?
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;
}
}
Solução
Eu acredito que o que está acontecendo é que o provedor de criptografia está a gerar aleatoriamente um IV. Especifique este e já não deverá ser diferente.
Edit:. Você pode fazer isso no seu 'keyProvider', definindo a propriedade IV
Outras dicas
De acordo com os documentos de CreateEncryptor:
Se a propriedade atual IV é um nulo referência (Nothing no Visual Basic), o método GenerateIV é chamado a criar um novo IV aleatória.
Isso fará com que o texto cifrado diferente a cada vez.
Nota: uma maneira de contornar isso é discutido aqui onde eu sugiro que você pode preceder o texto simples com um mac ... então o primeiro bloco de texto cifrado é efetivamente a IV, mas é tudo repetível
Você precisa especificar um IV (vetor de inicialização), mesmo se você gerar um aleatório. Se você usar IV aleatório, então você deve armazená-lo juntamente com o texto cifrado para que você possa usá-lo mais tarde, descriptografia, ou você pode derivar uma IV de alguns outros dados (por exemplo, se você está criptografando uma senha, você pode derivar o IV de o nome de usuário).