2.4.8. Шифрование в XML

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

Зашифрование с передачей ключа по алгоритмам ГОСТ3410

Вспомогательная функция для определения типа провайдера по идентификатору алгоритма
<pascal>
function GetProvTypeByAlgOID(AAlgOID: string): Integer;
begin
  PROV_GOST_2001_DH := 75; // Провайдер ГОСТ Р 34.10-2001.
  PROV_GOST_2012_256 := 80; // Провайдер ГОСТ Р 34.10-2012. Создает ключи длины 256 бит (длина открытого ключа 512 бит)
  PROV_GOST_2012_512 := 81; // Провайдер ГОСТ Р 34.10-2012. Создает ключи длины 512 бит (длина открытого ключа 1024 бита)
  szOID_CP_GOST_R3410EL := '1.2.643.2.2.19'; //Алгоритм ГОСТ Р 34.10-2001, используемый при экспорте/импорте ключей
  szOID_CP_GOST_R3410_12_256 := '1.2.643.7.1.1.1.1'; //  Алгоритм ГОСТ Р 34.10-2012 для ключей длины 256 бит, используемый при экспорте/импорте ключей
  szOID_CP_GOST_R3410_12_512 := '1.2.643.7.1.1.1.2'; //  Алгоритм ГОСТ Р 34.10-2012 для ключей длины 512 бит, используемый при экспорте/импорте ключей

  if AAlgOID = szOID_CP_GOST_R3410EL then
    Result := PROV_GOST_2001_DH
  else
  if AAlgOID = szOID_CP_GOST_R3410_12_256 then
    Result := PROV_GOST_2012_256
  else
  if AAlgOID = szOID_CP_GOST_R3410_12_512 then
    Result := PROV_GOST_2012_512
  else
    raise('Неожиданный OID');
end;
</pascal>
Функция зашифрования данных переданных для передачи в XML-Документе
<pascal>
procedure Encrypt(AData: Variant{Blob}; ARecipientPublic: TbtkCryptorCertificate;
  var AEncryptedSessionKey, AEncryptedData: string);
begin
  KEYBLOB_TYPE_PUBLIC := 6;
  GR28147OID := '1.2.643.2.2.21'; //алгоритм ключа шифрования
  provType := GetProvTypeByAlgOID(ARecipientPublic.PublicKeyAlgorithm);
  provider := Cryptor.CreateProvByType(provType);
  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>

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

Расшифрование с передачей ключа по алгоритмам ГОСТ3410

Функция расшифрования данных переданных в 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>

2.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>