static Key createKeyPair() { // note: Clear() just calls Dispose() :) using (var dsa = new DSACryptoServiceProvider(DefaultKeySize.signed())) { return new Key(DefaultAlgorithm, DefaultKeySize, System.Text.Encoding.UTF8.GetBytes(dsa.ToXmlString(true))); } }
private static void GenerateKeys() { if (File.Exists(SignatureVerifier.DefaultDSAPrivKeyFileName) || File.Exists(SignatureVerifier.DefaultDSAPubKeyFileName)) { ShowErrorMessage("\tError: Output files already exists!"); } var prv = new DSACryptoServiceProvider(); using (var sw = new StreamWriter(SignatureVerifier.DefaultDSAPrivKeyFileName)) { sw.Write(prv.ToXmlString(true)); } using (var sw = new StreamWriter(SignatureVerifier.DefaultDSAPubKeyFileName)) { sw.Write(prv.ToXmlString(false)); } Console.ForegroundColor = ConsoleColor.DarkGreen; Console.WriteLine("\tFinished generating keys"); Console.ResetColor(); }
/// <summary> /// Método realiza firma digital. /// </summary> /// <param name="pCadenaTexto">Cadena de texto.</param> /// <returns> /// Mensajes de impresión. /// </returns> public static string RealizarFirmaDigitalPorDSA(string pCadenaTexto) { // Declara mensajes de impresión. string vMsgImpresion = string.Empty; // Instancia servicio criptografico DSA. DSACryptoServiceProvider vServicioCriptorDSA = new DSACryptoServiceProvider(); // Obtiene claves privadas y publicas. string vClaves = vServicioCriptorDSA.ToXmlString(true); // Genera clave hash. vClaveHash = GenerarClaveSHA1(pCadenaTexto); // Convierte a cadena array de clave SHA1. string vCadenaClaveSHA1 = Convert.ToBase64String(vClaveHash); vMsgImpresion += "FIRMA DIGITAL - Cadena de entrada (DSA): " + pCadenaTexto + " \n "; vMsgImpresion += "GERERAR CLAVE SHA1 - Cadena de clave hash (DSA): " + vCadenaClaveSHA1 + " \n "; // Crea firma digital para la clave hash. vFirmaDigital = CrearFirmaDigitalDSA(vClaveHash, vClaves); // Convierte a cadena array de firma digital. string vCadenaFirmaDigital = Convert.ToBase64String(vFirmaDigital); vMsgImpresion += "GERERAR FIRMA DIGITAL (DSA): Se cargaron clave privada y pública a servicio criptor DSA \n "; vMsgImpresion += "GERERAR FIRMA DIGITAL - Cadena firma digital (DSA): " + vCadenaFirmaDigital + " \n "; // Obtiene clave pública. vClavePublica = vServicioCriptorDSA.ToXmlString(false); // Retorna mensaje. return vMsgImpresion; }
public void PersistKey_FalseTrue () { DSACryptoServiceProvider dsa = new DSACryptoServiceProvider (minKeySize); string key = dsa.ToXmlString (true); dsa.PersistKeyInCsp = false; dsa.PersistKeyInCsp = true; Assert.AreEqual (key, dsa.ToXmlString (true), "PersistKeyInCsp-FalseTrue"); }
public void Persistence_Delete () { CspParameters csp = new CspParameters (3, null, "Persistence_Delete"); // MS generates (or load) keypair here // Mono load (if it exists) the keypair here DSACryptoServiceProvider dsa1 = new DSACryptoServiceProvider (minKeySize, csp); // Mono will generate the keypair here (if it doesn't exists) string original = dsa1.ToXmlString (true); // note: Delete isn't well documented but can be done by // flipping the PersistKeyInCsp to false and back to true. dsa1.PersistKeyInCsp = false; dsa1.Clear (); // recreate using the same container name DSACryptoServiceProvider dsa2 = new DSACryptoServiceProvider (minKeySize, csp); string newKeyPair = dsa2.ToXmlString (true); Assert.IsTrue (original != newKeyPair, "Key Pair Deleted"); }
public void Persistence_PersistKeyInCsp_True () { CspParameters csp = new CspParameters (3, null, "Persistence_PersistKeyInCsp_True"); // MS generates (or load) keypair here // Mono load (if it exists) the keypair here DSACryptoServiceProvider dsa1 = new DSACryptoServiceProvider (minKeySize, csp); // Mono will generate the keypair here (if it doesn't exists) string first = dsa1.ToXmlString (true); // persistance is "on" by default Assert.IsTrue (dsa1.PersistKeyInCsp, "PersistKeyInCsp"); // reload using the same container name DSACryptoServiceProvider dsa2 = new DSACryptoServiceProvider (minKeySize, csp); string second = dsa2.ToXmlString (true); Assert.AreEqual (first, second, "Key Pair Same Container"); }
public void MonoXmlImportExport () { DSACryptoServiceProvider dsa = new DSACryptoServiceProvider (); dsa.FromXmlString (MonoXml512); Assert.AreEqual (MonoXml512, dsa.ToXmlString (true), "Mono-Xml512"); dsa.FromXmlString (MonoXml576); Assert.AreEqual (MonoXml576, dsa.ToXmlString (true), "Mono-Xml576"); dsa.FromXmlString (MonoXml640); Assert.AreEqual (MonoXml640, dsa.ToXmlString (true), "Mono-Xml640"); dsa.FromXmlString (MonoXml704); Assert.AreEqual (MonoXml704, dsa.ToXmlString (true), "Mono-Xml704"); dsa.FromXmlString (MonoXml768); Assert.AreEqual (MonoXml768, dsa.ToXmlString (true), "Mono-Xml768"); dsa.FromXmlString (MonoXml832); Assert.AreEqual (MonoXml832, dsa.ToXmlString (true), "Mono-Xml832"); dsa.FromXmlString (MonoXml896); Assert.AreEqual (MonoXml896, dsa.ToXmlString (true), "Mono-Xml896"); dsa.FromXmlString (MonoXml960); Assert.AreEqual (MonoXml960, dsa.ToXmlString (true), "Mono-Xml960"); dsa.FromXmlString (MonoXml1024); Assert.AreEqual (MonoXml1024, dsa.ToXmlString (true), "Mono-Xml1024"); }
public void TooBigKeyPair () { dsa = new DSACryptoServiceProvider (2048); // in 2.0 MS delay the creation of the key pair until it is required // (same trick that Mono almost always used ;-) but they also delay // the parameter validation (what Mono didn't). So here we must "get" // the key (export) to trigger the exception dsa.ToXmlString (true); }
public static int FileReadStep = 4194304; // 4M #region CreateKey /// <summary> /// 创建密钥对(XmlString),使用者应将结果保存到文件存档 /// </summary> /// <param name="ContainsPKey">是否包含私钥</param> /// <returns></returns> public static string CreateKey(bool ContainsPKey) { DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); return dsa.ToXmlString(ContainsPKey); }
public static String GeneratePrivateKey() { DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); return dsa.ToXmlString(true); }
//Формируем цифровую подпись private void button8_Click(object sender, EventArgs e) { // создаем объект выбранного заказа // как и в примере из предыдущего раздела // В результате имеем заполненный объект класса Заказ с именем с // определяем, какой заказ следует сериализовать // код создания объекта (Zakaz c) аналогичен предыдущему примеру // определяем, какой заказ выбран для генерации документа if (dataGridView1.SelectedRows.Count == 0) return; //получение номера текущего выбранного заказа nom = (int)dataGridView1.SelectedRows[0].Cells["НомерЗаказа"].Value; //получение даты текущего выбранного заказа date = (DateTime)dataGridView1.SelectedRows[0].Cells["ДатаЗаказа"].Value; // поиск заказа по ключу DataRow dr = ds.Tables["Заказы"].Rows.Find(new object[] { (object)nom, (object)date }); // создаем объект заказа для последующей сериализации Zakaz c = new Zakaz((int)dr["IDЗаказчика"], (int)dr["IDИсполнителя"], (int)dr["НомерЗаказа"], (DateTime)dr["ДатаЗаказа"], (string)dr["Предмет/Тема"], (int)dr["Стоимость"]); // хэшировать будем по двоичному коду объекта класса Zakaz // проводим бинарную сериализацию объекта c // создаем объект-форматер BinaryFormatter ser = new BinaryFormatter(); // создаем поток для сериализации объекта в оперативной памяти MemoryStream ms = new MemoryStream(); // проводим сериализацию в память ser.Serialize(ms, c); // получаем массив байт, определяющий объект заказа, // считывая из потока в памяти byte[] message = new byte[ms.Length]; ms.Read(message, 0, (int)ms.Length); // хэшируем заказ // создаем провайдер для хэширования SHA1 sha1 = new SHA1CryptoServiceProvider(); // проводим хэширование byte[] hashMessage = sha1.ComputeHash(message); // получаем цифровую подпись с помощью алгоритма DSA DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); // цифровая подпись – это также набор байт. // Второй параметр метода – своеобразный ключ byte[] signature = dsa.SignHash(hashMessage, "1.3.14.3.2.26"); // сохраняем параметры ключа в виде структурированной строки string key = dsa.ToXmlString(true); // сохраним подпись данного документа в бинарном файле, // имя которого зависит от номера Заказа BinaryWriter br = new BinaryWriter(new FileStream("Zakaz"+c.НомерЗаказа+".dat", FileMode.Create)); // сохраняем ключ в созданный файл br.Write(key); // сохраняем в файл цифровую подпись // сначала количество байт br.Write(signature.Length); // затем саму подпись br.Write(signature); // закрываем файл с подписью br.Close(); MessageBox.Show("Создана цифровая подпись!"); }
public void PersistKey_False () { DSACryptoServiceProvider dsa = new DSACryptoServiceProvider (minKeySize); string key = dsa.ToXmlString (true); dsa.PersistKeyInCsp = false; AssertEquals ("PersistKeyInCsp-False", key, dsa.ToXmlString (true)); }
public void Persistence_PersistKeyInCsp_False () { CspParameters csp = new CspParameters (3, null, "Persistence_PersistKeyInCsp_False"); // MS generates (or load) keypair here // Mono load (if it exists) the keypair here DSACryptoServiceProvider dsa1 = new DSACryptoServiceProvider (minKeySize, csp); // Mono will generate the keypair here (if it doesn't exists) string first = dsa1.ToXmlString (true); // persistance is "on" by default when a CspParameters is supplied Assert ("PersistKeyInCsp", dsa1.PersistKeyInCsp); // this means nothing if we don't call Clear !!! dsa1.PersistKeyInCsp = false; Assert ("PersistKeyInCsp", !dsa1.PersistKeyInCsp); // reload using the same container name DSACryptoServiceProvider dsa2 = new DSACryptoServiceProvider (minKeySize, csp); string second = dsa2.ToXmlString (true); AssertEquals ("Key Pair Same Container", first, second); }
public void CapiXmlImportExport () { DSACryptoServiceProvider dsa = new DSACryptoServiceProvider (); dsa.FromXmlString (CapiXml512); AssertEquals ("Capi-Xml512", CapiXml512, dsa.ToXmlString (true)); dsa.FromXmlString (CapiXml576); AssertEquals ("Capi-Xml576", CapiXml576, dsa.ToXmlString (true)); dsa.FromXmlString (CapiXml640); AssertEquals ("Capi-Xml640", CapiXml640, dsa.ToXmlString (true)); dsa.FromXmlString (CapiXml704); AssertEquals ("Capi-Xml704", CapiXml704, dsa.ToXmlString (true)); dsa.FromXmlString (CapiXml768); AssertEquals ("Capi-Xml768", CapiXml768, dsa.ToXmlString (true)); dsa.FromXmlString (CapiXml832); AssertEquals ("Capi-Xml832", CapiXml832, dsa.ToXmlString (true)); dsa.FromXmlString (CapiXml896); AssertEquals ("Capi-Xml896", CapiXml896, dsa.ToXmlString (true)); dsa.FromXmlString (CapiXml960); AssertEquals ("Capi-Xml960", CapiXml960, dsa.ToXmlString (true)); dsa.FromXmlString (CapiXml1024); AssertEquals ("Capi-Xml1024", CapiXml1024, dsa.ToXmlString (true)); }
public void UseMachineKeyStore () { // note only applicable when CspParameters isn't used - which don't // help much as you can't know the generated key container name try { DSACryptoServiceProvider.UseMachineKeyStore = true; CspParameters csp = new CspParameters (13, null, "UseMachineKeyStore"); csp.KeyContainerName = "UseMachineKeyStore"; DSACryptoServiceProvider dsa = new DSACryptoServiceProvider (csp); string machineKeyPair = dsa.ToXmlString (true); dsa.Clear (); DSACryptoServiceProvider.UseMachineKeyStore = false; csp = new CspParameters (13, null, "UseMachineKeyStore"); csp.Flags |= CspProviderFlags.UseMachineKeyStore; dsa = new DSACryptoServiceProvider (csp); Assert.IsTrue (machineKeyPair != dsa.ToXmlString (true), "UseMachineKeyStore"); } catch (CryptographicException ce) { // only root can create the required directory (if inexistant) // afterward anyone can use (read from) it if (!(ce.InnerException is UnauthorizedAccessException)) throw; } catch (UnauthorizedAccessException) { } }
static void Main(string[] args) { try { // check if we have some parameters if (args.Count() < 1) { Usage(); return; } // check what parameter we have switch (args[0].ToLower()) { case "/genkey_pair": { // show headline ShowHeadLine(); // verify if output file exists if (File.Exists(_dsaPrivKey) || File.Exists(_dsaPubKey)) { Console.WriteLine("Error: Output files are currently exists"); Environment.ExitCode = -1; return; } // start key generation Console.WriteLine("Generating key pair with 1024 Bits..."); DSACryptoServiceProvider prv = new DSACryptoServiceProvider(); Console.WriteLine("Storing private key to " + _dsaPrivKey); using (StreamWriter sw = new StreamWriter(_dsaPrivKey)) { sw.Write(prv.ToXmlString(true)); } Console.WriteLine("Storing public key to " + _dsaPubKey); using (StreamWriter sw = new StreamWriter(_dsaPubKey)) { sw.Write(prv.ToXmlString(false)); } Console.WriteLine(""); } break; case "/sign_update": { if (args.Count() != 3) { Usage(); Environment.ExitCode = -1; return; } // get parameter String binary = args[1]; String privKey = args[2]; if (!File.Exists(binary)) { Console.Error.WriteLine("Target binary " + binary + " does not exists"); Environment.ExitCode = -1; return; } if (!File.Exists(privKey)) { Console.Error.WriteLine("Private key file does not exists"); Environment.ExitCode = -1; return; } // Reading private key String key = null; using (StreamReader reader = new StreamReader(privKey)) { key = reader.ReadToEnd(); } DSACryptoServiceProvider prv = new DSACryptoServiceProvider(); prv.FromXmlString(key); // open stream Byte[] hash = null; using (Stream inputStream = File.OpenRead(binary)) { hash = prv.SignData(inputStream); } String base64Hash = Convert.ToBase64String(hash); Console.WriteLine(base64Hash); } break; case "/verify_update": { if (args.Count() != 4) { Usage(); Environment.ExitCode = -1; return; } // get parameter String binary = args[1]; String pubKey = args[2]; String sign = args[3]; sign = sign.TrimStart('"'); sign = sign.TrimEnd('"'); AppLimit.NetSparkle.NetSparkleDSAVerificator dsaVerif = new AppLimit.NetSparkle.NetSparkleDSAVerificator(pubKey); if (dsaVerif.VerifyDSASignature(sign, binary)) Console.WriteLine("Binary " + binary + " is valid"); else Console.WriteLine("Binary " + binary + " is NOT valid"); } break; default: Usage(); break; } } catch (Exception e) { Console.WriteLine("Something went wrong :-("); Console.WriteLine(e.StackTrace); } }
public static String GetPublicKey(String privateKey) { DSACryptoServiceProvider dsa = new DSACryptoServiceProvider(); dsa.FromXmlString(privateKey); return dsa.ToXmlString(false); }