PHP と C++ の両方でクラスを作成し、値の文字列とソルト文字列を取得して、プライバシーのためにソルティングを行います。アイデアは、PHP スクリプトが C++ プログラムの文字列を暗号化し、受信して復号化するというものです。これらは、事前共有されたソルト文字列、同期モードを使用します。
問題は、同じ文字列を暗号化するための異なる結果を生成する同じロジックのように見えるものにあります。これは、文字列の両端を復号化しても、元の文字列にはならないことを意味します。
それはおそらく、私が見逃した、または間違えた本当に単純なものです。あるいは、C++ が raw ビット ストリームである文字エンコーディングを使用する PHP に関連している可能性があります。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;
}
};
ここで何か助けていただければ幸いです、ありがとう:)