Jak wczytać publiczny klucz RSA z pliku '.der' ?

0

Testuję klasę TLbRSA z pakietu LockPack by TurboPower i stanąłem przed problemem.
W jaki sposób wczytać klucz publiczny z pliku *.der udostępnionego na stronie ministerstwa finansów ?
link do klucza :

https://ksef-test.mf.gov.pl/security/der

kod:

  LbRSA := TLbRSA.Create(nil);
  try
    try
      LbRSA.PublicKey.loadfromFile('publickey.der');
    finally
      LbRSA.Free;
    end;
  except
    on e: exception do
      self.Memo1.Lines.Add(e.Message);
  end;

Klucz się nie wczytuje, dostaję wyjątek 'Invalid Asymmetric Key'.
Klasa TLbRSAkey wymaga pliku w formacie ASN1. Oczywiście Plik ''der' ze strony MF jest w tym formacie, ale w środku ma strukturę różną od wymaganej przez TLbRSAkey.
Może ktoś już przerabiał ten problem ...??

1

Zobacz na to https://stackoverflow.com/questions/26599197/why-my-rsa-2048-public-key-is-294-bytes-long wprawdzie to nie problem Delphi a tym bardziej tej biblioteki ale może naprowadzi na rozwiązanie.

Aktualizacja:
U mnie na Delphi 10.4.2 Sydney Community działa (chyba, bo przynajmniej nie zgłasza błędu) poniższy testowy kod:

var
  LbRSA: TLbRSA;
  fs: TFileStream;
  ms: TMemoryStream;
begin
  fs:= TFileStream.Create('publickey.der', fmOpenRead);
  try
    ms:= TMemoryStream.Create;
    try
      fs.Seek(24, soBeginning);
      ms.CopyFrom(fs, 270);
      LbRSA:= TLbRSA.Create(nil);
      try
        try
          ms.Position:= 0;
          LbRSA.PublicKey.LoadFromStream(ms);
        finally
          LbRSA.Free;
        end;
      except
        on e: exception do
          self.Memo1.Lines.Add(e.Message);
      end;
    finally
      ms.Free;
    end;
  finally
    fs.Free;
  end;
end;

Zaznaczam, że użyłem bibliotek z https://github.com/TurboPack/LockBox , bo nie działa ze starszymi z https://github.com/delphi-pascal-archive/Pascal-RSA

0

Zaznaczam, że użyłem bibliotek z https://github.com/TurboPack/LockBox , bo nie działa ze starszymi z https://github.com/delphi-pascal-archive/Pascal-RSA

Dzięki, sprawdzę.

0

Odpuściłem pakiet LockPack.
Polecam: https://github.com/lminuti/Delphi-OpenSSL i klasę TRSAUtil.

@kAzek:
Twój kod działa i wczytuje klucz publiczny. Zastanawia minie ten offset = 24.
Ale nie w tym rzecz. LockPack nie obsługuje klucza publicznego dłuższego niż 1024 bitów, a potrzebuję 2048.
Dzięki za chęć pomocy :)

0

Ten https://github.com/TurboPack/LockBox3 LockBox prawdopodobnie obsługuje cdowolny zadany rozmiar to po prostu tym Cardinal więc w zasadzie chyba można ustawić co się chce (oczywiście poprawne rozmiary) tylko domyślnie ma 1024 ale to już zupełnie inaczej napisane więc trzeba by w ogóle tego obsługę od podstaw ogarnąć.

Offset 24 wynika z BIT STRING -> SEQUENCE co można odczytać korzystając z tego dekodera online http://lapo.it/asn1js/ (link do tego ktoś podawał w tym temacie co podawałem na stackoverflow)

1 użytkowników online, w tym zalogowanych: 0, gości: 1