1

LockBox3 (何らかの理由でバージョン 3 が適していない場合は LockBox2) でデジタル署名を検証したいと考えています。

PEM形式の公開鍵ファイルがあります(他の場所ですでに使用されている既存の鍵ペアを使用する必要があるため、LockBoxで新しい鍵を作成できません):

-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDEDtIRT57TJAfmub2RsIM32jdo
8ijsds/u1fpY6hwtkC01/LFJkNTXqSwvpaO5tp86o0SlzBHdF0WxPtsKqdc8F7kQ
uHm7hUTLX0zPGRdGCsy9q/PIGlVGAFTBSVXl+grmGGZuS1CHI13L/oulBGENQOxO
8r6D1RyPjt6z0BAndQIDAQAB
-----END PUBLIC KEY-----

LockBox に公開鍵として提供する形式がわかりません。PEM を XML に変換してみましたが、RSAKeyValue>Modulus 部分を使用しました。これは、テスト ケースで使用されているものに近いように見えるためですが、どちらも機能しませんでした。(ここの公開鍵は一例であり、私が使用したコンバーターから取得したものです: https://superdry.apphb.com/tools/online-rsa-key-converter )

残念ながら、私が何を試しても、それを LockBox の公開鍵として使用してメッセージの署名を検証することはできませんでした。

これは私がこれまでに基づいて持っているものですuLockBox_Signatory_TestCases.pas:

function VerifySignatureLockBox(const AMessage, ASignature: String): Boolean;
const
  //MyPublicKey = 'MIGfMA0GC...';
  MyPublicKey =
    'xA7SEU+e0yQH5rm9kbCDN9o3aPIo7HbP7tX6WOocLZAtNfyxSZDU16ksL6' +
    'WjubafOqNEpcwR3RdFsT7bCqnXPBe5ELh5u4VEy19MzxkXRgrMvavzyBpV' +
    'RgBUwUlV5foK5hhmbktQhyNdy/6LpQRhDUDsTvK+g9Ucj47es9AQJ3U=';
var
  Lib: TCryptographicLibrary;
  Signatory: TSignatory;
  Codec: TCodec;
  MessageStream, SignatureStream: TStringStream;
  KeyStream: TMemoryStream;
begin
  Lib := TCryptographicLibrary.Create(nil);
  Codec := TCodec.Create(nil);
  Signatory := TSignatory.Create(nil);

  MessageStream := TStringStream.Create(AMessage);
  SignatureStream := TStringStream.Create(ASignature);
  KeyStream := TMemoryStream.Create;
  try
    Base64_to_stream(AnsiBytesOf(MyPublicKey), KeyStream);

    MessageStream.Position := 0;
    SignatureStream.Position := 0;
    KeyStream.Position := 0;

    Codec.CryptoLibrary := Lib;
    Codec.StreamCipherId := RSA_ProgId;
    Codec.ChainModeId:= CBC_ProgId;
    Codec.AsymetricKeySizeInBits := 256;

    Signatory.Codec := Codec;
    Signatory.LoadKeysFromStream(KeyStream, [partPublic]); //<-- ERROR

    Result := Signatory.Verify(MessageStream, SignatureStream) = vPass;
  finally
    Codec.Burn;
    Lib.Free;
    Codec.Free;
    Signatory.Free;

    MessageStream.Free;
    SignatureStream.Free;
    KeyStream.Free;
  end;
end;

これは で失敗しLoadKeysFromStream()、具体的にStoreStream.ReadBuffer( L, SizeOf( L));uTPLb_RSA_Engine / LoadHugeCardinal_IfNotAlready()EStreamError例外が発生します。

私は何を間違っていますか?誰かが実用的な例を提供してもらえますか?

4

1 に答える 1