我有以下代码来加密一个值(如下所列)。现在我想写一个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。
如果数据符合填充模式,则很有可能(当消息未加密时)进行解密。然而,这是最不可能的。
在这种情况下,我要做的是在加密的数据中添加某种标志,或者在加密的消息中附加一些数据,因为我可以在解密时删除它。这将是最简单的方法。