我正在为我的应用程序使用C#加密器将加密的消息写入文件,并寻找一种方法来验证它是否为原始文件

问题描述

因此,我有一个用C#Windows窗体编写的文本文件加密应用程序,它可以对在文本框中输入的消息进行加密,并将消息的加密版本保存到文件中。然后,用户必须输入创建文件的日期,并检查该日期以打开文件。但是我想知道,是否可以增加额外的安全性来验证它是否确实是程序创建的原始文件而不是冒名顶替的txt文件

这是加密课程,谢谢。

    class Encryptor1

    {
        public static string IV = "1a1a1a1a1a1a1a1a";
        public static string Key = "1a1a1a1a1a1a1a1a1a1a1a1a1a1a1a13";

        public static string Encrypt(string decrypted)
        {
            byte[] textbytes = ASCIIEncoding.ASCII.GetBytes(decrypted);
            AesCryptoServiceProvider endec = new AesCryptoServiceProvider();
            endec.BlockSize = 128;
            endec.KeySize = 256;
            endec.IV = ASCIIEncoding.ASCII.GetBytes(IV);
            endec.Key = ASCIIEncoding.ASCII.GetBytes(Key);
            endec.Padding = PaddingMode.PKCS7;
            endec.Mode = CipherMode.CBC;
            ICryptoTransform icrypt = endec.CreateEncryptor(endec.Key,endec.IV);
            byte[] enc = icrypt.TransformFinalBlock(textbytes,textbytes.Length);
            icrypt.dispose();
            return Convert.ToBase64String(enc);
        }

        public static string Decrypted(string encrypted)
        {

            DateTime creation = File.GetCreationTime(@"C:\encryptedmessagehere.txt");

            string asstring = creation.ToString("MM/dd/yyyy hh:mm:ss tt");


            var created = Form2.keyhere;
            if (created != asstring)
{
                string message = "That is incorrect,access is denied.";
                MessageBox.Show(message);
            }
            else if (created == asstring)
            {

                byte[] textbytes = Convert.FromBase64String(encrypted);
                AesCryptoServiceProvider endec = new AesCryptoServiceProvider();
                endec.BlockSize = 128;
                endec.KeySize = 256;
                endec.IV = ASCIIEncoding.ASCII.GetBytes(IV);
                endec.Key = ASCIIEncoding.ASCII.GetBytes(Key);
                endec.Padding = PaddingMode.PKCS7;
                endec.Mode = CipherMode.CBC;
                ICryptoTransform icrypt = endec.CreateDecryptor(endec.Key,endec.IV);
                byte[] enc = icrypt.TransformFinalBlock(textbytes,textbytes.Length);
                icrypt.dispose();
                return System.Text.ASCIIEncoding.ASCII.GetString(enc);

            }

            return encrypted;
        }
    }
}

如果需要,我可以提供创建文件代码,它只是一个普通的txt文件。非常感谢。

解决方法

您想使用消息验证码(MAC),该消息可用于确定密文(或明文,请参见下文)中的任何位是否已被修改。

例如,在C#中,您可以为此使用HMACSHA256。除了对称加密密钥之外,您还需要一个单独的MAC密钥。

基本思路是执行类似操作:使用您的加密密钥和初始化向量对纯文本进行加密。

连接初始化向量和密文。

使用您的MAC密钥在组合的iv +密文上计算机MAC。

将MAC连接到初始化向量+密文。现在,您有了一个字节序列:[MAC] [IV] [Ciphertext]。

当您解密文件时,首先要从字节序列的开头提取MAC。然后,使用MAC密钥在iv +密文字节上计算MAC。现在将结果与您提取的MAC进行比较。如果它们匹配,就不会发生数据篡改,解密密文时得到的明文就是在原始加密和生成MAC的同时出现的原始文件。

您还可以在明文上生成MAC,然后将其与明文一起加密,并在解密后进行MAC验证。通常最好先进行(更快的)MAC验证,然后再进行实际的全部有效载荷解密,这会更加昂贵。

,

您应该研究散列。它本质上是一种将任何数据转换为大多数唯一的固定数量字符的功能。您可以将哈希存储在某个位置,然后将其与另一个文件的哈希进行比较,以确保它不是冒​​名顶替者。