2010-11-04 7 views
3

Ma méthode principale s'exécute sans erreurs, mais le message décrypté n'est pas correct. Je suis presque certain de ne pas encoder correctement, mais je n'arrive pas à résoudre le problème. Toute aide serait grandement appréciée.Codage C# dans le cryptage/décryptage DES

Ceci est mon premier message, donc si j'ai par inadvertance enfreint une règle ou ne pas adhérer à une ligne directrice, s'il vous plaît faites le moi savoir.

static void Main(string[] args) 
{ 
    string unencryptedString = "cat"; 
    string encryptedString; 
    string decryptedString; 

    string password = "password"; 

    System.Console.WriteLine("Unencrypted String: " + unencryptedString); 
    System.Console.WriteLine("Password: " + password); 

    encryptedString = StandardEncryptor.Encrypt(unencryptedString, password); 
    System.Console.WriteLine("Encrypted String: " + encryptedString); 

    decryptedString = StandardEncryptor.Decrypt(encryptedString, password); 
    System.Console.WriteLine("Decrypted String: " + decryptedString); 

    System.Console.ReadLine(); 
} 

public static string Encrypt(string message, string password) 
{ 
    // Encode message and password 
    byte[] messageBytes = ASCIIEncoding.ASCII.GetBytes(message); 
    byte[] passwordBytes = ASCIIEncoding.ASCII.GetBytes(password); 

    // Set encryption settings -- Use password for both key and init. vector 
    DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); 
    ICryptoTransform transform = provider.CreateEncryptor(passwordBytes, passwordBytes); 
    CryptoStreamMode mode = CryptoStreamMode.Write; 

    // Set up streams and encrypt 
    MemoryStream memStream = new MemoryStream(); 
    CryptoStream cryptoStream = new CryptoStream(memStream, transform, mode); 
    cryptoStream.Write(messageBytes, 0, messageBytes.Length); 
    cryptoStream.FlushFinalBlock(); 

    // Read the encrypted message from the memory stream 
    byte[] encryptedMessageBytes = new byte[memStream.Length]; 
    memStream.Position = 0; 
    memStream.Read(encryptedMessageBytes, 0, encryptedMessageBytes.Length); 

    // Encode the encrypted message as base64 string 
    string encryptedMessage = Convert.ToBase64String(encryptedMessageBytes); 

    return encryptedMessage; 
} 

public static string Decrypt(string encryptedMessage, string password) 
{ 
    // Convert encrypted message and password to bytes 
    byte[] encryptedMessageBytes = Convert.FromBase64String(encryptedMessage); 
    byte[] passwordBytes = ASCIIEncoding.ASCII.GetBytes(password); 

    // Set encryption settings -- Use password for both key and init. vector 
    DESCryptoServiceProvider provider = new DESCryptoServiceProvider(); 
    ICryptoTransform transform = provider.CreateDecryptor(passwordBytes, passwordBytes); 
    CryptoStreamMode mode = CryptoStreamMode.Write; 

    // Set up streams and decrypt 
    MemoryStream memStream = new MemoryStream(); 
    CryptoStream cryptoStream = new CryptoStream(memStream, transform, mode); 
    cryptoStream.Write(encryptedMessageBytes, 0, encryptedMessageBytes.Length); 
    cryptoStream.FlushFinalBlock(); 

    // Read decrypted message from memory stream 
    byte[] decryptedMessageBytes = new byte[memStream.Length]; 
    memStream.Position = 0; 
    memStream.Read(decryptedMessageBytes, 0, decryptedMessageBytes.Length); 

    // Encode deencrypted binary data to base64 string 
    string message = Convert.ToBase64String(decryptedMessageBytes); 

    return message; 
} 
+2

Après un rapide coup d'oeil à votre code, je ne vois pas le problème que vous décrivez, mais je vous recommande de ne pas utiliser le mot de passe de l'initialisation vecteur. La IV doit être différente pour chaque message crypté, sinon votre chiffrement sera vulnérable à l'analyse statistique. Il est OK de créer un IV aléatoire et de l'ajouter (ou préfixer) au texte chiffré. La IV n'est pas un secret mais elle doit être à usage unique. –

+1

En outre, DES est cassé. Je suggère au moins 3DES, ou idéalement AES pour le cryptage par blocs. AES n'est officiellement pas encore cassé. –

+0

Merci pour le conseil. – Dave

Répondre

3

Le problème se situe-t-il sur l'avant-dernière ligne?

string message = Convert.ToBase64String(decryptedMessageBytes); 

je peux être sur la bonne voie ici, mais je ne pense pas que vous aviez l'intention de convertir la chaîne octets retour à base64. Avez-vous juste besoin de convertir les octets en une chaîne?

string message = ASCIIEncoding.ASCII.FromBytes(decryptedMessageBytes); 
+0

Aw, je suis trop lent :) –

+0

C'était vraiment le problème-Merci! – Dave

+0

Je n'ai pas trouvé la méthode FromBytes. Utilisez plutôt GetString. – Thiago

1

On dirait que le problème est dans Décrypter:

// Encode deencrypted binary data to base64 string 
string message = Convert.ToBase64String(decryptedMessageBytes); 

Je ne pense pas que vous voulez faire cela aux données décryptées. Les octets décryptés sont déjà ASCII.

1

-je résoudre le problème en utilisant juste ce

//Encode deencrypted binary data to base64 string 
string message = ASCIIEncoding.ASCII.GetString(decryptedMessageBytes);