Lecture à partir d'un cryptostream à la fin du flux
Je vais avoir quelques problèmes avec le code ci-dessous. J'ai un fichier dans un emplacement temporaire qui est dans le besoin de chiffrement, cette fonction crypte les données qui sont ensuite stockées à la "pathToSave" emplacement.
Sur l'inspection de l'est ne semble pas être de la manipulation de l'ensemble du fichier correctement - Il y a des morceaux manquants de ma sortie et je soupçonne qu'il a quelque chose à voir avec la boucle while pas en cours d'exécution à travers l'ensemble du flux.
En aparté, si j'essaie de l'appeler CryptStrm.Close() après la boucle while-je recevoir une exception. Cela signifie que si je tente de décrypter le fichier, j'obtiens un fichier en cours d'utilisation d'erreur!
Essayé tous l'habitude et j'ai regardé ici à des problèmes similaires, toute aide serait super.
Grâce
public void EncryptFile(String tempPath, String pathToSave)
{
try
{
FileStream InputFile = new FileStream(tempPath, FileMode.Open, FileAccess.Read);
FileStream OutputFile = new FileStream(pathToSave, FileMode.Create, FileAccess.Write);
RijndaelManaged RijCrypto = new RijndaelManaged();
//Key
byte[] Key = new byte[32] { ... };
//Initialisation Vector
byte[] IV = new byte[32] { ... };
RijCrypto.Padding = PaddingMode.None;
RijCrypto.KeySize = 256;
RijCrypto.BlockSize = 256;
RijCrypto.Key = Key;
RijCrypto.IV = IV;
ICryptoTransform Encryptor = RijCrypto.CreateEncryptor(Key, IV);
CryptoStream CryptStrm = new CryptoStream(OutputFile, Encryptor, CryptoStreamMode.Write);
int data;
while (-1 != (data = InputFile.ReadByte()))
{
CryptStrm.WriteByte((byte)data);
}
}
catch (Exception EncEx)
{
throw new Exception("Encoding Error: " + EncEx.Message);
}
}
EDIT:
J'ai fait l'hypothèse que mon problème est avec le Cryptage. Mon Décrypter pourrait être le coupable
public String DecryptFile(String encryptedFilePath)
{
FileStream InputFile = new FileStream(encryptedFilePath, FileMode.Open, FileAccess.Read);
RijndaelManaged RijCrypto = new RijndaelManaged();
//Key
byte[] Key = new byte[32] { ... };
//Initialisation Vector
byte[] IV = new byte[32] { ... };
RijCrypto.Padding = PaddingMode.None;
RijCrypto.KeySize = 256;
RijCrypto.BlockSize = 256;
RijCrypto.Key = Key;
RijCrypto.IV = IV;
ICryptoTransform Decryptor = RijCrypto.CreateDecryptor(Key, IV);
CryptoStream CryptStrm = new CryptoStream(InputFile, Decryptor, CryptoStreamMode.Read);
String OutputFilePath = Path.GetTempPath() + "myfile.name";
StreamWriter OutputFile = new StreamWriter(OutputFilePath);
OutputFile.Write(new StreamReader(CryptStrm).ReadToEnd());
CryptStrm.Close();
OutputFile.Close();
return OutputFilePath;
}
OriginalL'auteur David | 2012-03-15
Vous devez vous connecter pour publier un commentaire.
Bien, il y a plusieurs choses qui vont mal ici.
1. Votre définition de la taille du IV trop grand. Si vous avez une taille de clé de 256, le IV de Rijndael est de 16 octets. Si vous essayez de mettre la clé avec plus d'octets que vous obtenez une exception.IV la taille doit être réglé à la taille de Bloc /8 voir MSDN de sorte que le IV taille est correcte.Je vous poste un exemple de code utilisant la mémoire des flux de montrer le cryptage et le décryptage.
Eh bien, vous devez seulement appeler FlushFinalBlock à l'extérieur de la boucle, comme la dernière chose que lorsque vous chiffrez. Vous n'avez pas besoin de l'appeler quand vous êtes de décryptage, lors du déchiffrement juste appeler Flush. Votre taille de bloc doit être correcte lorsque vous êtes décryptage donc il n'y aura pas besoin d'être tout le rembourrage. Aussi loin que la confiance qu'il a été appelé, vous pouvez exécuter votre code sous un débogueur et de définir un point d'arrêt à cette ligne. Si ce n'est pas le frapper, alors qu'il n'était pas appelé.
Si vous avez une taille de clé de 256, le IV de Rijndael est de 16 octets. Si vous essayez de mettre la clé avec plus d'octets que vous obtenez une exception. C'est faux, si vous avez un
BlockSize = 256
alors votre IV devrait être de 32. Si elles ne sont pas correctement match, alors vous aurez une exception.J'ai répondu votre question avec un exemple de travail.
href="https://ideone.com/iLzDIs" >Ideone lien pour un exemple de travail où vous utilisez un
RijndaelManaged
objet pour le cryptage et le décryptage (sauver le IV et la clé de cryptage et en utilisant le même IV et la clé de déchiffrement). Pas de rembourrage exceptions près, tous fonctionne très bien. J'ai choisi ISO10126 parce que je préfère de remplissage avec des données aléatoires.OriginalL'auteur pstrjds
La taille de la clé doit être spécifiée en premier. Cela ressemble à un bug par exemple, cela fonctionne
mais ce n'est pas
OriginalL'auteur Simon Smith