TripleDES类和TripleDESCryptoServiceProvider类之间的区别

时间:2014-05-24 21:37:55

标签: encryption cryptography tripledes

我试图了解TripleDES加密的简单代码,看看它是如何工作的。我在谷歌上看到了很多代码。其中一些使用了TripleDES类,其中一些使用了TripleDESCryptoServiceProvider类。我所知道的,第二个是从第一个继承的。

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. 哪个班级更受欢迎?

  3. TransformFinalBlock()和FlushFinalBlock()有什么区别?

  4. 有些代码没有使用MemoryStream和CryptoStream类。而且效果很好。那么使用这些流有什么好处呢?

  5. 最后,在上面的代码中,我如何知道使用了keyize,cyphermode和padding算法?

  6. 提前致谢。

1 个答案:

答案 0 :(得分:4)

  1. TripleDESCryptoServiceProvider使用CSP(一种加密服务提供商),它可能是一种软件实现,但它也可以代表智能卡上的实现。

  2. 大多数情况下,您应该使用Microsoft在示例代码中所做的TripleDESCryptoServiceProvider;这样就可以切换CSP(增加安全性或速度)。

  3. FlushFinalBlockTransformFinalBlock的流版本。它表示可以对流上已有的数据执行最后的计算。 TransformFinalBlock也执行最后的计算,但使用给定的数据并返回实际结果。

  4. 它们经常被使用。很多代码只是先将所有内容存储在一个字节数组中,然后从中创建一个流。那根本没用。流式传输对于您不希望同时存在于内存中的较大数据块非常有用。或者,如果您想直接传输到文件或从文件传输。当然,您可以创建一个方法,即使对于小数据也可以将流作为参数,因此您可以稍后进行升级。但这通常不是如何使用流。

  5. 他们可能由CSP决定,但我找不到该问题的最终答案。与所有加密实现一样,它可能是最安全的不依赖于任何默认值,特别是如果它们定义不明确或每个实现不同。清楚地指定您正在使用的密钥长度等,这使您的代码能够在未来证明并且更易于维护。