2

私は TripleDES 暗号化の簡単なコードを理解し、それがどのように機能するかを理解しようとしています。そして、Googleで多くのコードを見てきました。一部はTripleDESクラスを使用し、一部は TripleDESCryptoServiceProvider クラスを使用しまし。私が知っているのは、2番目のものは最初のものから継承されているということです。

TripleDES クラス:(暗号化部分のみ表示)

static void Main(string[] args)
    {

        TripleDES TripleDESalg = TripleDES.Create("TripleDES");
        string sData = "Here is some data to encrypt.";
        byte[] Data = EncryptTextToMemory(sData, TripleDESalg.Key, TripleDESalg.IV);
        string Final = DecryptTextFromMemory(Data, TripleDESalg.Key, TripleDESalg.IV);
        Console.WriteLine(Final);
        Console.ReadLine();

    }

    public static byte[] EncryptTextToMemory(string Data,  byte[] Key, byte[] IV)
    {


            MemoryStream mStream = new MemoryStream();
            TripleDES tripleDESalg = TripleDES.Create();
            CryptoStream cStream = new CryptoStream(mStream, tripleDESalg.CreateEncryptor(Key, IV), CryptoStreamMode.Write);
            byte[] toEncrypt = new ASCIIEncoding().GetBytes(Data);
            cStream.Write(toEncrypt, 0, toEncrypt.Length);
            cStream.FlushFinalBlock();
            byte[] ret = mStream.ToArray();
            cStream.Close();
            mStream.Close();
            return ret;

    }

そして TripleDESCryptoServiceProvider クラス: (暗号化コードのみ)

static void Main(string[] args)
    {


        TripleDESCryptoServiceProvider tDESalg = new TripleDESCryptoServiceProvider();
        string sData = "Here is some data to encrypt.";
        byte[] Data = EncryptTextToMemory(sData, tDESalg.Key, tDESalg.IV);
        string Final = DecryptTextFromMemory(Data, tDESalg.Key, tDESalg.IV); 
        Console.WriteLine(Final);
        Console.ReadLine();


    }

    public static byte[] EncryptTextToMemory(string Data, byte [] key, byte[] iv)
    {


        MemoryStream mStream = new MemoryStream();
        CryptoStream cStream = new CryptoStream(mStream,
            new TripleDESCryptoServiceProvider().CreateEncryptor(key, iv ),
            CryptoStreamMode.Write);
        byte[] toEncrypt = new ASCIIEncoding().GetBytes(Data);
        cStream.Write(toEncrypt, 0, toEncrypt.Length);
        cStream.FlushFinalBlock();
        byte[] ret = mStream.ToArray();
        cStream.Close();
        mStream.Close();
        return ret;

    }

どちらのコードも問題なく動作し、99% 同じです。しかし、私の質問は、

  1. これら2つのクラスの違いは何ですか?

  2. どのクラスがより受け入れられますか?

  3. TransformFinalBlock() と FlushFinalBlock() の違いは何ですか?

  4. MemoryStream および CryptoStream クラスを使用しないコードがあります。そして、彼らはうまく機能します。では、これらのストリームを使用する利点は何でしょうか?

  5. 最後に、上記のコードで、どのキーサイズ、暗号モード、およびパディング アルゴリズムが使用されているかをどのように知ることができますか?

前もって感謝します。

4

1 に答える 1

4
  1. TripleDESCryptoServiceProvider暗号化サービス プロバイダである CSP を使用します。これはソフトウェア実装の場合もありますが、スマート カード上の実装を表すこともできます。

  2. ほとんどの場合、TripleDESCryptoServiceProviderMicrosoft がサンプル コードで行っているように を使用する必要があります。これにより、CSP を切り替えることができます (セキュリティや速度を向上させるため)。

  3. FlushFinalBlockのストリーム バージョンですTransformFinalBlock。これは、すでにストリーム上にあるデータに対して最後の計算を実行できることを示します。TransformFinalBlock も最後の計算を実行しますが、指定されたデータを使用して実際の結果を返します。

  4. それらはあまりにも頻繁に使用されます。多くのコードは、最初にすべてをバイト配列に格納し、次にそこからストリームを作成します。それはまったく役に立ちません。ストリーミングは、すべてを同時にメモリに保持したくない大きなデータ ブロックに役立ちます。または、ファイルとの間で直接ストリーミングしたい場合もあるでしょう。もちろん、小さなデータでもストリームを引数にとるメソッドを作成できるので、あとでバージョンアップできます。しかし、それは通常、ストリームの使用方法ではありません。

  5. それらは CSP によって決定される可能性がありますが、その質問に対する最終的な答えは見つかりません。すべての暗号化実装と同様に、デフォルトが正しく定義されていないか、実装ごとに異なる場合は特に、デフォルトに依存しないことがおそらく最も安全です。使用しているキーの長さなどを明確に指定します。これにより、コードが将来にわたって保証され、保守が容易になります。

于 2014-05-25T01:54:55.987 に答える