2.4.9. Шифрование в PKCS #7¶
Метод | Описание |
Cryptor.SignAndEncryptMessage() |
Подписывает и зашифровывает данные в формате PKCS #7. |
Cryptor.DecryptAndVerifyMessageSignature() |
Расшифровывает данные из PKCS #7 и проверяет подпись. |
2.4.9.1. Подписание и зашифрование данных для передачи в PKCS #7¶
<pascal>
function SignAndEcnrypt(ABlob: Variant; ASignerCert, ARecipientCert: TbtkCryptorCertificate; AEncryptionAlgorithm: String): Variant{Blob};
var
res: TbtkSignAndEncryptMessageResult;
begin
res := Cryptor.SignAndEncryptMessage(ABlob, ASignerCert, ARecipientCert, AEncryptionAlgorithm);
if res.IsSuccessful then
Result := res.SignedAndEncryptedBlob;
else
Raise(Format('Не удалось зашифровать или подписать сообщение.'#13#10#13#10'Код ошибки:'#13#10' $%x'#13#10'Текст ошибки:'#13#10' "%s"', [res.ErrorCode, res.ErrorMessage]));
end;
</pascal>
2.4.9.2. Расшифрование данных из PKCS #7 и проверка подписи¶
<pascal>
function DecryptAndVerifyMessageSignature(ABlob: Variant; ASignerCert, ARecipientCert: TbtkCryptorCertificate): Variant{Blob};
var
res: TbtkDecryptAndVerifyMessageSignatureResult;
begin
res := Cryptor.DecryptAndVerifyMessageSignature(ABlob);
if res.IsSuccessful then
begin
if Assigned(ASignerCert) and (res.SignerCert.ID <> ASignerCert.ID) then
Raise(Format('Сертификат отправителя не соответствует ожидаемому'#13#10#13#10'Ожидаемый: "%s"'#13#10#13#10'Актуальный:', [ASignerCert.SubjectName, res.SignerCert.SubjectName]));
if Assigned(ARecipientCert) and (res.RecipientCert.ID <> ARecipientCert.ID) then
Raise(Format('Сертификат получателя не соответствует ожидаемому'#13#10#13#10'Ожидаемый: "%s"'#13#10#13#10'Актуальный:', [ARecipientCert.SubjectName, res.RecipientCert.SubjectName]));
Result := res.DecryptedBlob;
end
else
Raise(Format('Не удалось расшифровать сообщение.'#13#10#13#10'Код ошибки:'#13#10' $%x'#13#10'Текст ошибки:'#13#10' "%s"', [res.ErrorCode, res.ErrorMessage]));
end;
</pascal>
2.4.9.3. Пример использования¶
<pascal>
// определяем и подготавливаем исходные данные
origianText := 'Какой-то текст';
blobToSignAndEncrypt := StringToBlob(origianText, 65001);
// получаем сертификаты отправителя и получателя сообщения
signerCert := Cryptor.CreateCertByDialog;
recipientCert := Cryptor.CreateCertByDialog;
// определяем алгоритм шифрования
encryptionAlgorithm := '1.2.643.2.2.21'; //ГОСТ 28147-89
// подписываем и зашифровываем данные
signedAndEncryptedBlob := SignAndEcnrypt(blobToSignAndEncrypt, signerCert, recipientCert, encryptionAlgorithm);
// расшифровываем данные и проверяем подпись а также её соответствие ожидаемому сертификату
decryptedBlob := DecryptAndVerifyMessageSignature(signedAndEncryptedBlob, signerCert, Null);
// преобразуем полученные данные в строку и отображаем результат
finalText := BlobToString(decryptedBlob, 65001);
ShowMessage(finalText);
</pascal>