首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >TripleDES类与TripleDESCryptoServiceProvider类的区别

TripleDES类与TripleDESCryptoServiceProvider类的区别
EN

Stack Overflow用户
提问于 2014-05-24 21:37:54
回答 1查看 3.2K关注 0票数 2

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

TripleDES类:(只显示购买部分)

代码语言:javascript
复制
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类:(只有加密代码)

代码语言:javascript
复制
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. 最后,在上面的代码中,我如何知道所使用的密钥大小、密码模式和填充算法?

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-05-25 01:54:55

  1. TripleDESCryptoServiceProvider使用加密服务提供商CSP,它可能是一个软件实现,但也可以表示智能卡上的实现。
  2. 大多数情况下,您应该像微软在示例代码中一样使用TripleDESCryptoServiceProvider;这使得切换CSP(为了增加安全性或速度)成为可能。
  3. FlushFinalBlockTransformFinalBlock的流版本。它表明,可以对流上的数据执行最后一次计算。TransformFinalBlock还执行最后一次计算,但使用给定的数据并返回实际结果。
  4. 它们经常被使用。很多代码只是先将所有内容存储在一个字节数组中,然后再由此创建一个流。一点用都没有。流对于更大的数据块非常有用,而这些数据块不希望同时在内存中存储。或者,如果您想直接从一个文件中流到另一个文件中。当然,您可以创建一个将流作为参数的方法,即使对于小数据也是如此,所以以后可以进行升级。但通常情况下,这些流并不是这样使用的。
  5. 这些建议可能是由临时立法会议员决定的,但我无法就这个问题找到最后答案。与所有加密实现一样,不依赖任何默认值可能是最安全的,特别是在每个实现定义不当或不同的情况下。明确指定您正在使用的密钥长度等,这使您的代码未来的证明和易于维护。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23849882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档