2014-01-26 5 views
-3

Хорошо, я знаю, что это было рассмотрено несколько раз, и я прочитал несколько сообщений здесь о алгоритмах шифрования и методах криптографии и т. Д. Однако теперь моя голова вращается, и я все еще не уверен, что мне нужно делать. У меня есть набор данных, который находится в формате XML, который мне нужно сохранить в файл.xml для зашифрованного файла?

Это не очень чувствительно (никаких кредитных карт или что-то еще), но я не хочу, чтобы пользователи могли просто открывать его как xml и редактировать, и т. Д. Меня не очень беспокоит кто-то, кто программирует здравый взлом формат или декомпиляция, чтобы найти ключи и т.д.

То, что я хотел бы это базовый класс, который я могу передать значение строки (или XmlDocument, но вы всегда можете позвонить .OuterXml на это) и ключ, который я буду жесткий код и получить зашифрованное значение, которое я могу записать в файл. Затем мне нужно было бы прочитать файл на другой машине (клиент/клиентскую машину) и расшифровать обратно к строке xml, которая будет обрабатываться моей программой. Опять же, ключи могут быть жестко закодированы в программе, чтобы они совпадали в обоих местоположениях ...

Также я не хочу спрашивать у пользователя пароль или что-то в этом роде, но я могу жестко скопировать его в если это необходимо.

Может ли кто-нибудь указать мне на простой способ сделать это?

+1

Этот вопрос не подходит для SO –

+4

. Я уверен, что вы можете найти хорошие учебные пособия в Интернете по этому вопросу: я намекаю, что вы ищете шифрование AES в C# –

+1

Кроме того, в качестве руководства SO мы не учитываем благодарность в вопросе –

ответ

0

Общий вот что вам нужно сделать

  1. Иметь строку как обычный текст (не зашифрованном)
  2. Преобразовать его в массив байт (это проще Cypher алгоритмов для работы с Byte [])
  3. Have A Cypher экземпляра алгоритма
  4. ENC rypt вашего обычного массива текст байт с шифром и ваш выводом является encryped байтового массива
  5. Хранить его в байтах [] или хранить его в строке использовать Convert.ToBase64String()

Для некоторых примеров коды:

Для Этап 1

private System.Security.Cryptography.SymmetricAlgorithm GetAesKey() 
    { 
     byte[] symKey = RandomNextBytes(); 
     var aes = System.Security.Cryptography.SymmetricAlgorithm.Create(); 
     aes.Key = symKey; 
     aes.IV = symKey; 
     aes.Mode = CipherMode.ECB; 
     aes.Padding = PaddingMode.PKCS7; 
     return aes; 
    } 

Приведенный выше код создает различный ключ aes каждый раз при вызове. RandomNextBytes - это просто оболочка для случайного создания 16 байтов. Обратите внимание, что .NET native random не является потокобезопасным, поэтому, если вам нужен безопасный вид потока для Jon Skeet Thread-safe implementation.

Вы, вероятно, хотите контроль Если вы хотите, чтобы иметь контроль над ключом AES, так что вы можете иметь symKey как этот

byte[] symKey = new byte[] { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16} 

В течение следующих шагов обернуть Cypher логики в хорошем методе

private string EncryptSymmetricToBase64(SymmetricAlgorithm symAlg, string plainText) 
{ 
    using (var ms = new MemoryStream()) 
    { 
     using (var cs = new CryptoStream(ms, symAlg.CreateEncryptor(symAlg.Key, symAlg.IV), CryptoStreamMode.Write)) 
     using (var sw = new StreamWriter(cs)) 
     { 
      sw.Write(plainText); 
     } 
     string ciphered = Convert.ToBase64String(ms.ToArray()); 
     return ciphered; 
    } 
} 

Приведенный выше код выбирает простой текст и алгоритм шифрования. Затем он шифрует строку, используя CryptoStream. Перед возвратом он преобразует зашифрованный байт [] в строку base64.

Примечание: Base64 - это известный алгоритм преобразования двоичных данных в строку и обратно.

+0

Спасибо. Очень полезная схема! – sfaust

1

Эта ссылка поможет вам. вам нужно будет дополнительно изменить пример кода на веб-сайте, чтобы зашифровать все элементы XML

http://msdn.microsoft.com/en-us/library/ms229746(v=vs.110).aspx

+0

Спасибо, я посмотрю на это и посмотрю, смогу ли я заставить его работать на меня. – sfaust

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