相同的字符串盐析代码给出不同的结果 我在PHP和C++中都有一个类,只需要使用一个字符串和盐字符串来进行私密性的盐腌制。这个想法是一个PHP脚本将加密一个C++程序的字符串来接收和解密。它们使用预先共享的salt字符串同步模式
问题在于似乎是相同的逻辑,它们为加密相同的字符串生成不同的结果。这意味着,对字符串的任意一端进行解密都不会产生给定的原始字符串 这可能是我错过或犯了错误的一些非常简单的事情。或者它可能与使用字符编码的PHP有关,因为C++是原始比特流。PHP脚本设置为使用纯文本输出,并使用“us ascii”编码 下面是PHP类:相同的字符串盐析代码给出不同的结果 我在PHP和C++中都有一个类,只需要使用一个字符串和盐字符串来进行私密性的盐腌制。这个想法是一个PHP脚本将加密一个C++程序的字符串来接收和解密。它们使用预先共享的salt字符串同步模式,php,c++,string,encryption,Php,C++,String,Encryption,问题在于似乎是相同的逻辑,它们为加密相同的字符串生成不同的结果。这意味着,对字符串的任意一端进行解密都不会产生给定的原始字符串 这可能是我错过或犯了错误的一些非常简单的事情。或者它可能与使用字符编码的PHP有关,因为C++是原始比特流。PHP脚本设置为使用纯文本输出,并使用“us ascii”编码 下面是PHP类: define( 'NUM_STRINGS', 256 ); class CTwEncryption { function Crypt( $szValue, $szSalt
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;
}
}
<?php
define( 'NUM_STRINGS', 256 );
class CTwEncryption
{
function Crypt( $szValue, $szSalt )
{
$iValueSize = strlen( $szValue );
$iSaltSize = strlen( $szSalt );
if ( $iValueSize == 0 || $iSaltSize == 0 )
return null;
$j = 1;
$iChars = array();
$iKeys = array();
// Init array of 0-255
for ( $i = 0; $i < NUM_STRINGS; $i++ )
$iChars[ $i ] = $i;
// Init array of 0-255 with a calculated char value
for ( $i = 0; $i < NUM_STRINGS; $i++ )
{
if ( $j > $iSaltSize )
$j = 1;
$iKeys[ $i ] = ord( $szSalt[ $j ] );
$j++;
}
// Shuffle the array values around to give a random value
$j = 0;
for ( $i = 0; $i < NUM_STRINGS; $i++ )
{
$j = ( $j + $iChars[ $i ] + $iKeys[ $i ] ) % NUM_STRINGS;
$iTemp = $iChars[ $i ];
$iChars[ $i ] = $iChars[ $j ];
$iChars[ $j ] = $iTemp;
}
// Encrypt/decrypt the string
$szReturnValue = null;
$i = 0;
$j = 0;
for ( $x = 0; $x < $iValueSize; $x++ )
{
$i = ( $i + 1 ) % NUM_STRINGS;
$j = ( $j + $iChars[ $i ] ) % NUM_STRINGS;
$iTemp = $iChars[ $i ];
$iChars[ $i ] = $iChars[ $j ];
$iChars[ $j ] = $iTemp;
$t = ( $iChars[ $i ] + ( $iChars[ $j ] % NUM_STRINGS ) ) % NUM_STRINGS;
$y = $iChars[ $t ];
$iValue = str_split( $szValue );
for ( $c = 0; $c < $iValueSize; $c++ )
$iValue[ $c ] = ord( $iValue[ $c ] );
$cCrypt = chr( $iValue[ $x ] ^ $y );
$szReturnValue .= $cCrypt;
}
// Return encrypted/decrypted string
return $szReturnValue;
}
}
$c_TwEncryption = new CTwEncryption;
?>
define('NUM_STRINGS',256);
类CTW加密
{
函数Crypt($szValue,$szSalt)
{
$iValueSize=(int)strlen($szValue);
$iSaltSize=(int)strlen($szSalt);
$szStrings=array();
$szKeys=array();
$j=1;
//0-255的初始数组
对于($i=0;$i$iSaltSize)
$j=1;
$szKeys[$i]=ord(substr($szSalt,$j,1));
$j++;
}
//对数组值进行无序排列,以给出一个随机值
$j=0;
对于($i=0;$i
这里是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;
}
};
#定义NUM_字符串256
类CTW加密
{
私人:
char*szWorking;
公众:
CTwEncryption(){szWorking=NULL;};
~CTwEncryption(){if(szWorking!=NULL){delete szWorking;szWorking=NULL;}};
char*Crypt(const char szValue[],const char szSalt[]
{
常量int iValueSize=(int)strlen(szValue);
常量int iSaltSize=(int)strlen(szSalt);
如果(iValueSize==0 | | iSaltSize==0)
返回NULL;
int j=1;
char*szStrings[NUM_STRINGS];
char*szKeys[NUM_字符串];
//0-255的初始数组
for(int i=0;iiSaltSize)
j=1;
itoa((int)(szSalt[j]),szKey,10;
szKey[iValueSize]=0;
szKey[i]=szKey;
j++;
}
//对数组值进行无序排列,以给出一个随机值
j=0;
for(int i=0;i 对于(int i=0;i我不确定,但使用mb.*
函数可能会有帮助:
- 使用
mb\u strlen
- 使用
mb\u substr
要么只给它值,要么给它编码(但是如果没有提供任何函数,每个mb.*
函数都应该检查字符串编码)。解决了这个问题。看起来我需要通过HTTP PUT请求将输入发送到PHP脚本,然后使用fopen(“php://input“,“rb”)看来PHP不是以二进制安全的方式处理任何东西,也在C++和PHP上,我把每个字符当作整数,这就允许在二进制安全模式下正确处理UTF 32字符串。
这是我的C++类,我在“TwitcRyp.h”中有我的:
以下是我的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;
}
}
<?php
define( 'NUM_STRINGS', 256 );
class CTwEncryption
{
function Crypt( $szValue, $szSalt )
{
$iValueSize = strlen( $szValue );
$iSaltSize = strlen( $szSalt );
if ( $iValueSize == 0 || $iSaltSize == 0 )
return null;
$j = 1;
$iChars = array();
$iKeys = array();
// Init array of 0-255
for ( $i = 0; $i < NUM_STRINGS; $i++ )
$iChars[ $i ] = $i;
// Init array of 0-255 with a calculated char value
for ( $i = 0; $i < NUM_STRINGS; $i++ )
{
if ( $j > $iSaltSize )
$j = 1;
$iKeys[ $i ] = ord( $szSalt[ $j ] );
$j++;
}
// Shuffle the array values around to give a random value
$j = 0;
for ( $i = 0; $i < NUM_STRINGS; $i++ )
{
$j = ( $j + $iChars[ $i ] + $iKeys[ $i ] ) % NUM_STRINGS;
$iTemp = $iChars[ $i ];
$iChars[ $i ] = $iChars[ $j ];
$iChars[ $j ] = $iTemp;
}
// Encrypt/decrypt the string
$szReturnValue = null;
$i = 0;
$j = 0;
for ( $x = 0; $x < $iValueSize; $x++ )
{
$i = ( $i + 1 ) % NUM_STRINGS;
$j = ( $j + $iChars[ $i ] ) % NUM_STRINGS;
$iTemp = $iChars[ $i ];
$iChars[ $i ] = $iChars[ $j ];
$iChars[ $j ] = $iTemp;
$t = ( $iChars[ $i ] + ( $iChars[ $j ] % NUM_STRINGS ) ) % NUM_STRINGS;
$y = $iChars[ $t ];
$iValue = str_split( $szValue );
for ( $c = 0; $c < $iValueSize; $c++ )
$iValue[ $c ] = ord( $iValue[ $c ] );
$cCrypt = chr( $iValue[ $x ] ^ $y );
$szReturnValue .= $cCrypt;
}
// Return encrypted/decrypted string
return $szReturnValue;
}
}
$c_TwEncryption = new CTwEncryption;
?>
请记住,不应通过HTTP GET或POST请求定义$szString或$szSalt(PHP端)。请注意安全并使用PUT请求,如下所示:
$szString = null;
$hInData = fopen( "php://input", "rb" ) || die( "Unable to open HTTP PUT handle." );
if( $hInData != null )
{
while ( $bData = fread( $hRequest, 1024 ) )
$szString .= $bData;
}
else
die( "Unable to read HTTP PUT data." );
fClose( $hInData ) || die( "Unable to close HTTP PUT handle." );
if( $szString == null || empty( $szString ) )
die( "No data read from HTTP PUT stream." );
Fuly.
StAcExoad并不是免费调试服务。您做了什么调试?您确认所有中间变量在PHP和C++中都有等价的值吗?您是否考虑过使用像PHP实现的标准加密技术那样的东西,许多其他语言都支持它?这是很多的。比尝试使用自己的更简单(而且可能更有效)…好主意。安装了mbstring扩展并使用了它们,尽管PHP脚本产生了相同的结果。@Adambean那么,正如前面提到的,您应该一步一步地(一个变量一个变量地)执行此操作调试这两个脚本,并查看差异首先出现在何处以及原因。
$szString = null;
$hInData = fopen( "php://input", "rb" ) || die( "Unable to open HTTP PUT handle." );
if( $hInData != null )
{
while ( $bData = fread( $hRequest, 1024 ) )
$szString .= $bData;
}
else
die( "Unable to read HTTP PUT data." );
fClose( $hInData ) || die( "Unable to close HTTP PUT handle." );
if( $szString == null || empty( $szString ) )
die( "No data read from HTTP PUT stream." );