2013-10-12 54 views
0

我知道這個問題以前已經問過,但答案根本不是我所需要的。我需要創建一個受密碼保護的文本文件。我不是說要加密,而是用簡單的文本密碼創建一個文件。這也很好找出如何在C#中打開這個文件。如何在C#中創建一個受密碼保護的文件

創建一個明文密碼保護的文件,並在稍後打開該文件。全部在C#中。

+0

您可以使用自己加密密碼。這就是通常的做法。只需根據密碼(並且沒有隨機因素)生成「Key」和「IV」,然後加密密碼並將其存儲到文件中。您只需通過解密進行驗證。 –

+0

如果沒有加密,任何人都可以用他們希望的編輯器打開它,直到他們想要。此外,不受控制的PC中的任何內容都不可信(因此,即使是本地加密也不是100%的解決方案) – SJuan76

+2

您打算如何在不加密密碼的情況下用密碼保護文件? –

回答

1

密碼保護沒有加密的文本文件是不可能的。但是,您可以驗證您的文本文件是否已被修改,以便您知道它已被某人更改。

這個概念很簡單。使用密碼來加密或混淆數據的散列(文本文件)。稍後您可以根據當前數據檢查該散列,並確定它是否匹配。您需要將此簽名(加密哈希)存儲在某個名爲(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()來做到這一點。

0

問題的關鍵在於不必手動加密數據,而是讓Windows處理數據,因此我決定使用Hans Passant的建議,並簡單地使用密碼保護的zip文件以及所需的信息(txt文件)它。這可以很容易地用DotNetZip完成。

+0

Windows安全不基於密碼。它基於安全主體。 –

相關問題