0

ファイルを復号化するための非常に単純なコードがあります(トリプルデス暗号化):

        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

そして、それは機能しません。「cs」は無効であり、そこから読み取ることはできません。CryptoStream の作成中には、いくつかの例外があります。

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

暗号化ストリームを作成して読み取ることができないのはなぜですか? また、この問題を解決するにはどうすればよいですか?

[追加した]

回答ありがとうございます。これで、より明確になりました。しかし - それでも、これを 'cs' から読み取ることはできません。

暗号化:

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();

iv と key が別の場所で定義されています。そして、復号化 - メソッド全体:

    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();

ご覧のとおり、暗号化コードには同じキーと iv のようなものがあります。しかし、'cs' ストリームから読み取ることはまだ不可能です - 例外がスローされます。どう思いますか - ここで何が問題なのですか?

これは私のキーであり、使用されたivです:

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 };
4

2 に答える 2

1

変数を検査する専用のビジュアルスタジオツールでプロパティを監視していて、sc.Lengthそこで例外が発生しているように思えます。Lengthその場合は、コードで使用する場合に関連するものを無視してください。ストリームが、内部にあるすべてのデータに関する知識を必要とする機能をサポートしていないのは、ごく普通のことです。

編集

まず、暗号化されたファイルの長さが復号化されたデータの長さと等しいと仮定します。これは本当かもしれないと思いますが、私はそれを疑っています。

試す:

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

これはファイル全体をメモリに読み込むため、大きなファイルでは問題になることに注意してください。

私がこのコードを書くとしたら、そのコードへのStreamWritter書き込みCryptoStreamStreamReader読み取りに使用するコードは簡単です。

于 2012-08-24T08:41:15.140 に答える
0

あなたのコードは私のマシン(VS2010、.NET 4、Windows)でエラーを出しません。これを実行しているクライアント プロファイル/プラットフォームは何ですか? このエラーは、FileStream がシークをサポートしていないタイプであることを示しています。通常の .NET FileStream ですか?

于 2012-08-24T08:41:19.027 に答える