【问题标题】:How do I use the TripleDESCryptographyServiceProvider class? [duplicate]如何使用 TripleDESCryptographyServiceProvider 类? [复制]
【发布时间】:2016-03-13 17:31:45
【问题描述】:

我在 C# 中摆弄密码学。我的文件正在加密,但无法解密。我收到 CryptographyException“错误数据”。我认为这与编码有关,但我没有使用任何编码或字节。

// Encrypts the data
    public bool encrypt ( ) {
        try {
            // Create or open the specified file.
            FileStream fStream = File.Open ( _encPath, FileMode.OpenOrCreate );

            // Create a CryptoStream using the FileStream 
            // and the passed key and initialization vector (IV).
            CryptoStream cStream = new CryptoStream ( fStream,
                _tdes.CreateEncryptor ( _tdes.Key, _tdes.IV ),
                CryptoStreamMode.Write );

            // Create a StreamWriter using the CryptoStream.
            StreamWriter sWriter = new StreamWriter ( cStream );

            // Write the data to the stream 
            // to encrypt it.
            sWriter.WriteLine ( _content );

            // Close the streams and
            // close the file.
            sWriter.Close ( );
            cStream.Close ( );
            fStream.Close ( );
        } catch ( CryptographicException e ) {
            Console.WriteLine ( "A Cryptographic error occurred: {0}", e.Message );
            return false;
        } catch ( UnauthorizedAccessException e ) {
            Console.WriteLine ( "A file access error occurred: {0}", e.Message );
            return false;
        }

        return true;
    }

 // Decrypts the file
    public bool decrypt ( ) {
        try {
            // Create or open the specified file. 
            FileStream fStream = File.Open ( _path, FileMode.OpenOrCreate );

            // Create a CryptoStream using the FileStream 
            // and the passed key and initialization vector (IV).
            CryptoStream cStream = new CryptoStream ( fStream,
                _tdes.CreateDecryptor ( _tdes.Key, _tdes.IV ),
                CryptoStreamMode.Read ); // Exception happens here

            // Create a StreamReader using the CryptoStream.
            StreamReader sReader = new StreamReader ( cStream );

            // Read the data from the stream 
            // to decrypt it.
            String val = sReader.ReadLine ( );

            // Close the streams and
            // close the file.
            sReader.Close ( );
            cStream.Close ( );
            fStream.Close ( );

            File.WriteAllText ( _decPath, val );
        } catch ( CryptographicException e ) {
            Console.WriteLine ( "A Cryptographic error occurred: {0}", e.Message );
            return false;
        } catch ( UnauthorizedAccessException e ) {
            Console.WriteLine ( "A file access error occurred: {0}", e.Message );
            return false;
        }

        return true;
    }
}

有人有想法吗?

提前致谢!

编辑:这不是一个重复的问题。我的方法和加密的方法完全不同。

编辑 2:

【问题讨论】:

  • 密文可以包含任何值的字节。它不必对应于任何 valid 编码,这会导致字节丢失。如果您正在处理二进制数据,请不要使用 StreamWriter 或 StreamReader。
  • 什么是被加密的纯文本和iv以及密钥?可以从问题复制/粘贴到测试环境的输入和输出会有所帮助。
  • 传递参数比使用实例变量更好,这尤其有助于调试/测试。
  • 解密时iv需要和加密一样,这通常是通过在加密数据前加上iv来完成的。
  • IV 是一样的。我创建了一次 Cryptographer() 类,该类又创建了一次 _tdes。密钥和 IV 生成一次,加密/解密使用相同的 _tdes。

标签: c# .net cryptography filestream tripledes


【解决方案1】:

您的代码实际上在 linqpad 5 (.net 4.6) 中为我工作。

您是否确保在运行之间删除或正确清除文件?考虑到您使用流写入加密文件的方式,您可能只是从一个运行到另一个运行整个文件的部分更新。

【讨论】:

  • 这只是一个测试版本。在加密和解密之间不关闭程序。仍然必须找到一种存储密钥的方法,所以我现在只是让应用程序运行,以便能够使用相同的密钥。
  • 问题中的示例代码没有显示您清除文件。如果您在程序中重新使用它,可能会发生的情况是,当加密内容变短时,它可能会留下一些旧位。例如,如果您的加密内容是 12345,那么您使用新的加密内容 ABC 更新文件,您将留下 ABC45
  • 我明白你的意思,但这应该不是问题。我有一个包含“lorem ipsum dolor sit amet”的文本文件。我加密了一次,它目前位于“加密”文件夹中。当我对该文件运行解密命令时,我立即得到异常。该文件未被再次加密使用,也未被再次写入。
  • 这是我一直用来测试的(对我有用,除非我从大型加密内容转到小型加密内容)。 gist.github.com/kennethito/7c6fa579a2087810b8e7
  • 另一个(尽管不完全相同)它的工作示例。 dotnetfiddle.net/Mh0LsS
猜你喜欢
  • 2012-12-14
  • 2015-10-25
  • 2019-09-26
  • 2018-11-28
  • 2020-10-30
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
相关资源
最近更新 更多