DESを使用してファイルを暗号化する方法

ちょっと詰まったのでメモ書き。

C#を使用してDESでファイルを暗号化する方法はMicrosoftにサンプルコードが載っている

ただしこの方法だとエンコードの違いで文字化けを起こしてしまう。このため、以下のURLを参考にファイルを吐き出す方法の記載を変更する必要がある。

サンプルコード

修正したコードは以下の通り。

static void DecryptFile(string sInputFilename, 
                        string sOutputFilename,
                        string sKey)
{
    DESCryptoServiceProvider DES = new DESCryptoServiceProvider();
    //このプロバイダでは、64 ビット キーと IV が必要です。
    //DES アルゴリズムの秘密キーを設定します。
    DES.Key = ASCIIEncoding.ASCII.GetBytes(sKey);
    //初期化ベクタを設定します。
    DES.IV = ASCIIEncoding.ASCII.GetBytes(sKey);

    //暗号化されたファイルを読み戻すためにファイル ストリームを作成します。
    FileStream fsread = new FileStream(sInputFilename, 
                                       FileMode.Open, 
                                       FileAccess.Read);
    //DES インスタンスから DES decryptor を作成します。
    ICryptoTransform desdecrypt = DES.CreateDecryptor();
    //読み取りのために暗号ストリームを作成し、
    //入力バイト列で DES 復号化変換を行います。
    CryptoStream cryptostreamDecr = new CryptoStream(fsread, 
                                                     desdecrypt,
                                                     CryptoStreamMode.Read);

    // **********************************************************************
    // ここから↓がマイクロソフト  サポート オンラインから修正している箇所
    // **********************************************************************

    //復号化されたファイルを書き出すためのFileStream
    FileStream fswrite = new FileStream(sInputFilename, 
                                        FileMode.Create, 
                                        FileAccess.Write);
    //復号化されたデータを書き出す
    byte[] bs = new byte[256];
    int readLen;
    while ((readLen = cryptostreamDecr.Read(bs, 0, bs.Length)) > 0)
        fswrite.Write(bs, 0, readLen);

    //閉じる
    cryptostreamDecr.Close();
    fsread.Close();
    fswrite.Close();

} 
まとめ

ちょっと修正したファイルを説明すると、256byteの読み込みバッファを作って、そこに複合した値をいったん渡してからFileStreamを使用してファイルに書き込んでいるってコードみたい。

分かりやすいコードを書いてくださった、DOBONさん。ありがとうございました。