vovanhik_24

Task 2.1

Apr 8th, 2025
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.14 KB | None | 0 0
  1. using System;
  2. using System.Text;
  3. using Org.BouncyCastle.Crypto;
  4. using Org.BouncyCastle.Crypto.Parameters;
  5. using Org.BouncyCastle.Crypto.Signers;
  6. using Org.BouncyCastle.Security;
  7. using Org.BouncyCastle.Asn1.Sec;
  8. using Org.BouncyCastle.Math;
  9.  
  10. namespace ECDSA
  11. {
  12.     class Program
  13.     {
  14.         static void Main(string[] args)
  15.         {
  16.             string message = "Confidential Message";
  17.             Console.WriteLine("Сообщение: " + message);
  18.  
  19.             var keyPair = GenerateKeyPair();
  20.             var privateKey = (ECPrivateKeyParameters)keyPair.Private;
  21.             var publicKey = (ECPublicKeyParameters)keyPair.Public;
  22.  
  23.             byte[] signature = SignMessage(message, privateKey);
  24.             Console.WriteLine("Подпись (Base64): " + Convert.ToBase64String(signature));
  25.  
  26.             bool isValid = VerifySignature(message, signature, publicKey);
  27.             Console.WriteLine("Подпись действительна? " + (isValid ? "Да" : "Нет"));
  28.         }
  29.  
  30.         static AsymmetricCipherKeyPair GenerateKeyPair()
  31.         {
  32.             var curve = SecNamedCurves.GetByName("secp256k1");
  33.             var domainParams = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H);
  34.  
  35.             var keyGenParams = new ECKeyGenerationParameters(domainParams, new SecureRandom());
  36.             var keyGen = new Org.BouncyCastle.Crypto.Generators.ECKeyPairGenerator();
  37.             keyGen.Init(keyGenParams);
  38.  
  39.             return keyGen.GenerateKeyPair();
  40.         }
  41.  
  42.         static byte[] SignMessage(string message, ECPrivateKeyParameters privateKey)
  43.         {
  44.             var signer = new ECDsaSigner();
  45.             signer.Init(true, privateKey);
  46.  
  47.             byte[] msgHash = DigestMessage(message);
  48.  
  49.             BigInteger[] signatureComponents = signer.GenerateSignature(msgHash);
  50.             BigInteger r = signatureComponents[0];
  51.             BigInteger s = signatureComponents[1];
  52.  
  53.             var seq = new Org.BouncyCastle.Asn1.DerSequence(
  54.                 new Org.BouncyCastle.Asn1.DerInteger(r),
  55.                 new Org.BouncyCastle.Asn1.DerInteger(s));
  56.  
  57.             return seq.GetEncoded();
  58.         }
  59.  
  60.         static bool VerifySignature(string message, byte[] signatureBytes, ECPublicKeyParameters publicKey)
  61.         {
  62.             var signer = new ECDsaSigner();
  63.             signer.Init(false, publicKey);
  64.  
  65.             byte[] msgHash = DigestMessage(message);
  66.  
  67.             try
  68.             {
  69.                 var asn1 = Org.BouncyCastle.Asn1.Asn1Object.FromByteArray(signatureBytes);
  70.                 var seq = (Org.BouncyCastle.Asn1.Asn1Sequence)asn1;
  71.                 var r = ((Org.BouncyCastle.Asn1.DerInteger)seq[0]).Value;
  72.                 var s = ((Org.BouncyCastle.Asn1.DerInteger)seq[1]).Value;
  73.  
  74.                 return signer.VerifySignature(msgHash, r, s);
  75.             }
  76.             catch
  77.             {
  78.                 return false;
  79.             }
  80.         }
  81.  
  82.         static byte[] DigestMessage(string message)
  83.         {
  84.             var sha256 = System.Security.Cryptography.SHA256.Create();
  85.             return sha256.ComputeHash(Encoding.UTF8.GetBytes(message));
  86.         }
  87.     }
  88. }
Add Comment
Please, Sign In to add comment