Chilkat HOME Android™ Classic ASP C C++ C# Mono C# .NET Core C# C# UWP/WinRT DataFlex Delphi ActiveX Delphi DLL Visual FoxPro Java Lianja MFC Objective-C Perl PHP ActiveX PHP Extension PowerBuilder PowerShell PureBasic CkPython Chilkat2-Python Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ Visual Basic 6.0 VB.NET VB.NET UWP/WinRT VBScript Xojo Plugin Node.js Excel Go
(C# UWP/WinRT) ECDSA Sign and VerifyDemonstrates how to create an ECDSA signature on the SHA256 hash of some data, and then verify.
// This example assumes the Chilkat API to have been previously unlocked. // See Global Unlock Sample for sample code. // First load an ECDSA private key to be used for signing. Chilkat.PrivateKey privKey = new Chilkat.PrivateKey(); bool success = privKey.LoadEncryptedPemFile("qa_data/ecc/secp256r1-key-pkcs8-secret.pem","secret"); if (success == false) { Debug.WriteLine(privKey.LastErrorText); return; } // Sign the SHA256 hash of some data. Chilkat.BinData bd = new Chilkat.BinData(); success = bd.LoadFile("qa_data/hamlet.xml"); if (success == false) { Debug.WriteLine("Failed to load file to be hashed."); return; } Chilkat.Crypt2 crypt = new Chilkat.Crypt2(); crypt.HashAlgorithm = "sha256"; crypt.EncodingMode = "base64"; string hashStr = crypt.HashBdENC(bd); Chilkat.Ecc ecdsa = new Chilkat.Ecc(); Chilkat.Prng prng = new Chilkat.Prng(); // Returns ASN.1 signature as a base64 string. string sig = ecdsa.SignHashENC(hashStr,"base64",privKey,prng); Debug.WriteLine("sig = " + sig); // The signature is in ASN.1 format (which may be described as the "encoded DSS signature"). // SEQUENCE (2 elem) // INTEGER (255 bit) 4849395540832462044300553275435608522154141569743642905628579547100940... // INTEGER (255 bit) 3680701124244788134409868118208591399799457104230118295614152238560005... // If you wish, you can get the r and s components of the signature like this: Chilkat.Asn asn = new Chilkat.Asn(); asn.LoadEncoded(sig,"base64"); Chilkat.Xml xml = new Chilkat.Xml(); xml.LoadXml(asn.AsnToXml()); Debug.WriteLine(xml.GetXml()); // We now have this: // <?xml version="1.0" encoding="utf-8"?> // <sequence> // <int>6650D422D86BA4A228B5617604E59052591B9B2C32EF324C44D09EF67E5F0060</int> // <int>0CFD9F6AC85042FC70F672C141BA6B2A4CAFBB906C3D907BCCC1BED62B28326F</int> // </sequence> // Get the "r" and "s" as hex strings string r = xml.GetChildContentByIndex(0); string s = xml.GetChildContentByIndex(1); Debug.WriteLine("r = " + r); Debug.WriteLine("s = " + s); // -------------------------------------------------------------------- // Now verify against the hash of the original data. // Get the corresponding public key. Chilkat.PublicKey pubKey = new Chilkat.PublicKey(); success = pubKey.LoadFromFile("qa_data/ecc/secp256r1-pub.pem"); if (success == false) { Debug.WriteLine(pubKey.LastErrorText); return; } // We already have the SHA256 hash of the original data (hashStr) so no need to re-do it.. Chilkat.Ecc ecc2 = new Chilkat.Ecc(); int result = ecc2.VerifyHashENC(hashStr,sig,"base64",pubKey); if (result != 1) { Debug.WriteLine(ecc2.LastErrorText); return; } Debug.WriteLine("Verified!"); // Note: If we have only r,s and wish to reconstruct the ASN.1 signature, we do it like this: Chilkat.Xml xml2 = new Chilkat.Xml(); xml2.Tag = "sequence"; xml2.NewChild2("int",r); xml2.NewChild2("int",s); Chilkat.Asn asn2 = new Chilkat.Asn(); asn2.LoadAsnXml(xml2.GetXml()); string encodedSig = asn2.GetEncodedDer("base64"); Debug.WriteLine("encoded DSS signature: " + encodedSig); // You can go to https://lapo.it/asn1js/ and copy/paste the base64 encodedSig into the online tool, then press the "decode" button. // You will see the ASN.1 such as this: // SEQUENCE (2 elem) // INTEGER (255 bit) 4849395540832462044300553275435608522154141569743642905628579547100940... // INTEGER (255 bit) 3680701124244788134409868118208591399799457104230118295614152238560005... |
© 2000-2022 Chilkat Software, Inc. All Rights Reserved.