Почему xor шифрование в php не работает как надо?

Суть вопроса, есть код на стороне скомпилированного модуля

std::string xor_encryption(std::string data)
{
	char key[] = "<KEY>";
	std::string output = data;
	for (int i = 0; i < data.size(); i++)
		output[i] = data[i] ^ key[i % (sizeof(key) / sizeof(char))];
	return output;
}

#include "base64.h"

std::string xorb64_string(std::string data, bool is_encrypted = false)
{
	if (is_encrypted)
		data = base64_decode(data);
	data = xor_encryption(data);
	if (is_encrypted)
		return data;
	return base64_encode((unsigned char*)data.c_str(), data.length());
}


Есть код на стороне хоста:
function xor_string($data , $key = "<KEY>")
{
    $l = strlen($data);
    $k = strlen($key);
    $r = '';
    for($i = 0; $i < $l; $i++)
    {
        //echo strval($i) . " " . strval($k) . ": " . strval($i % $k) . ". ";
        $r .= $data[$i] ^ $key[$i % $k];
    }
    return $r;
}

function get_post_safe_encrypted($name, $ignore_die = null)
{
    echo "SafeEncryptedKey: " . $name;
    $post_safe = get_post_safe($name, $ignore_die);
    echo ", PostSafe: " . $post_safe;
    $decoded = base64_decode($post_safe);
    //echo ", Base64Decoded: " . $decoded;
    $decrypted = xor_string($decoded);
    echo ", Decrypted2: " . $decrypted;
    return $decrypted;
}


В общем смысл такой, клиентский модуль производит запрос с параметрами к серверу в виде зашифрованной строки, сервер же в свою очередь расшифровывает это и проивзодит некоторые манипуляции. На данный момент вывод такой
SafeEncryptedKey: key, PostSafe: IQYzIwkdNx8WORw+BWV8W3skM1QcLh8kbjYeMQpWAzULFj8/My8yQmIJDA8eNTcLLi4PGgYnI3BtKAcqHRcKAAdHHHVRGDxeBTNMXiZICRQBLx0ONztyMTcgHgtgFSUgMnw9dB1pHgssBm0JawUZIQFBMCdbJwYoPAVJZX5xZBwMfCx+MgYoLyMHHzsPMmcjIBx5cQBHNQkVARYKMwg0FFIDITYDIA8YLz57D346YS4RfTJJDhYdW3IiIzMYO28aKwEfNRkxLSAwXFEwdwwDLWEAah8gDCBhACgrcRkuBwBbFQIZdHInQi8VUA49Ijg4CjBFEwBFOiMzHQkUJS0WLxt0CBQqTQUMYFQHBRsoRhN4ERYrCS42HzgKMTgwPlYDHjhkHW49JzEkMToRFzd8OgIQXXYiJWpGPEs7DCFcTCshAy0CBQFcUwcIOzAKJyQ6FRobeQUleBY=, Decrypted2: oOrpLByVQqHsD79p0ajyXoKeEG2Re0nAPcTSTEW5,@M\[jyBif[WGuf[&m^YV^A,60>~Q*^F'2A"lcOf\]rd<xphJF!G`
                                                                                                                                       y9dYY(JJwAjctUZ4[K<Mc_r6;.*UK4x3sTmhBFKs3b
                      mUo!X}Nt}fTbQcJ`eFAQhv/B?h$Z8kdJWI�YSPw]npttY~[HW~c2SMd&H>Ra^eJKmr\]oSApd.z6t`;bZH]ODy@E�tjtU]YdSP1Q9n
                                                                                                                            QMK%+ftN+g#d}GnDShvCpkuaJYp0P/ob�otc<Sv({)aqMC2g>P`F6)\oJlQ@^�@@o}Kua^_BTAd,W

Если внимательно приглядеться, то можно увидеть что часть данных расшифровалось, а именно вот этот фрагмент
oOrpLByVQqHsD79p0ajyXoKeEG2Re0nAPcTSTEW5
Почему то этот фрагмент равен длинне ключа шифрования, почему дешифровка происходит таким образом? По идее же все должно работать, код на PHP и C++ вроде как эквивалентен
  • Вопрос задан
  • 328 просмотров
Решения вопроса 1
SagePtr
@SagePtr
Еда - это святое
Для начала, на какой-нибудь простой строке и ключе проверьте, какой из двух кодов работает правильно. А потом уже копайте.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
mayton2019
@mayton2019
Bigdata Engineer
Очень сильно не нравится эти игры с разрядностью char.

sizeof(key) / sizeof(char)

Код на С++ написан гетерогенно по отношению к длине символа. Тоесть предполагается что если он будет 1 байт то будет одна логика а если 2 байта то другая. Это очень серъезный gap в архитектуре и его надо обсуждать. Вообще шифрующие алгоритмы пишутся на байтах а не на символах. И оптимизируются соотвественно. Библиотеки CryptoApi и OpenSSL будут в помощь. Надо опираться на них а не на кустарные складыватели по модулю два которые к шифрованию не имеют отношения.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы