如何在 C# 中制作受密码保护的文件

本文关键字:密码保护 文件 | 更新日期: 2023-09-27 18:35:06

我知道这个问题以前有人问过,但答案根本不是我需要的。我需要创建一个受密码保护的文本文件。我并不是要加密,而只是使用简单的文本密码创建一个文件。了解如何在 C# 中打开此文件也会很好。

创建一个受密码保护的纯文本文件,并在以后打开此文件。全部使用 C# 中。

如何在 C# 中制作受密码保护的文件

密码保护未加密的文本文件实际上是不可能的。 但是,您可以验证您的文本文件是否已被修改,以便您知道它已被某人更改。

这个概念很简单。 使用密码加密或模糊处理数据的哈希(文本文件)。 您可以稍后根据当前数据检查此哈希并确定它是否匹配。 您需要将此签名(加密哈希)存储在名为(textfile.sig)的文件中。

可以使用 SHA1Managed .NET 类创建哈希,并使用 TripleDESCryptoServiceProvider 类对生成的哈希进行加密。

像...

public string GetSignature(string text, string password)
{
    byte[] key;
    byte[] key2;
    GetKeys(password, out key, out key2);
    string sig = encryptstring(GetSHA1(text), key, key2);
}    
public void GetKeys(string password, out byte[] key, out byte[] key2)
{
    byte[] data = StringToByte(password);
    SHA1 sha = new SHA1CryptoServiceProvider();
    MD5 md5 = new MD5CryptoServiceProvider();
    byte[] hash1 = sha.ComputeHash(data);
    byte[] hash2 = md5.ComputeHash(data);
    // Generate some key data based on the supplied password;
    byte[] key = new byte[24];
    for (int i = 0; i < 20; i++)
    {
        key[i] = hash1[i];
    }
    for (int i = 0; i < 4; i++)
    {
        key[i + 20] = hash2[i];
    }
    byte[] key2 = new byte[8];
    for (int i = 0; i < 8; i++)
    {
        key2[i] = hash2[i+4];
    }
}
public string GetSHA1(string text)
{
    UnicodeEncoding UE = new UnicodeEncoding();
    byte[] hashValue;
    byte[] message = UE.GetBytes(text);
    SHA1Managed hashString = new SHA1Managed();
    string hex = "";
    hashValue = hashString.ComputeHash(message);
    foreach (byte x in hashValue)
    {
        hex += String.Format("{0:x2}", x);
    }
    return hex;
}
public string ByteToString(byte[] buff)
{
    string sbinary = "";
    for (int i = 0; i < buff.Length; i++)
    {
        sbinary += buff[i].ToString("X2"); // hex format
    }
    return (sbinary);
}
public string encryptstring(string instr, byte[] key, byte[] key2)
{
    TripleDES threedes = new TripleDESCryptoServiceProvider();
    threedes.Key = key;
    threedes.IV = key2;
    ICryptoTransform encryptor = threedes.CreateEncryptor(key, key2);
    MemoryStream msEncrypt = new MemoryStream();
    CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
    // Write all data to the crypto stream and flush it.
    csEncrypt.Write(StringToByte(instr), 0, StringToByte(instr).Length);
    csEncrypt.FlushFinalBlock();
    return ByteToString(msEncrypt.ToArray());
}
public string decryptstring(string instr, byte[] key, byte[] key2)
{
    if (string.IsNullOrEmpty(instr)) return "";
    TripleDES threedes = new TripleDESCryptoServiceProvider();
    threedes.Key = key;
    threedes.IV = key2;
    ICryptoTransform decryptor = threedes.CreateDecryptor(key, key2);
    // Now decrypt the previously encrypted message using the decryptor
    MemoryStream msDecrypt = new MemoryStream(HexStringToByte(instr));
    CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
    try
    {
        return ByteToString(csDecrypt);
    }
    catch (CryptographicException)
    {
        return "";
    }
}

否则,如果要对人们隐藏数据,则需要加密文本文件中的数据。 您可以通过使用全文数据而不是数据的哈希值调用 encryptstring() 来执行此操作。

问题的全部意义在于不必手动加密数据,而是让Windows处理它,所以我决定接受Hans Passant的建议,简单地使用一个受密码保护的zip文件,其中包含所需的信息(txt文件)。这可以通过DotNetZip轻松完成。