2

我试图了解 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. 最后,在上面的代码中,我如何知道使用了什么 keysize、cyphermode 和 padding 算法?

提前致谢。

4

1 回答 1

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

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

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

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

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

于 2014-05-25T01:54:55.987 回答