c# - 我正在为我的应用程序使用 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 文件。非常感谢。
解决方案
您想使用消息验证码 (MAC),它可用于确定密文(或明文,见下文)中的任何位是否已以任何方式修改。
例如,在 C# 中,您可以为此使用 HMACSHA256。除了对称加密密钥之外,您还需要一个单独的 MAC 密钥。
基本思想是执行以下操作:使用您的加密密钥和初始化向量加密明文。
连接初始化向量和密文。
使用您的 MAC 密钥在组合的 iv + 密文上计算 MAC。
将 MAC 连接到初始化向量 + 密文。你现在有一个字节序列:[MAC][IV][Ciphertext]。
当您解密文件时,您首先从字节序列的开头提取 MAC。然后,使用 MAC 密钥在 iv + 密文字节上计算 MAC。现在将结果与您提取的 MAC 进行比较。如果它们匹配,您就知道没有发生数据篡改,并且您在解密密文时得到的明文是原始的,在原始加密和 MAC 生成发生的同时存在。
您还可以在明文上生成 MAC,然后将其与明文一起加密,并在解密后进行 MAC 验证。通常最好先进行(更快的)MAC 验证,然后再对完整的有效负载进行实际解密,这会更昂贵。
推荐阅读
- c# - 为什么这个 MVC 方法不能以并行方式运行?
- javascript - 如何通过使用纯 JavaScript 选中复选框来显示表格?
- javascript - 子组件未定义
- c++ - C/C++ 内存模型是否允许相同字节的不同粒度的原子?
- c++ - 函数的特化。指针类型名和字符串之间的区别?
- postgresql - PostgreSQL,试图将日期列从 csv 文件复制到表的列
- reactjs - 在modal中打开一个新的modal并关闭上一个
- sqlite - 如何模拟变量、循环和串联以在 SQLite 中协同工作?
- azure - 对于 AKS 入口,letsencrypt 证书请求失败
- python - 遍历嵌套的 Dictionary 对象并获取 Python 中特定对象的值