3.4.8. Шифрование в xml

3.4.8.1. Зашифрование данных для передачи в xml

Зашифрование с передачей ключа по алгоритму urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001

функция зашифрования данных переданных для передачи в XML-Документе
<pascal>
procedure Encrypt(AData: Variant{Blob}; ARecipientPublic: TbtkCryptorCertificate;
  var AEncryptedSessionKey, AEncryptedData: string);
begin
  KEYBLOB_TYPE_PUBLIC := 6;
  PROV_GOST_2001_DH := 75; //Тип используемого криптопровайдера
  GR28147OID := '1.2.643.2.2.21'; //алгоритм ключа шифрования
  provider := Cryptor.CreateProvByType(PROV_GOST_2001_DH);
  sessionKey := provider.CreateKeyByGenKey(GR28147OID);
  publicBlob := provider.CreateKeyByPublic(ARecipientPublic).Export(KEYBLOB_TYPE_PUBLIC);

  AEncryptedSessionKey := BlobToBase64(Cryptor.EncryptSessionKey(sessionKey, publicBlob));

  encVector := sessionKey.Vector;
  encData := sessionKey.EncryptData(AData);
  AEncryptedData := BlobToBase64(BlobConcat(encVector, encData));
end;
</pascal>

3.4.8.2. Расшифрование данных из xml

Расшифрование с передачей ключа по алгоритму urn:ietf:params:xml:ns:cpxmlsec:algorithms:transport-gost2001

функция расшифрования данных переданных в XML-Документе
<pascal>
function Decrypt(AData, ASessionKey: string; ARecipientPrivate: TbtkCryptorKey): Variant{Blob};
begin
  sessionKey := Cryptor.DecryptSessionKey(Base64ToBlob(ASessionKey), ARecipientPrivate);
  data := Base64ToBlob(AData);
  sessionKey.Vector := BlobCopy(data, 0, 8);
  Result := sessionKey.DecryptData(BlobCopy(data, 8, Length(data)));
end;
</pascal>

3.4.8.3. Пример использования

Пример совместного использования функций приведённых выше
<pascal>
  origianText := 'Какой-то текст для зашифрования';
  DataToSend := StringToBlob(origianText, 65001);
  cert := Cryptor.CreateCertByDialog;

  key := '';
  data := '';
  Encrypt(DataToSend, cert, key, data);

  RecivedData := Decrypt(data, key, cert.Provider.CreateKeyByPrivate)

  finalText := BlobToString(RecivedData, 65001);
  ShowMessage(finalText);
</pascal>