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
(VB.NET 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. Dim privKey As New Chilkat.PrivateKey Dim success As Boolean = privKey.LoadEncryptedPemFile("qa_data/ecc/secp256r1-key-pkcs8-secret.pem","secret") If (success = False) Then Debug.WriteLine(privKey.LastErrorText) Exit Sub End If ' Sign the SHA256 hash of some data. Dim bd As New Chilkat.BinData success = bd.LoadFile("qa_data/hamlet.xml") If (success = False) Then Debug.WriteLine("Failed to load file to be hashed.") Exit Sub End If Dim crypt As New Chilkat.Crypt2 crypt.HashAlgorithm = "sha256" crypt.EncodingMode = "base64" Dim hashStr As String = crypt.HashBdENC(bd) Dim ecdsa As New Chilkat.Ecc Dim prng As New Chilkat.Prng ' Returns ASN.1 signature as a base64 string. Dim sig As String = 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: Dim asn As New Chilkat.Asn asn.LoadEncoded(sig,"base64") Dim xml As 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 Dim r As String = xml.GetChildContentByIndex(0) Dim s As String = 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. Dim pubKey As New Chilkat.PublicKey success = pubKey.LoadFromFile("qa_data/ecc/secp256r1-pub.pem") If (success = False) Then Debug.WriteLine(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 New Chilkat.Ecc Dim result As Integer = ecc2.VerifyHashENC(hashStr,sig,"base64",pubKey) If (result <> 1) Then Debug.WriteLine(ecc2.LastErrorText) Exit Sub End If Debug.WriteLine("Verified!") ' Note: If we have only r,s and wish to reconstruct the ASN.1 signature, we do it like this: Dim xml2 As New Chilkat.Xml xml2.Tag = "sequence" xml2.NewChild2("int",r) xml2.NewChild2("int",s) Dim asn2 As New Chilkat.Asn asn2.LoadAsnXml(xml2.GetXml()) Dim encodedSig As String = 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.