2013-10-12 4 views
0

Я знаю, что этот вопрос задан раньше, но ответ просто не был тем, что мне нужно. Мне нужно создать защищенный паролем текстовый файл. Я не собираюсь шифровать, а просто создавать файл с помощью простого текстового пароля. Также было бы неплохо узнать, как открыть этот файл на C#.Как сделать защищенный паролем файл в C#

Создайте защищенный паролем файл с открытым текстом и откройте этот файл позднее. Все в C#.

+0

Вы можете зашифровать пароль, используя сам. Вот как обычно делаются вещи. Просто создайте 'Key' и' IV' на основе пароля (и без случайных факторов), а затем зашифруйте пароль и сохраните его в файл. Вы просто проверяете путем дешифрования. –

+0

Если он не зашифрован, любой может просто открыть его с помощью редактора, который они пожелают, и отследить, пока они этого не захотят. Кроме того, ничто в неконтролируемом ПК не может быть доверено (так что даже шифрование не является 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 справится с этим, поэтому я решил пойти с предложением Ханса Пассана и просто использовать защищенный паролем zip-файл с необходимой информацией (txt-файлы) внутри Это. Это можно легко сделать с помощью DotNetZip.

+0

Безопасность Windows не основана на паролях. Он основан на принципах безопасности. –

Смежные вопросы