使用LockBox验证RSA签名

时间:2019-04-03 16:52:42

标签: delphi lockbox-3 lockbox-2

我想用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例外。

我在做什么错?有人可以提供一个可行的例子吗?

1 个答案:

答案 0 :(得分:-1)

看看这个方法:

LoadKeysFromStream(KeyStream, [partPublic]);

KeyStream 不能只包含二进制公钥。 它尝试从流中加载有关版本、标题、PartSet 等的一些信息。