C#加密出错第2部分

时间:2009-10-01 17:39:59

标签: c# encryption

真的没有一个好的加密周。让我解释一下我需要什么。

  1. 我想将字符串值加密到文件....
  2. 我想使用C#
  3. 将文件内容解密回字符串
  4. 我想这样做而不必担心机器商店或用户商店或任何其他商店,也不用担心注册表等。
  5. 任何安全密钥都可以在我的应用程序中提供。
  6. 安全性不一定非常强大,我的代码也是混淆的。

    我只想要一个可移植的解决方案。我已经尝试了RSA,在发现生产中缺少某个密钥文件之后,它让我无处可去,这些我一无所知,无法在开发机器上找到它。

    请帮忙。

5 个答案:

答案 0 :(得分:3)

以下是我使用的一些代码(从网上的源代码改编而来),它完全依赖于在setup.s下的web.config / app.config中存储的密码。它使用三重des。

 /// <summary>
        /// Encrypts the string.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <returns>Encrypted string</returns>
        public string EncryptString(string text)
        {
            // Locals
            var passphrase = ConfigurationManager.AppSettings["Your Encrypt Passphrase"];
            byte[] results;
            var utf8 = new UTF8Encoding();

            // Step 1. We hash the passphrase using MD5
            // We use the MD5 hash generator as the result is a 128 bit byte array
            // which is a valid length for the TripleDES encoder we use below
            var hashProvider = new MD5CryptoServiceProvider();
            var tdesKey = hashProvider.ComputeHash(utf8.GetBytes(passphrase));

            // Step 2. Create a new TripleDESCryptoServiceProvider object
            // Step 3. Setup the encoder
            var tdesAlgorithm = new TripleDESCryptoServiceProvider
                                    {
                                        Key = tdesKey,
                                        Mode = CipherMode.ECB,
                                        Padding = PaddingMode.PKCS7
                                    };

            // Step 4. Convert the input string to a byte[]
            var dataToEncrypt = utf8.GetBytes(text);

            // Step 5. Attempt to encrypt the string
            try
            {
                var encryptor = tdesAlgorithm.CreateEncryptor();
                results = encryptor.TransformFinalBlock(dataToEncrypt, 0, dataToEncrypt.Length);
            }
            finally
            {
                // Clear the TripleDes and Hashprovider services of any sensitive information
                tdesAlgorithm.Clear();
                hashProvider.Clear();
            }

            // Step 6. Return the encrypted string as a base64 encoded string
            return Convert.ToBase64String(results);
        }

        /// <summary>
        /// Decrypts the string.
        /// </summary>
        /// <param name="text">The text.</param>
        /// <returns>Decrypted string</returns>
        public string DecryptString(string text)
        {
            // Locals
            var passphrase = ConfigurationManager.AppSettings["Your Encrypt Passphrase"];
            byte[] results;
            var utf8 = new UTF8Encoding();

            // Step 1. We hash the passphrase using MD5
            // We use the MD5 hash generator as the result is a 128 bit byte array
            // which is a valid length for the TripleDES encoder we use below
            var hashProvider = new MD5CryptoServiceProvider();
            var tdesKey = hashProvider.ComputeHash(utf8.GetBytes(passphrase));

            // Step 2. Create a new TripleDESCryptoServiceProvider object
            // Step 3. Setup the decoder
            var tdesAlgorithm = new TripleDESCryptoServiceProvider
                                    {
                                        Key = tdesKey,
                                        Mode = CipherMode.ECB,
                                        Padding = PaddingMode.PKCS7
                                    };

            // Step 4. Convert the input string to a byte[]
            var dataToDecrypt = Convert.FromBase64String(text);

            // Step 5. Attempt to decrypt the string
            try
            {
                var decryptor = tdesAlgorithm.CreateDecryptor();
                results = decryptor.TransformFinalBlock(dataToDecrypt, 0, dataToDecrypt.Length);
            }
            finally
            {
                // Clear the TripleDes and Hashprovider services of any sensitive information
                tdesAlgorithm.Clear();
                hashProvider.Clear();
            }

            // Step 6. Return the decrypted string in UTF8 format
            return utf8.GetString(results);
        }

原始来源位于:http://www.dijksterhuis.org/encrypting-decrypting-string/

答案 1 :(得分:2)

您无法在应用程序中存储机密。期。如果奖品有价值,某人会找到您的密钥。在这个时代,一旦足够。 Google会为有兴趣找到该密钥的任何人提供答案。一旦密钥泄露,它就会影响到每个人的数据,无处不在。

您的秘密(密钥)必须来自外部(例如,用户提供的密码,配置的证书和密钥,密钥交换协议)。

如果您坚持将密钥存储在应用程序中,从而提供最低级别的数据混淆(不受特权保护),则使用CryptoStream和对称密钥算法,如{{3}处的基于Rijndael的示例用硬编码键。但是你必须要知道这不是混淆。

答案 2 :(得分:1)

你有没有看过Bouncy Castle API

答案 3 :(得分:1)

从埃里克的反应来看,听起来你可能会比你更复杂;或者在没有必要时尝试非对称加密?

对于您所描述的加密类型,您实际上只需要将一些参数传递给加密和解密方法即可完成任务。

从CodeProject查看this example。它以简单的方式使用Rijndael算法,甚至包括用于读/写文件的代码。

答案 4 :(得分:1)

如果您在创建密钥时遇到问题请尝试CrypTool,这是了解密码学时非常有用的工具。