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>