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>