【问题标题】:Working example of secp256k1 key generation and sign/verify in freepascal在 freepascal 中 secp256k1 密钥生成和签名/验证的工作示例
【发布时间】:2021-02-08 01:50:49
【问题描述】:

我正在使用 freepascal/lazarus 开发一个加密货币引擎。我使用 OpenSSL 通过 TProcess 调用创建密钥对;使用 secp256k1 对消息进行签名和验证也是如此。

现在我找到了这个库:https://github.com/Xor-el/CryptoLib4Pascal

这似乎能够做到这一点,所以我可以消除对 OpenSSL 的依赖,减少近 98% 的处理时间并使其自动跨平台。 即使图书馆包含一些示例,我也无法找到为此获得工作功能的方法:

Keyspair= Packed Record
     public: String[255];
     private: String[255];
     end;  

Var
MyKeysPair: Keyspair;
MyMessage : string = 'Hello world';
Begin
Keyspair := GenerateKeys('secp256k1');
End;

Function GenerateKeys(algo:string):Keyspair;
Begin
// Stuff from CryptoLib4Pascal...
result.public := ???;
result.private := ???;
End;

然后,使用密钥对签名并验证消息:

var
SignedMessage: string;
Begin
SignedMessage := GetSignedMessage(Keyspair.private,MyMessage);
if VerifySignature(MyMessage,SignedMessage,Keyspair.public) then writeln('Perfect');
End;

function GetSignedMessage(PrivKey,Message:String):String;
Begin
// Stuff from CryptoLib4Pascal...
result := ???;
End;

function VerifySignature(Message,Signature,PubKey:string):boolean;
Begin
Result:= false;
if {stuff from CryptoLib4Pascal} then result := true;
End;

【问题讨论】:

    标签: cryptography freepascal


    【解决方案1】:
        var
        LSecureRandom     : ISecureRandom;
        LCustomCurve      : IX9ECParameters;
        LECDomainParams   : IECDomainParameters;
          LKeyPairGenerator : IECKeyPairGenerator;
          LKeyGenParams     : IECKeyGenerationParameters;
          LKeyPair          : IAsymmetricCipherKeyPair;
          LPrivateKeyParams : IECPrivateKeyParameters;
          LPublicKeyParams  : IECPublicKeyParameters;
        
          PrivKey, PubKey, KoordX, KoordY,
          PubKeyUnCompressed, PubKeyCompressed : String;
    
        begin
          LSecureRandom     := TSecureRandom.Create(); // OSRandom Mode
          LCustomCurve      := TCustomNamedCurves.GetByName('secp256k1');
          LECDomainParams   := TECDomainParameters.Create(LCustomCurve.Curve,
          LCustomCurve.G, LCustomCurve.N, LCustomCurve.H, LCustomCurve.GetSeed);
          LKeyPairGenerator := TECKeyPairGenerator.Create('ECDSA');
          LKeyGenParams     := TECKeyGenerationParameters.Create(LECDomainParams, LSecureRandom);
          LKeyPairGenerator.Init(LKeyGenParams);
        
    LKeyPair          := LKeyPairGenerator.GenerateKeyPair();
    LPrivateKeyParams := LKeyPair.Private as IECPrivateKeyParameters; // for signing
    LPublicKeyParams  := LKeyPair.Public as IECPublicKeyParameters; // for verifying
        
          PrivKey := LPrivateKeyParams.D.ToString(16);
          KoordX  := LPublicKeyParams.Q.Normalize.AffineXCoord.ToBigInteger.ToString(16);
          KoordY  := LPublicKeyParams.Q.Normalize.AffineYCoord.ToBigInteger.ToString(16);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-04
      • 1970-01-01
      • 2019-01-30
      • 2019-01-27
      • 2012-04-07
      • 2020-09-29
      • 1970-01-01
      • 2019-06-20
      相关资源
      最近更新 更多