using System.Security.Cryptography;
class EcSignatureString {
Console.WriteLine("EC signature curve secp256r1 / P-256 string");
var dataToSignString = "The quick brown fox jumps over the lazy dog";
var dataToSign = System.Text.Encoding.UTF8.GetBytes(dataToSignString);
Console.WriteLine("dataToSign: " + dataToSignString);
Console.WriteLine("\n* * * sign the plaintext with the EC private key * * *");
string ecPrivateKeyPem = loadEcPrivateKeyPem();
var ecDsaKeypair = ECDsa.Create(ECCurve.NamedCurves.nistP256);
byte[] ecPrivateKeyByte = getEcPrivateKeyEncodedFromPem(ecPrivateKeyPem);
ecDsaKeypair.ImportPkcs8PrivateKey(ecPrivateKeyByte, out _out);
Console.WriteLine("EC keysize: " + ecDsaKeypair.KeySize);
byte[] hashedData = null;
HashAlgorithm hashAlgo = new SHA256Managed();
hashedData = hashAlgo.ComputeHash(dataToSign);
signature = ecDsaKeypair.SignHash(hashedData);
string signatureBase64 = Convert.ToBase64String(signature);
Console.WriteLine("signature (Base64): " + signatureBase64);
string ecDsaPublicKeyParameters = Convert.ToBase64String(ecDsaKeypair.ExportSubjectPublicKeyInfo());
Console.WriteLine("\n* * *verify the signature against hash of plaintext with the EC public key * * *");
var ecDsaVerify = ECDsa.Create(ECCurve.NamedCurves.nistP256);
bool signatureVerified = false;
string ecPublicKeyPem = loadEcPublicKeyPem();
byte[] publicKeyByte = getEcPublicKeyFromPem(ecPublicKeyPem);
ecDsaVerify.ImportSubjectPublicKeyInfo(publicKeyByte, out _);
signatureVerified = ecDsaVerify.VerifyHash(hashedData, signature);
Console.WriteLine("signature verified: " + signatureVerified);
catch (ArgumentNullException)
Console.WriteLine("The data was not signed or verified");
private static byte[] getEcPrivateKeyEncodedFromPem(string ecPrivateKeyPem) {
string ecPrivateKeyHeaderPem = "-----BEGIN EC PRIVATE KEY-----\n";
string ecPrivateKeyFooterPem = "-----END EC PRIVATE KEY-----";
string ecPrivateKeyDataPem = ecPrivateKeyPem.Replace(ecPrivateKeyHeaderPem, "").Replace(ecPrivateKeyFooterPem, "").Replace("\n","");
return Base64Decoding(ecPrivateKeyDataPem);
private static byte[] getEcPublicKeyFromPem(string ecPublicKeyPem) {
string ecPublicKeyHeaderPem = "-----BEGIN PUBLIC KEY-----\n";
string ecPublicKeyFooterPem = "-----END PUBLIC KEY-----";
string ecPublicKeyDataPem = ecPublicKeyPem.Replace(ecPublicKeyHeaderPem, "").Replace(ecPublicKeyFooterPem, "").Replace("\n","");
return Base64Decoding(ecPublicKeyDataPem);
private static string loadEcPrivateKeyPem() {
return "-----BEGIN EC PRIVATE KEY-----\n" +
"MEECAQAwEwYHKoZIzj0CAQYIKoZIzj0DAQcEJzAlAgEBBCAU2f8tzo99Z1HoxJlY\n" +
"96yXUhFY5vppVjw1iPKRfk1wHA==\n" +
"-----END EC PRIVATE KEY-----";
private static string loadEcPublicKeyPem() {
return "-----BEGIN PUBLIC KEY-----\n" +
"MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEzb7yAFWup6iDqJiEq764rAumsV2M\n" +
"rspZxaP3WGpwHaC4Uff3N4UbJZF7Zac1c6W7KJl0eeCP0205Q3UEpwxndQ==\n" +
"-----END PUBLIC KEY-----";
static string Base64Encoding(byte[] input) {
return Convert.ToBase64String(input);
static byte[] Base64Decoding(String input) {
return Convert.FromBase64String(input);