Я хотел бы проверить цифровую подпись с помощью LockBox3 (или LockBox2, если версия 3 не подходит по какой-либо причине).
У меня есть файл открытого ключа в форме 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
исключением.
Что я делаю не так? Может кто-нибудь привести рабочий пример?