我有以下代码来加密一个值(如下所列)。现在我想写一个bool isencrypted()方法。有没有一种简单可靠的方法来检查一个值是否已使用此函数加密。我有解密程序,可以控制密码短语,但不确定这是否有用。
原因是-当应用程序首次运行时,配置文件中的值未加密,在这种情况下,应用程序应自动加密这些值。在第二次运行时,我不想再次加密,因为很明显,这会造成严重破坏。最后,我不想在配置值中添加一个isencrypted属性。我希望它能工作,看起来尽可能有活力。
到目前为止,我倾向于使用len(128)作为决定因素,但总是有一个很小的机会,即未加密的值也是这个长度。
提前谢谢。

public static string encrypt(string text)
    {
        // Locals
        var passphrase = "5ab394ed-3920-4932-8d70-9c1b08f4ba4e";
        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);
    }

最佳答案

在isencrypted方法中,您可以尝试解密消息。
由于您使用的是pkcs7填充,很可能未加密的消息将无法解密,因为填充不符合设置填充模式。
解密将抛出一个异常,在这种情况下,您必须捕获它并返回false。
如果数据符合填充模式,则很有可能(当消息未加密时)进行解密。然而,这是最不可能的。
在这种情况下,我要做的是在加密的数据中添加某种标志,或者在加密的消息中附加一些数据,因为我可以在解密时删除它。这将是最简单的方法。

07-24 09:37
查看更多