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
(Excel) 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. Dim privKey As Chilkat.PrivateKey Set privKey = Chilkat.NewPrivateKey success = privKey.LoadEncryptedPemFile("qa_data/ecc/secp256r1-key-pkcs8-secret.pem","secret") If (success = False) Then Debug.Print privKey.LastErrorText Exit Sub End If ' Sign the SHA256 hash of some data. Dim bd As Chilkat.BinData Set bd = Chilkat.NewBinData success = bd.LoadFile("qa_data/hamlet.xml") If (success = False) Then Debug.Print "Failed to load file to be hashed." Exit Sub End If Dim crypt As Chilkat.Crypt2 Set crypt = Chilkat.NewCrypt2 crypt.HashAlgorithm = "sha256" crypt.EncodingMode = "base64" hashStr = crypt.HashBdENC(bd) Dim ecdsa As Chilkat.Ecc Set ecdsa = Chilkat.NewEcc Dim prng As Chilkat.Prng Set prng = Chilkat.NewPrng ' Returns ASN.1 signature as a base64 string. sig = ecdsa.SignHashENC(hashStr,"base64",privKey,prng) Debug.Print "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: Dim asn As Chilkat.Asn Set asn = Chilkat.NewAsn Dim success As Boolean success = asn.LoadEncoded(sig,"base64") Dim xml As Chilkat.Xml Set xml = Chilkat.NewXml success = xml.LoadXml(asn.AsnToXml()) Debug.Print 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 r = xml.GetChildContentByIndex(0) s = xml.GetChildContentByIndex(1) Debug.Print "r = "; r Debug.Print "s = "; s ' -------------------------------------------------------------------- ' Now verify against the hash of the original data. ' Get the corresponding public key. Dim pubKey As Chilkat.PublicKey Set pubKey = Chilkat.NewPublicKey success = pubKey.LoadFromFile("qa_data/ecc/secp256r1-pub.pem") If (success = False) Then Debug.Print pubKey.LastErrorText Exit Sub End If ' We already have the SHA256 hash of the original data (hashStr) so no need to re-do it.. Dim ecc2 As Chilkat.Ecc Set ecc2 = Chilkat.NewEcc result = ecc2.VerifyHashENC(hashStr,sig,"base64",pubKey) If (result <> 1) Then Debug.Print ecc2.LastErrorText Exit Sub End If Debug.Print "Verified!" ' Note: If we have only r,s and wish to reconstruct the ASN.1 signature, we do it like this: Dim xml2 As Chilkat.Xml Set xml2 = Chilkat.NewXml xml2.Tag = "sequence" xml2.NewChild2 "int",r xml2.NewChild2 "int",s Dim asn2 As Chilkat.Asn Set asn2 = Chilkat.NewAsn success = asn2.LoadAsnXml(xml2.GetXml()) encodedSig = asn2.GetEncodedDer("base64") Debug.Print "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.