none
CryptoStream の BaseStream に MemoryStream を指定すると Read 出来ない RRS feed

  • 質問

  • MemoryStream mStream = new MemoryStream();
    TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
    ICryptoTransform CryptoTransform = tDESalg.CreateEncryptor(Key, IV);
    CryptoStream cStream = new CryptoStream(mStream, CryptoTransform, CryptoStreamMode.Read);
    BinaryReader sReader = new BinaryReader(cStream);
    byte[] DecodeData = sReader.ReadBytes((int)sReader.BaseStream.Length);

    以上の様な流れ(MemoryStream へのデータの設定は省略しています) で、
    CryptoStream の BaseStream に MemoryStream を指定すると、BinaryReader の ReadBytes でエラーになります。
    エラー内容は「ストリームはシークをサポートしません」というものです。
    確かにsReader.BaseStreamのCanSeek は false になっています。
    MemoryStream ではなく FileStream なら問題なく動作します。
    MemoryStream でもRead 出来るようにする方法は無いのでしょうか。

     

     

    2010年12月14日 2:39

回答

  • BinaryReaderのBaseStreamはCryptoStreamが設定されていて、CryptoStream.Length には「このプロパティはサポートされていません 」と書かれているにもかかわらず、参照したいんですよね? とても難しい問題だと思います。

    ところで先の「TripleDESCryptoServiceProviderでバイト列を暗号化する 」の続きでしょうか? あちらにはHongliangさんが真っ先に「リンク先のサンプルの二つ目」と提案されていますが。string型をいったんbyte[]に変換してからの処理ですので、バイト列で扱いたいのならその続きの処理を参考にすればいいはずですが…。

    • 回答としてマーク 山本春海 2010年12月28日 2:24
    2010年12月14日 11:52

すべての返信

  • CryptoStreamのBaseStreamではなく、BinaryReaderのBaseStreamでは?

    byte[] DecodeData = sReader.ReadBytes((int)sReader.BaseStream.Length);

    を2行に分けるとどっちでエラーになっているかわかると思います。

    2010年12月14日 2:51
  • エラーが出ているのは sReader.BaseStream.Length の方でした。

    もうちょっとよく考えます。

    2010年12月14日 4:38
  • BinaryReaderのBaseStreamはCryptoStreamが設定されていて、CryptoStream.Length には「このプロパティはサポートされていません 」と書かれているにもかかわらず、参照したいんですよね? とても難しい問題だと思います。

    ところで先の「TripleDESCryptoServiceProviderでバイト列を暗号化する 」の続きでしょうか? あちらにはHongliangさんが真っ先に「リンク先のサンプルの二つ目」と提案されていますが。string型をいったんbyte[]に変換してからの処理ですので、バイト列で扱いたいのならその続きの処理を参考にすればいいはずですが…。

    • 回答としてマーク 山本春海 2010年12月28日 2:24
    2010年12月14日 11:52