2010-07-15 8 views
0

Ceci est un segment de code que j'ai pour régler le masterpassword:Exception Cryptographic: entrée n'est pas un bloc complet

private void button1_Click(object sender, EventArgs e) 
    { 
     string current = textBox1.Text; 
     string newPass = textBox2.Text; 
     string confirmed = textBox3.Text; 
     string massPass = "winxp.pma"; 


     if (File.Exists(massPass)) 
     { 
      byte[] cipertext = File.ReadAllBytes(massPass); 
      string decoded; 
      if(Encryptor.TryDecrypt(current, cipertext, out decoded)) 
      { 
       FileStream fs = new FileStream(massPass, FileMode.Truncate, FileAccess.Write); 
       StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); 
       if(newPass == confirmed) 
       { 
        byte[] newCipher = Encryptor.Encrypt(newPass, newPass); 
        string writeIt = System.Text.Encoding.UTF8.GetString(newCipher); 
        sw.Write(writeIt); 
        sw.Flush(); 
        sw.Close(); 
        fs.Close(); 
        this.Close(); 

       } 
       else 
       { 
        MessageBox.Show("New password do not match.", "Error", MessageBoxButtons.OK); 
       } 

      } 

     } 
     else 
     { 
      FileStream fs = new FileStream(massPass, FileMode.Create, FileAccess.Write); 
      StreamWriter sw = new StreamWriter(fs, Encoding.UTF8); 
      if (newPass == confirmed) 
      { 
       byte[] ciphertext = Encryptor.Encrypt(newPass, newPass); 
       string writeIt = System.Text.Encoding.UTF8.GetString(ciphertext); 
       sw.Write(ciphertext); 
       sw.Flush(); 
       sw.Close(); 
       fs.Close(); 
       this.Close(); 
      } 

Retour sur la principale forme, j'utilise la méthode TryDecrypt de la manière suivante:

private void S_Click(object sender, EventArgs e) 
    { 
     byte[] ciphertext = File.ReadAllBytes(massPass); 
     string decoded; 

      if (Encryptor.TryDecrypt(textBox1.Text, ciphertext, out decoded)) 
      { 
       accountGroupsBox.Enabled = true; 
       addNewPasswordToolStripMenuItem.Enabled = true; 
       label2.Text = "Interface Unlocked"; 

      } 
      else 
      { 
       MessageBox.Show("Incorrect Master Password.", "Authentication Error", MessageBoxButtons.OK); 
      } 

Cependant, comme je l'ai mentionné, il ne reviendra pas vrai .... Je parie quelque chose à voir avec la façon dont je manipuler les FileStreams de l'autre forme, mais je ne comprends pas assez ce qui est passe sous le capot pour déterminer si je le fais correctement.

Répondre

2

Votre flux d'entrée n'est pas terminé. Pour pouvoir tenter de le décrypter, il doit s'agir d'une certaine taille. Assurez-vous que votre processus de chiffrement est correct. Les données cryptées doivent être égales ou supérieures à vos données simples. Ma conclusion de retour sur l'autre site était que le CryptoStream n'a pas eu une chance d'écrire les données avant que votre fichier de sortie ait été fermé. Le flux de sortie doit rester ouvert avant que CryptoStream ne soit disposé pour pouvoir écrire le reste du texte chiffré et le remplissage nécessaire.

Mon code de test:

public static byte[] Encrypt(string password, string plaintext, SymmetricAlgorithm algorithm) 
{ 
    byte[] key, iv; 
    CreateKeyIV(password, out key, out iv); 
    using (MemoryStream encrypted = new MemoryStream()) 
    { 
     using (CryptoStream enc = new CryptoStream(encrypted, algorithm.CreateEncryptor(key, iv), CryptoStreamMode.Write)) 
     using (StreamWriter writer = new StreamWriter(enc)) 
      writer.Write(plaintext); 
     return encrypted.ToArray(); 
    } 
} 
+1

Êtes-vous même vérifier des réponses à vos autres messages sur d'autres sites? :) –

+0

Oh, je n'avais pas vérifié le débogage depuis plusieurs jours ... J'ai supposé que c'était un spectacle relativement inactif. Ce code que vous avez posté là-bas .... Je voudrais changer les flux de mémoire pour être FileStreams à mes fins correctes? – Stev0

+0

Oui, c'est généralement le cas. Il y a beaucoup de gens qui cherchent de l'aide pour les devoirs de la part de quelques généreux qui répondent régulièrement (3-4 personnes dont moi-même). Tout par amour cependant. ;) - Un passage à l'utilisation d'un flux mémoire rendra ce processus beaucoup plus rapide et plus sûr car vous n'aurez pas à travailler avec des fichiers temporaires et tous les problèmes que cela peut entraîner. Pour résumer ce que j'ai mentionné lors du débogage, assurez-vous de fermer le CryptoStream avant d'accepter les données cryptées. –