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);
	}
Example #9
0
		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);
 }
Example #11
0
        //Формируем цифровую подпись
        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) {
		}
	}
Example #16
0
        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);
 }