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