C# CryptographicException longueur des données à déchiffrer n'est pas valide
J'ai ce code qui est censé décrypter un fichier, mais si je le lance, il jette un CryptographicException (longueur des données à déchiffrer n'est pas valide) à la fin de l'instruction à l'aide using (CryptoStream ...) { ... }
public static void DecryptFile(string path, string key, string saltkey, string ivkey)
{
try
{
byte[] cipherTextBytes;
using (StreamReader reader = new StreamReader(path)) cipherTextBytes = Encoding.UTF8.GetBytes(reader.ReadToEnd());
byte[] keyBytes = new Rfc2898DeriveBytes(key, Encoding.ASCII.GetBytes(saltkey)).GetBytes(256 / 8);
RijndaelManaged symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.None };
ICryptoTransform decryptor = symmetricKey.CreateDecryptor(keyBytes, Encoding.ASCII.GetBytes(ivkey));
byte[] plainTextBytes;
using (MemoryStream memoryStream = new MemoryStream(cipherTextBytes))
{
using (CryptoStream cryptoStream = new CryptoStream(memoryStream, decryptor, CryptoStreamMode.Read))
{
plainTextBytes = new byte[Encoding.UTF8.GetByteCount((new StreamReader(cryptoStream)).ReadToEnd())];
cryptoStream.Read(plainTextBytes, 0, plainTextBytes.Length);
//plainTextBytes = memoryStream.ToArray();
cryptoStream.FlushFinalBlock();
}
}
string result = Encoding.ASCII.GetString(plainTextBytes, 0, plainTextBytes.Length).TrimEnd("\0".ToCharArray());
using (FileStream writer = new FileStream(path, FileMode.Create)) writer.Write(Encoding.ASCII.GetBytes(result), 0, Encoding.ASCII.GetBytes(result).Length);
MessageBox.Show("Decrypt succesfull");
}
catch (Exception ex)
{
MessageBox.Show("An error while decrypting the file:\n\n" + ex, "Error");
}
}
}
Quelqu'un sait pourquoi c'est ou comment je peux résoudre ce problème? (Je ne sais pas si ça vient de mon chiffrement méthode, mais j'ai un autre programme qui utilise exactement la même chose pour chiffrer des chaînes et que l'on ne travail.)
Ma méthode de cryptage:
public static void EncryptFile(string path, string key, string saltkey, string ivkey)
{
try
{
byte[] TextBytes;
using (StreamReader reader = new StreamReader(path)) TextBytes = Encoding.UTF8.GetBytes(reader.ReadToEnd());
byte[] KeyBytes = new Rfc2898DeriveBytes(key, Encoding.ASCII.GetBytes(saltkey)).GetBytes(256 / 8);
RijndaelManaged symmetricKey = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.Zeros };
ICryptoTransform encryptor = symmetricKey.CreateEncryptor(KeyBytes, Encoding.ASCII.GetBytes(ivkey));
byte[] CipherTextBytes;
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, encryptor, CryptoStreamMode.Write))
{
cs.Write(TextBytes, 0, TextBytes.Length);
cs.FlushFinalBlock();
CipherTextBytes = ms.ToArray();
}
}
using (FileStream writer = new FileStream(path, FileMode.Create)) writer.Write(CipherTextBytes, 0, CipherTextBytes.Length);
MessageBox.Show("Encrypt succesfull");
}
catch (Exception ex)
{
MessageBox.Show("An error while encrypting the file:\n\n" + ex, "Error");
}
}
Il est difficile de voir le problème auquel vous êtes confronté basé sur votre exemple de code - vous d'inclure trop peu de détails. Pensez à mettre à jour votre question avec un exemple de travail (y compris des choses comme ivkey etc.). Sans plus en détail mon instinct, c'est que c'est un problème de remplissage de - envisager de modifier mode de remplissage de zéros ou de PKCS7 et vous assurer que votre routine de chiffrement en fait de même.
J'ai posté tout ce que j'ai maintenant
J'ai posté tout ce que j'ai maintenant
OriginalL'auteur thijmen321 | 2014-09-17
Vous devez vous connecter pour publier un commentaire.
Il existe quelques problèmes avec votre code:
Vous utilisez un mode de remplissage de Zéros dans Chiffrer et Aucun dans le Déchiffrer. Elles doivent correspondre à
Vous chargez les octets à partir de votre fichier à l'aide de l'Encodage.UTF8, vous avez besoin de lire les octets brutes, vous pouvez le faire en utilisant ce qui suit:
byte[] cipherTextBytes = Fichier.ReadAllBytes(chemin);
Vous appelez
cryptoStream.FlushFinalBlock();
quand seulement à l'aide d'une seule itération d'un ruisseau. Vous n'avez pas besoin de cet appel à Déchiffrer si vous ne faites que d'un seul bloc d'itération.Vous lire le texte original à partir de votre fichier en UTF8, puis l'écrire comme ASCII. Vous devez soit modifier le résultat de cession à déchiffrer à utiliser UTF8 ou (de préférence) de changer à la fois d'utiliser des octets.
Vous utiliser pour interagir avec les fichiers lorsque vous écrasez en place. Si vous connaissez le fichier existe déjà (comme vous le remplacer), vous devez utiliser truncate ou encore mieux, de dossier d'appel.WriteAllBytes.
Votre déchiffrer est toutes sortes de foiré. On dirait que vous êtes vous attacher dans des noeuds sur l'octet de récupération. Vous devriez utiliser le raw octets de la CryptoStream et de ne pas essayer d'utiliser l'UTF8
Voici une version révisée des méthodes pour vous:
et:
OriginalL'auteur Wolfwyrd
Dans mon cas, c'est arrivé parce que j'étais à déchiffrer une valeur qui n'a jamais été chiffré.
J'ai eu mes valeurs enregistrées dans la base de données sans cryptage. Mais quand j'ai lancé le chiffrement et le déchiffrement de routine dans mon code et exécuté mon programme première fois, il était en fait en essayant de déchiffrer une valeur qui n'a jamais été chiffré, d'où le problème.
Vous effacez les valeurs existantes de la base de données pour la première résolu le problème. Si vous ne voulez pas perdre des données, même lors de la première exécution ensuite, vous devez écrire une routine distincte pour chiffrer les valeurs existantes.
OriginalL'auteur user4535810
Plus probable que votre problème vient de
cipherTextBytes = Encoding.UTF8.GetBytes(reader.ReadToEnd());
Vous ne pouvez pas utiliser l'UTF8 pour encoder des données binaires arbitraires, vous aurez probablement besoin de fixer vos cryptage de fin de décryptage fin. Vous devez utiliser
cipherTextBytes = File.ReadAllBytes(path)
ou si vous êtes obligé d'utiliser des chaînes, vous devez d'abord coder les octets d'une chaîne valide à l'aide deConvert.ToBase64String()
Ensuite, vous avez un fichier vide, vous allez trouver ce qui est écrit le fichier et de le corriger.
OriginalL'auteur Scott Chamberlain