У меня есть класс как на PHP, так и на C++, чтобы просто взять строку значений и сольную строку, чтобы сделать соление для конфиденциальности. Идея PHP-скрипта будет шифровать строку для C++-программы для приема и расшифровки. Они используют предварительно разделенную сольную строку, синхронный режим.Тот же код соления солей, дающий разные результаты
Проблема заключается в том, что похоже на ту же логику, что они генерируют другой результат для шифрования одной и той же строки. Это означает, что дешифрование строки или конца не приведет к исходной строке, которую она дала.
Возможно, что-то действительно просто я пропустил или совершил ошибку. Или, возможно, это связано с PHP с использованием кодировки символов, где C++ является сырым битовым потоком. PHP-скрипт настроен на использование простого текстового вывода с кодировкой «us-ascii».
Вот PHP класс:
define('NUM_STRINGS', 256);
class CTwEncryption
{
function Crypt($szValue, $szSalt)
{
$iValueSize = (int)strlen($szValue);
$iSaltSize = (int)strlen($szSalt);
$szStrings = array();
$szKeys = array();
$j = 1;
// Init array of 0-255
for ($i = 0; $i < NUM_STRINGS; $i++)
$szStrings[ $i ] = $i;
// Init array of 0-255 with a calculated char value
for ($i = 0; $i < NUM_STRINGS; $i++)
{
if ($j > $iSaltSize)
$j = 1;
$szKeys[ $i ] = ord(substr($szSalt, $j, 1));
$j++;
}
// Shuffle the array values around to give a random value
$j = 0;
for ($i = 0; $i < NUM_STRINGS; $i++)
{
$j = ($j + $szStrings[ $i ] + $szKeys[ $i ]) % NUM_STRINGS;
$szTemp = $szStrings[ $i ];
$szStrings[ $i ] = $szStrings[ $j ];
$szStrings[ $j ] = $szTemp;
}
// Encrypt/decrypt the string
$szReturnValue = null;
$i = 0;
$j = 0;
for ($x = 0; $x < $iValueSize; $x++)
{
$i = ($i + 1) % NUM_STRINGS;
$j = ($j + $szStrings[ $i ]) % NUM_STRINGS;
$szTemp = $szStrings[ $i ];
$szStrings[ $i ] = $szStrings[ $j ];
$szStrings[ $j ] = $szTemp;
$t = ($szStrings[ $i ] + ($szStrings[ $j ] % NUM_STRINGS)) % NUM_STRINGS;
$y = $szStrings[ $t ];
$cCrypt = chr(substr($szValue, $x, 1)^$y);
$szReturnValue .= $cCrypt;
}
// Return encrypted/decrypted string
return $szReturnValue;
}
}
Вот класс C++:
#define NUM_STRINGS 256
class CTwEncryption
{
private:
char *szWorking;
public:
CTwEncryption() { szWorking = NULL; };
~CTwEncryption() { if (szWorking != NULL) { delete szWorking; szWorking = NULL; } };
char *Crypt(const char szValue[], const char szSalt[])
{
const int iValueSize = (int)strlen(szValue);
const int iSaltSize = (int)strlen(szSalt);
if (iValueSize == 0 || iSaltSize == 0)
return NULL;
int j = 1;
char *szStrings[ NUM_STRINGS ];
char *szKeys[ NUM_STRINGS ];
// Init array of 0-255
for (int i = 0; i < NUM_STRINGS; i++)
{
char *szString = new char[ iValueSize + 1 ];
itoa(i, szString, 10);
szString[ iValueSize ] = 0;
szStrings[ i ] = szString;
}
// Init array of 0-255 with a calculated char value
for (int i = 0; i < NUM_STRINGS; i++)
{
char *szKey = new char[ iValueSize + 1 ];
if (j > iSaltSize)
j = 1;
itoa((int)(szSalt[ j ]), szKey, 10);
szKey[ iValueSize ] = 0;
szKeys[ i ] = szKey;
j++;
}
// Shuffle the array values around to give a random value
j = 0;
for (int i = 0; i < NUM_STRINGS; i++)
{
j = (j + atoi(szStrings[ i ]) + atoi(szKeys[ i ])) % NUM_STRINGS;
char *szTemp = szStrings[ i ];
szStrings[ i ] = szStrings[ j ];
szStrings[ j ] = szTemp;
}
// Encrypt/decrypt the string
szWorking = new char[ iValueSize + 1 ];
for (int i = 0; i <= iValueSize; i++)
szWorking[ i ] = 0;
int i = 0;
j = 0;
for (int x = 0; x <= iValueSize; x++)
{
i = (i + 1) % NUM_STRINGS;
j = (j + atoi(szStrings[ i ])) % NUM_STRINGS;
char *szTemp = szStrings[ i ];
szStrings[ i ] = szStrings[ j ];
szStrings[ j ] = szTemp;
int t = (atoi(szStrings[ i ]) + (atoi(szStrings[ j ]) % NUM_STRINGS)) % NUM_STRINGS;
int y = atoi(szStrings[ t ]);
char cCrypt = char((int)(szValue[ x ])^y);
szWorking[ x ] = cCrypt;
}
// Clean dynamic memory
for (int i = 0; i < NUM_STRINGS; i++)
{
delete szStrings[ i ];
delete szKeys[ i ];
szStrings[ i ] = NULL;
szKeys[ i ] = NULL;
}
// Return encrypted/decrypted string
szWorking[ iValueSize ] = 0;
return szWorking;
}
};
Любая помощь здесь будут оценены, спасибо :)
StackOverflow не является бесплатной службой отладки. – Jon
Какая отладка вы сделали? Вы подтвердили, что все промежуточные переменные имеют эквивалентные значения в PHP и C++? –
Считаете ли вы использование чего-то вроде [phpseclib] (http://phpseclib.sourceforge.net/) для реализаций стандартных методов шифрования pure-PHP, для которых встроены многие другие языки? Это намного проще (и, вероятно, более эффективно), чем пытаться перевернуть свой собственный ... – DaveRandom