【问题标题】:Difference between TripleDES class and TripleDESCryptoServiceProvider classTripleDES 类和 TripleDESCryptoServiceProvider 类之间的区别
【发布时间】:2014-05-24 21:37:54
【问题描述】:

我正在尝试了解 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. 最后,在上面的代码中,我如何知道使用了什么密钥大小、密码模式和填充算法?

提前致谢。

【问题讨论】:

    标签: encryption cryptography tripledes


    【解决方案1】:
    1. TripleDESCryptoServiceProvider 使用 CSP,即加密服务提供者,它可能是软件实现,但也可以表示智能卡上的实现。

    2. 大多数时候你应该使用TripleDESCryptoServiceProvider,就像微软在示例代码中所做的那样;这使得切换 CSP 成为可能(以增加安全性或速度)。

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

    4. 它们使用得太频繁了。很多代码只是先将所有内容存储在一个字节数组中,然后从中创建一个流。这根本没用。流式处理对于您不想同时在内存中拥有的较大数据块很有用。或者,如果您想直接流入或流出文件。当然,即使对于小数据,您也可以创建一个将流作为参数的方法,以便以后升级。但这通常不是流的使用方式。

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

    【讨论】:

    • Owlstead,非常感谢您的回答。特别是答案 4 真的派上用场了。但是,在第二个答案中,您说“这使得切换 CSP 成为可能(以增加安全性或速度)。” ---你能解释一下吗?我想知道那里有多少 CSP,它们是什么。 (希望你不是指 AESCryptoServiceProvider 或 DESCryptoServiceProvider .....等)
    • 它是一个插件结构,所以它可以用来切换实现,而不是使用与接口相同的类的算法(很像Java JCA/JCE,这并不奇怪)。要在特定算法之间切换,您应该使用基类SymmetricAlgorithm。通常使用的 CSP 当然使用 Windows 密钥库和软件实现。更多信息here
    猜你喜欢
    • 2011-03-30
    • 1970-01-01
    • 2014-02-26
    • 2013-10-05
    • 2016-09-28
    • 2012-12-09
    • 2017-10-02
    • 2011-04-07
    • 1970-01-01
    相关资源
    最近更新 更多