Chilkat HOME .NET Core C# Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi ActiveX Delphi DLL Go Java Lianja Mono C# Node.js Objective-C PHP ActiveX PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift 2 Swift 3,4,5... Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(PureBasic) How to Generate an Elliptic Curve Shared SecretDemonstrates how to generate an ECC (Elliptic Curve Cryptography) shared secret. Imagine a cilent has one ECC private key, the server has another. A shared secret is computed by each side providing it's public key to the other. The private keys are kept private.
IncludeFile "CkPublicKey.pb" IncludeFile "CkEcc.pb" IncludeFile "CkPrng.pb" IncludeFile "CkPrivateKey.pb" Procedure ChilkatExample() ; This example requires the Chilkat API to have been previously unlocked. ; See Global Unlock Sample for sample code. ; This example includes both client-side and server-side code. ; Each code segment is marked as client-side or server-side. ; Imagine these segments are running on separate computers... success.i ; ----------------------------------------------------------------- ; (Client-Side) Generate an ECC key, save the public part to a file. ; ----------------------------------------------------------------- prngClient.i = CkPrng::ckCreate() If prngClient.i = 0 Debug "Failed to create object." ProcedureReturn EndIf eccClient.i = CkEcc::ckCreate() If eccClient.i = 0 Debug "Failed to create object." ProcedureReturn EndIf privKeyClient.i = CkEcc::ckGenEccKey(eccClient,"secp256r1",prngClient) If CkEcc::ckLastMethodSuccess(eccClient) <> 1 Debug CkEcc::ckLastErrorText(eccClient) CkPrng::ckDispose(prngClient) CkEcc::ckDispose(eccClient) ProcedureReturn EndIf pubKeyClient.i = CkPrivateKey::ckGetPublicKey(privKeyClient) CkPublicKey::ckSavePemFile(pubKeyClient,0,"qa_output/eccClientPub.pem") CkPublicKey::ckDispose(pubKeyClient) ; ----------------------------------------------------------------- ; (Server-Side) Generate an ECC key, save the public part to a file. ; ----------------------------------------------------------------- prngServer.i = CkPrng::ckCreate() If prngServer.i = 0 Debug "Failed to create object." ProcedureReturn EndIf eccServer.i = CkEcc::ckCreate() If eccServer.i = 0 Debug "Failed to create object." ProcedureReturn EndIf privKeyServer.i = CkEcc::ckGenEccKey(eccServer,"secp256r1",prngServer) If CkEcc::ckLastMethodSuccess(eccServer) <> 1 Debug CkEcc::ckLastErrorText(eccServer) CkPrng::ckDispose(prngClient) CkEcc::ckDispose(eccClient) CkPrng::ckDispose(prngServer) CkEcc::ckDispose(eccServer) ProcedureReturn EndIf pubKeyServer.i = CkPrivateKey::ckGetPublicKey(privKeyServer) CkPublicKey::ckSavePemFile(pubKeyServer,0,"qa_output/eccServerPub.pem") CkPublicKey::ckDispose(pubKeyServer) ; ----------------------------------------------------------------- ; (Client-Side) Generate the shared secret using our private key, and the other's public key. ; ----------------------------------------------------------------- ; Imagine that the server sent the public key PEM to the client. ; (This is simulated by loading the server's public key from the file. pubKeyFromServer.i = CkPublicKey::ckCreate() If pubKeyFromServer.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkPublicKey::ckLoadFromFile(pubKeyFromServer,"qa_output/eccServerPub.pem") sharedSecret1.s = CkEcc::ckSharedSecretENC(eccClient,privKeyClient,pubKeyFromServer,"base64") CkPrivateKey::ckDispose(privKeyClient) ; ----------------------------------------------------------------- ; (Server-Side) Generate the shared secret using our private key, and the other's public key. ; ----------------------------------------------------------------- ; Imagine that the client sent the public key PEM to the server. ; (This is simulated by loading the client's public key from the file. pubKeyFromClient.i = CkPublicKey::ckCreate() If pubKeyFromClient.i = 0 Debug "Failed to create object." ProcedureReturn EndIf CkPublicKey::ckLoadFromFile(pubKeyFromClient,"qa_output/eccClientPub.pem") sharedSecret2.s = CkEcc::ckSharedSecretENC(eccServer,privKeyServer,pubKeyFromClient,"base64") CkPrivateKey::ckDispose(privKeyServer) ; --------------------------------------------------------- ; Examine the shared secrets. They should be the same. ; Both sides now have a secret that only they know. ; --------------------------------------------------------- Debug sharedSecret1 Debug sharedSecret2 CkPrng::ckDispose(prngClient) CkEcc::ckDispose(eccClient) CkPrng::ckDispose(prngServer) CkEcc::ckDispose(eccServer) CkPublicKey::ckDispose(pubKeyFromServer) CkPublicKey::ckDispose(pubKeyFromClient) ProcedureReturn EndProcedure |
© 2000-2024 Chilkat Software, Inc. All Rights Reserved.