首页 > 解决方案 > 我正在为我的应用程序使用 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, 0, 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, 0, textbytes.Length);
                icrypt.Dispose();
                return System.Text.ASCIIEncoding.ASCII.GetString(enc);

            }

            return encrypted;
        }
    }
}

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

标签: c#visual-studioencryptionbase64aes

解决方案


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

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

基本思想是执行以下操作:使用您的加密密钥和初始化向量加密明文。

连接初始化向量和密文。

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

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

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

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


推荐阅读