2

ねえ、私は暗号化と復号化に非常に慣れていません。正直に言うと、C#言語でさえもです。基本的に、ログを「保存」してテキストファイルを暗号化するtcpチャットサーバーがあります。これは私が暗号化する方法です (MSDN サンプルに基づく):

public static void EncryptFile(string strInputFileName, string strOutputFileName, string strKey)
{
    FileStream fsIn = new FileStream(strInputFileName, FileMode.Open, FileAccess.Read);
    FileStream fsOut = new FileStream(strOutputFileName, FileMode.Create, FileAccess.Write);

    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    des.Key = ASCIIEncoding.ASCII.GetBytes(strKey);
    des.IV = ASCIIEncoding.ASCII.GetBytes(strKey);


    ICryptoTransform desencrypt = des.CreateEncryptor();
    CryptoStream cryptostream = new CryptoStream(fsOut, desencrypt, CryptoStreamMode.Write);

    byte[] byteArrayInput = new byte[fsIn.Length - 1];
    fsIn.Read(byteArrayInput, 0, byteArrayInput.Length);
    cryptostream.Write(byteArrayInput, 0, byteArrayInput.Length);

    fsIn.Close();
    fsOut.Close();
}

メソッド success は、ファイルを完全に暗号化します。これは私の復号化方法です:

public static void DecryptFile(string strInputFileName, string strOutputFileName, string strKey)
{
    DESCryptoServiceProvider des = new DESCryptoServiceProvider();
    des.Key = ASCIIEncoding.ASCII.GetBytes(strKey);
    des.IV = ASCIIEncoding.ASCII.GetBytes(strKey);

    byte[] te = new byte[1024];
    FileStream fsRead = new FileStream(strInputFileName, FileMode.Open, FileAccess.Read);
    ICryptoTransform desdecrypt = des.CreateDecryptor();          

    CryptoStream cryptostream = new CryptoStream(fsRead, desdecrypt, CryptoStreamMode.Read);
    StreamWriter fsDecrypted = new StreamWriter(strOutputFileName);            

    fsDecrypted.Write(new StreamReader(cryptostream).ReadToEnd());//This is where the "Bad Data" occurs.
    fsDecrypted.Flush();
    fsDecrypted.Close();
    fsRead.Close();
}

また、cryptostream オブジェクトを調べると、「ストリームはシークをサポートしていません」という例外がスローされたと表示されます。

どんな助けでも大歓迎です!

4

3 に答える 3

5

ここ:

    cryptostream.Write(byteArrayInput, 0, byteArrayInput.Length);
    fsIn.Close();
    fsOut.Close();

fsOutを閉じずに、直接閉じていますcryptostream。これは、暗号ストリームが最終ブロックなどをフラッシュする機会を得られないことを意味します.

さらに:

  • usingClose または Dispose を手動で呼び出す代わりにステートメントを使用する
  • 現在、一度呼び出しReadており、すべてのデータを読み取ると想定しています-戻り値をチェックしていません。(何らかの理由で入力ファイルの最後のバイトも削除しています...なぜですか?)一般に、Readメソッドが0を返すまで、バッファに読み取ってから、読み取ったバイト数を書き出すループラウンドを行う必要があります。 .NET 4 を使用している場合Stream.CopyToは、あなたの友人です。
于 2011-04-08T06:44:37.843 に答える
0

私の問題を修正したのは、ファイルの作成時に暗号ストリームで FlushFinalBlock を呼び出すことでした

                CryptoStream cryptostream = new CryptoStream(memoryStream, this._encryptionKeyHelper.Encryptor(), CryptoStreamMode.Write);

            xmlser.Serialize(cryptostream, builderObject);

            cryptostream.FlushFinalBlock();
于 2018-07-12T08:27:47.850 に答える