Shokedbrain

RSA Data Sign and Verify

Jun 26th, 2021
308
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 4.82 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Security.Cryptography;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace console_crypto_3
  10. {
  11.     class Program
  12.     {
  13.  
  14.         private static string SignMessage(string message, string privateKey)
  15.         {
  16.             string signedMessage;
  17.             try
  18.             {
  19.                 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
  20.                 rsa.FromXmlString(privateKey);
  21.                 // задаём параметры шифрования: Алгоритм хеширования SHA1
  22.                 signedMessage = Convert.ToBase64String(rsa.SignData(Encoding.UTF8.GetBytes(message), CryptoConfig.MapNameToOID("SHA1")));
  23.             }
  24.             catch (Exception)
  25.             {
  26.                 signedMessage = string.Empty;
  27.             }
  28.  
  29.             return signedMessage;
  30.         }
  31.  
  32.         private static bool VerifyMessage(string originalMessage, string signedMessage, string publicKey)
  33.         {
  34.             bool verified;
  35.             try
  36.             {
  37.                 RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
  38.                 rsa.FromXmlString(publicKey); // загрузка публичного ключа
  39.                 verified = rsa.VerifyData(Encoding.UTF8.GetBytes(originalMessage), CryptoConfig.MapNameToOID("SHA1"), Convert.FromBase64String(signedMessage));
  40.             }
  41.             catch (Exception)
  42.             {
  43.                 verified = false;
  44.             }
  45.  
  46.             return verified;
  47.         }
  48.  
  49.         static void Main(string[] args)
  50.         {
  51.             //SHA1 SHA512 MD5
  52.             Console.WriteLine("Generating RSA with 1024-bit length");
  53.             string fileName = "public.xml";
  54.             RSACryptoServiceProvider RSA = new RSACryptoServiceProvider(1024);
  55.             Console.WriteLine("Export public key...");
  56.             string publicKey = RSA.ToXmlString(false);
  57.             File.WriteAllText(fileName, publicKey);
  58.             Console.WriteLine("File has been saved in: {0}", Path.GetFullPath(fileName).ToString());
  59.             Console.WriteLine("Export private key...");
  60.             fileName = "private.xml";
  61.             string privateKey = RSA.ToXmlString(true);
  62.             File.WriteAllText(fileName, privateKey);
  63.             Console.WriteLine("Файл сохранён: {0}", Path.GetFullPath(fileName));
  64.             Console.WriteLine("Скопируйте файлы ключей в другой каталог");
  65.             Console.WriteLine("При следующем запуске программы будет перезапись файла");
  66.             Console.WriteLine("1. Подпись\n2.Проверка");
  67.             Console.Write("Enter: ");
  68.             int choice = int.Parse(Console.ReadLine());
  69.             if (choice == 1)
  70.             {
  71.                 Console.Write("Путь до приватного ключа: ");
  72.                 string path = Console.ReadLine();
  73.                 string privKey = string.Empty;
  74.                 using (StreamReader sr = new StreamReader(path))
  75.                     privKey = sr.ReadToEnd();
  76.                 Console.Write("Путь до файла, который мы хотим подписать: ");
  77.                 path = Console.ReadLine();
  78.                 string context = string.Empty;
  79.                 using (StreamReader sr = new StreamReader(path))
  80.                     context = sr.ReadToEnd();
  81.                 string signed = SignMessage(context, privKey);
  82.                 File.WriteAllText("signed.txt",signed);
  83.                 Console.WriteLine("Подписанный документ сохранён: {0}", Path.GetFullPath("signed.txt"));
  84.             }
  85.             else
  86.             {
  87.                 Console.Write("Путь до публичного ключа: ");
  88.                 string path = Console.ReadLine();
  89.                 string publKey = string.Empty;
  90.                 using (StreamReader sr = new StreamReader(path))
  91.                     publKey = sr.ReadToEnd();
  92.                 Console.Write("Путь до неподписанного файла: ");
  93.                 path = Console.ReadLine();
  94.                 string notSigned = string.Empty;
  95.                 using (StreamReader sr = new StreamReader(path))
  96.                     notSigned = sr.ReadToEnd();
  97.                 Console.Write("Путь до подписанного файла: ");
  98.                 path = Console.ReadLine();
  99.                 string signed = string.Empty;
  100.                 using (StreamReader sr = new StreamReader(path))
  101.                     signed = sr.ReadToEnd();
  102.                 bool verify = VerifyMessage(notSigned, signed, publKey);
  103.                 Console.WriteLine(verify);
  104.             }
  105.  
  106.             Console.ReadKey();
  107.         }
  108.     }
  109. }
  110.  
Add Comment
Please, Sign In to add comment