Encryption TripleDES类和TripleDESCryptoServiceProvider类之间的差异

Encryption TripleDES类和TripleDESCryptoServiceProvider类之间的差异,encryption,cryptography,tripledes,Encryption,Cryptography,Tripledes,我试图理解三重加密的简单代码,看看它是如何工作的。我在谷歌上看到了很多代码。他们中有些人使用class,有些人使用class。据我所知,第二个是从第一个继承来的 TripleDES类:(仅显示加密部分) 和TripleDESCryptoServiceProvider类:(仅加密代码) 这两种代码工作正常,99%相同。但我的问题是 这两门课有什么不同 哪一类更容易接受 TransformFinalBlock()和FlushFinalBlock()之间有什么区别 有些代码不使用MemoryStrea

我试图理解三重加密的简单代码,看看它是如何工作的。我在谷歌上看到了很多代码。他们中有些人使用class,有些人使用class。据我所知,第二个是从第一个继承来的

TripleDES类:(仅显示加密部分)

和TripleDESCryptoServiceProvider类:(仅加密代码)

这两种代码工作正常,99%相同。但我的问题是

  • 这两门课有什么不同

  • 哪一类更容易接受

  • TransformFinalBlock()和FlushFinalBlock()之间有什么区别

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

  • 最后,在上面的代码中,我如何知道使用了什么键大小、密码和填充算法

  • 提前谢谢

  • TripleDESCryptoServiceProvider
    使用CSP,一种加密服务提供商,它可以是一种软件实现,但也可以表示智能卡上的实现

  • 大多数情况下,您应该像Microsoft在示例代码中所做的那样使用
    TripleDescriptionServiceProvider
    ;这使得切换CSP成为可能(为了增加安全性或速度)

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

  • 它们使用得太频繁了。很多代码只是首先将所有内容存储在字节数组中,然后从中创建一个流。那根本没用。对于不希望同时存储在内存中的较大数据块,流式传输非常有用。或者,如果您想直接从文件流到文件。当然,您可以创建一个方法,即使对于小数据,也可以将流作为参数,以便以后升级。但通常情况下,这些流并不是这样使用的

  • 他们可能由CSP决定,但我找不到关于这个问题的任何最终答案。与所有加密实现一样,不依赖任何默认值可能是最安全的,特别是当它们定义错误或每个实现不同时。清楚地指定您正在使用的密钥长度等,这将使您的代码经得起未来的考验,并且更易于维护

  • TripleDESCryptoServiceProvider
    使用CSP,一种加密服务提供商,它可以是一种软件实现,但也可以表示智能卡上的实现

  • 大多数情况下,您应该像Microsoft在示例代码中所做的那样使用
    TripleDescriptionServiceProvider
    ;这使得切换CSP成为可能(为了增加安全性或速度)

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

  • 它们使用得太频繁了。很多代码只是首先将所有内容存储在字节数组中,然后从中创建一个流。那根本没用。对于不希望同时存储在内存中的较大数据块,流式传输非常有用。或者,如果您想直接从文件流到文件。当然,您可以创建一个方法,即使对于小数据,也可以将流作为参数,以便以后升级。但通常情况下,这些流并不是这样使用的

  • 他们可能由CSP决定,但我找不到关于这个问题的任何最终答案。与所有加密实现一样,不依赖任何默认值可能是最安全的,特别是当它们定义错误或每个实现不同时。清楚地指定您正在使用的密钥长度等,这将使您的代码经得起未来的考验,并且更易于维护


  • 猫头鹰,非常感谢你的回答。特别是第四个答案真的派上了用场。但是,在第二个答案中,你说“这使得切换CSP成为可能(为了增加安全性或速度)。”---你能解释一下吗?我想知道有多少CSP,它们是什么。(希望你不是指AESCryptoServiceProvider或DESCryptoServiceProvider……等等)它是一个插件结构,因此可以用来切换实现,而不是使用与接口相同的类的算法(很像Java JCA/JCE,这并不奇怪)。要在特定算法之间切换,应使用基类
    SymmetricAlgorithm
    。通常使用的CSP当然使用Windows密钥存储和软件实现。更多信息Owlstead,非常感谢你的回答。特别是第四个答案真的派上了用场。但是,在第二个答案中,你说“这使得切换CSP成为可能(为了增加安全性或速度)。”---你能解释一下吗?我想知道有多少CSP,它们是什么。(希望你不是指AESCryptoServiceProvider或DESCryptoServiceProvider……等等)它是一个插件结构,因此可以用来切换实现,而不是使用与接口相同的类的算法(很像Java JCA/JCE,这并不奇怪)。要在特定算法之间切换,应使用基类
    SymmetricAlgorithm
    。通常使用的CSP当然使用Windows密钥存储和软件实现。更多信息
    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;
    
        }
    
    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;
    
        }