Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Text;
- using Org.BouncyCastle.Crypto;
- using Org.BouncyCastle.Crypto.Parameters;
- using Org.BouncyCastle.Crypto.Signers;
- using Org.BouncyCastle.Security;
- using Org.BouncyCastle.Asn1.Sec;
- using Org.BouncyCastle.Math;
- namespace ECDSA
- {
- class Program
- {
- static void Main(string[] args)
- {
- string message = "Confidential Message";
- Console.WriteLine("Сообщение: " + message);
- var keyPair = GenerateKeyPair();
- var privateKey = (ECPrivateKeyParameters)keyPair.Private;
- var publicKey = (ECPublicKeyParameters)keyPair.Public;
- byte[] signature = SignMessage(message, privateKey);
- Console.WriteLine("Подпись (Base64): " + Convert.ToBase64String(signature));
- bool isValid = VerifySignature(message, signature, publicKey);
- Console.WriteLine("Подпись действительна? " + (isValid ? "Да" : "Нет"));
- }
- static AsymmetricCipherKeyPair GenerateKeyPair()
- {
- var curve = SecNamedCurves.GetByName("secp256k1");
- var domainParams = new ECDomainParameters(curve.Curve, curve.G, curve.N, curve.H);
- var keyGenParams = new ECKeyGenerationParameters(domainParams, new SecureRandom());
- var keyGen = new Org.BouncyCastle.Crypto.Generators.ECKeyPairGenerator();
- keyGen.Init(keyGenParams);
- return keyGen.GenerateKeyPair();
- }
- static byte[] SignMessage(string message, ECPrivateKeyParameters privateKey)
- {
- var signer = new ECDsaSigner();
- signer.Init(true, privateKey);
- byte[] msgHash = DigestMessage(message);
- BigInteger[] signatureComponents = signer.GenerateSignature(msgHash);
- BigInteger r = signatureComponents[0];
- BigInteger s = signatureComponents[1];
- var seq = new Org.BouncyCastle.Asn1.DerSequence(
- new Org.BouncyCastle.Asn1.DerInteger(r),
- new Org.BouncyCastle.Asn1.DerInteger(s));
- return seq.GetEncoded();
- }
- static bool VerifySignature(string message, byte[] signatureBytes, ECPublicKeyParameters publicKey)
- {
- var signer = new ECDsaSigner();
- signer.Init(false, publicKey);
- byte[] msgHash = DigestMessage(message);
- try
- {
- var asn1 = Org.BouncyCastle.Asn1.Asn1Object.FromByteArray(signatureBytes);
- var seq = (Org.BouncyCastle.Asn1.Asn1Sequence)asn1;
- var r = ((Org.BouncyCastle.Asn1.DerInteger)seq[0]).Value;
- var s = ((Org.BouncyCastle.Asn1.DerInteger)seq[1]).Value;
- return signer.VerifySignature(msgHash, r, s);
- }
- catch
- {
- return false;
- }
- }
- static byte[] DigestMessage(string message)
- {
- var sha256 = System.Security.Cryptography.SHA256.Create();
- return sha256.ComputeHash(Encoding.UTF8.GetBytes(message));
- }
- }
- }
Add Comment
Please, Sign In to add comment