2012-08-24 2 views
0

Il y a un code très simple pour décrypter le fichier (triple des chiffrement):Impossible de créer CryptoStream à lire - System.NotSupportedException

 FileStream fin = new FileStream(FilePath, FileMode.Open, FileAccess.Read); 
     TripleDES tdes = new TripleDESCryptoServiceProvider(); 
     CryptoStream cs = new CryptoStream(fin, tdes.CreateDecryptor(key, iv),CryptoStreamMode.Read); //<---- Exceptions 

Et ça ne fonctionne pas. 'cs' est invalide et il est impossible de le lire. Il y a quelques exceptions, tout en créant CryptoStream:

Length = 'cs.Length' threw an exception of type 'System.NotSupportedException' 
base {System.SystemException} = {"Stream does not support seeking."} 

Pourquoi je ne peux pas créer flux Crypto et lus à partir et comment résoudre ce problème?

[ajouté]

Merci pour les réponses, il est maintenant plus clair pour moi. Mais - encore, c'est impossible à lire de 'cs'.

Cryptage:

FileStream fout = new FileStream(FilePath, FileMode.OpenOrCreate, FileAccess.Write); 
TripleDES tdes = new TripleDESCryptoServiceProvider(); 
CryptoStream cs = new CryptoStream(fout, tdes.CreateEncryptor(key, iv), CryptoStreamMode.Write); 

byte[] d = Encoding.ASCII.GetBytes(Data); 
cs.Write(d, 0, d.Length); 
cs.WriteByte(0); 

cs.Close(); 
fout.Close(); 

Il est iv et clé définie ailleurs. Et, le décryptage - méthode entière:

FileStream fin = new FileStream(FilePath, FileMode.Open, FileAccess.Read); 
    TripleDES tdes = new TripleDESCryptoServiceProvider(); 
    CryptoStream cs = new CryptoStream(fin, tdes.CreateDecryptor(key, iv),CryptoStreamMode.Read); 

    StringBuilder SB = new StringBuilder(); 
    int ch; 
    for (int i = 0; i < fin.Length; i++) 
    { 
    ch = cs.ReadByte(); //Exception - CryptographicException: Bad data 
    if (ch == 0) 
    break; 
    SB.Append(Convert.ToChar(ch)); 
    } 
    cs.Close(); 
    fin.Close(); 

Comme vous pouvez le voir, il y a la même clé et iv comme dans le code de chiffrement. Mais il est encore impossible de lire le flux 'cs' - une exception est levée. Comment pensez-vous - qu'est-ce qui ne va pas ici?

Ceci est ma clé et iv utilisé:

public static byte[] key = { 21, 10, 64, 10, 100, 40, 200, 4, 
        21, 54, 65, 246, 5, 62, 1, 54, 
        54, 6, 8, 9, 65, 4, 65, 9}; 

    private static byte[] iv = { 0, 0, 0, 0, 0, 0, 0, 0 }; 

Répondre

1

Il me coutures pour que vous regardez sc.Length propriété dans l'outil studios visuels dédiés à l'inspection des variables et vous obtenez des exceptions là. Si oui, ignorez-les, ils seraient pertinents si vous utilisez Length dans votre code. Il est tout à fait normal que les flux ne prennent pas en charge les fonctionnalités nécessitant des connaissances sur toutes les données internes.

Modifier

Tout d'abord vous supposez que la longueur du fichier crypté est égale à la longueur des données décryptées. Je suppose que c'est peut-être vrai, mais j'en doute.

essayer:

var textReader = new StreamReader(cs);// you might need to specify encoding 
var text = textReader.ReadToEnd(); 

Notez que cela lire fichier en mémoire et ce sera un problème pour les gros fichiers.

Si j'écrirais ce code j'utiliserais StreamWritter pour écrire à CryptoStream et StreamReader pour lire le code est détroit en avant.

0

Votre code ne génère aucune erreur sur ma machine (VS2010, .NET 4, Windows). Quel profil client/plateforme utilisez-vous? L'erreur indique que votre FileStream est d'un type qui ne supporte pas la recherche, est le normal .NET FileStream?

Questions connexes