C # зашифровать файл XML

Это не красиво, но то, как я отказываюсь от firstResponder, когда я не знаю, что это за ответчик:

Создайте UITextField, либо в IB, либо программно. Сделать это скрытым Свяжите это с вашим кодом, если вы сделали это в IB. Затем, когда вы хотите убрать клавиатуру, вы переключаете респондент в невидимое текстовое поле и немедленно отказываетесь от него:

  [self.invisibleField becomeFirstResponder];
  [self.invisibleField resignFirstResponder];
8
задан Arjan Einbu 5 July 2009 в 22:52
поделиться

4 ответа

Если вам нужен один и тот же ключ для шифрования и дешифрования, вам следует использовать симметричный метод (на самом деле это определение). Вот ближайший к вашему образцу (тот же источник). http://msdn.microsoft.com/en-us/library/sb7w85t6.aspx

Опубликованный образец не работает, потому что они используют разные ключи. Не только на разных машинах: запуск программы на одной машине дважды тоже не должен работать (у меня не сработало), потому что они каждый раз используют разные случайные ключи.
попробуйте добавить этот код после создания ключа:

key = new RijndaelManaged();

string password = "Password1234"; //password here
byte[] saltBytes = Encoding.UTF8.GetBytes("Salt"); // salt here (another string)
var p = new Rfc2898DeriveBytes(password, saltBytes); //TODO: think about number of iterations (third parameter)
// sizes are devided by 8 because [ 1 byte = 8 bits ]
key.IV = p.GetBytes(key.BlockSize / 8);
key.Key = p.GetBytes(key.KeySize / 8);

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

ПРИМЕЧАНИЕ : PasswordDeriveBytes.GetBytes () устарел из-за серьезных проблем (безопасности) в Класс PasswordDeriveBytes . Приведенный выше код был переписан для использования вместо него более безопасного класса Rfc2898DeriveBytes (PBKDF2 вместо PBKDF1). Код, созданный с помощью PasswordDeriveBytes , может быть скомпрометирован.

См. Также: Рекомендуемое количество итераций при использовании PKBDF2-SHA256?

14
ответ дан 3 November 2019 в 14:38
поделиться

First of all, if you want to use the same key for encrypting and decrypting, you should look at symmetric cryptography. Asymmetric cryptography is when the keys for encrypting and decrypting are different. Just so that you know - RSA is asymmetric, TripleDES and Rijndael are symmetric. There are others too, but .NET does not have default implementations for them.

I'd advise studying the System.Security.Cryptography namespace. And learning a bit about all that stuff. It has all you need to encrypt and decrypt files, as well as generate a password. In particular, you might be interested in these classes:

  • CryptoStream
  • PasswordDeriveBytes
  • RijndaelManaged

There are also examples for usage in MSDN for each of them. You can use these classes to encrypt any file, not just XML. If however you want to encrypt just a select few elements, you can take a look at System.Security.Cryptography.Xml namespace. I see you've already found one article about it. Keep following the links on that page and you will learn more about those classes.

4
ответ дан 3 November 2019 в 14:38
поделиться

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

Открытый ключ, необходимый для проверки подписи, будет общеизвестен.

Пояснение
Подписание кода защитит его только от изменений, он не будет скрывать какую-либо информацию в нем. В вашем исходном вопросе упоминается шифрование, но я не уверен, что это требование - скрыть данные или просто защитить их от модификации.

Пример кода: (Никогда не публиковать PrivateKey.key. ServerMethods необходимы только при подписании файла xml , ClientMethods необходимы только при проверке файла xml.)

using System;
using System.Diagnostics;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Xml;

public static class Program {
    public static void Main() {
        if (!File.Exists("PublicKey.key")) {
            // Assume first run, generate keys and sign document.
            ServerMethods.GenerateKeyPair();

            var input = new XmlDocument();
            input.Load("input.xml");
            Debug.Assert(input.DocumentElement != null);

            var licNode = input.DocumentElement["lic"];
            Debug.Assert(licNode != null);

            var licNodeXml = licNode.OuterXml;
            var signedNode = input.CreateElement("signature");
            signedNode.InnerText = ServerMethods.CalculateSignature(licNodeXml);
            input.DocumentElement.AppendChild(signedNode);

            input.Save("output.xml");
        }

        if (ClientMethods.IsValidLicense("output.xml")) {
            Console.WriteLine("VALID");
        } else {
            Console.WriteLine("INVALID");
        }
    }

    public static class ServerMethods {
        public static void GenerateKeyPair() {
            var rsa = SharedInformation.CryptoProvider;

            using (var keyWriter = File.CreateText("PublicKey.key"))
                keyWriter.Write(rsa.ToXmlString(false));

            using (var keyWriter = File.CreateText("PrivateKey.key"))
                keyWriter.Write(rsa.ToXmlString(true));
        }

        public static string CalculateSignature(string data) {
            var rsa = SharedInformation.CryptoProvider;
            rsa.FromXmlString(File.ReadAllText("PrivateKey.key"));

            var dataBytes = Encoding.UTF8.GetBytes(data);
            var signatureBytes = rsa.SignData(dataBytes, SharedInformation.HashAlgorithm);
            return Convert.ToBase64String(signatureBytes);
        }
    }

    public static class ClientMethods {
        public static bool IsValid(string data, string signature) {
            var rsa = SharedInformation.CryptoProvider;
            rsa.FromXmlString(File.ReadAllText("PublicKey.key"));

            var dataBytes = Encoding.UTF8.GetBytes(data);
            var signatureBytes = Convert.FromBase64String(signature);
            return rsa.VerifyData(dataBytes, SharedInformation.HashAlgorithm, signatureBytes);
        }

        public static bool IsValidLicense(string filename) {
            var doc = new XmlDocument();
            doc.Load(filename);

            var licNode = doc.SelectSingleNode("/root/lic") as XmlElement;
            var signatureNode = doc.SelectSingleNode("/root/signature") as XmlElement;
            if (licNode == null || signatureNode == null) return false;

            return IsValid(licNode.OuterXml, signatureNode.InnerText);
        }
    }

    public static class SharedInformation {
        public static int KeySize {
            get { return 1024; }
        }

        public static string HashAlgorithm {
            get { return "SHA512"; }
        }

        public static RSACryptoServiceProvider CryptoProvider {
            get { return new RSACryptoServiceProvider(KeySize, new CspParameters()); }
        }
    }
}
5
ответ дан 3 November 2019 в 14:38
поделиться

вот как вы подписываете и проверяете XML-документы цифровой подписью Подписываете XML-документы

3
ответ дан 3 November 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: