1. 程式人生 > >加密解密演算法,客戶端C++加密,服務端PHP解密

加密解密演算法,客戶端C++加密,服務端PHP解密

這裡有兩個我之前經常用的加密/解密的字串函式:
/**
* 可逆的字串加密函式
* @param int $txtStream 待加密的字串內容
* @param int $password 加密密碼
* @return string 加密後的字串
*/

public static function enCrypt($txtStream,$password){
//密鎖串,不能出現重複字元,內有A-Z,a-z,0-9,/,=,+,_,

$lockstream = 'st=lDEFABCNOPyzghi_jQRST-UwxkVWXYZabcdef+IJK6/7nopqr89LMmGH012345uv';
//隨機找一個數字,並從密鎖串中找到一個密鎖值
$lockLen = strlen($lockstream);
$lockCount = rand(0,$lockLen-1);
$randomLock = $lockstream[$lockCount];
//結合隨機密鎖值生成MD5後的密碼
$password = md5($password.$randomLock);
//開始對字串加密
$txtStream = base64_encode($txtStream);
$tmpStream = '';
$i=0;$j=0;$k = 0;
for ($i=0; $i<strlen($txtStream); $i++) {
$k = ($k == strlen($password)) ? 0 : $k;
$j = (strpos($lockstream,$txtStream[$i])+$lockCount+ord($password[$k]))%($lockLen);
$tmpStream .= $lockstream[$j];
$k++;
}
return $tmpStream.$randomLock;
}


/**
* 可逆的字串解密函式
* @param int $txtStream 待加密的字串內容
* @param int $password 解密密碼
* @return string 解密後的字串
*/

public static function deCrypt($txtStream,$password){
//密鎖串,不能出現重複字元,內有A-Z,a-z,0-9,/,=,+,_,
$lockstream = 'st=lDEFABCNOPyzghi_jQRST-UwxkVWXYZabcdef+IJK6/7nopqr89LMmGH012345uv';

  
$lockLen = strlen($lockstream);
//獲得字串長度
$txtLen = strlen($txtStream);
//擷取隨機密鎖值
$randomLock = $txtStream[$txtLen - 1];
//獲得隨機密碼值的位置
$lockCount = strpos($lockstream,$randomLock);
//結合隨機密鎖值生成MD5後的密碼
$password = md5($password.$randomLock);
//開始對字串解密
$txtStream = substr($txtStream,0,$txtLen-1);
$tmpStream = '';
$i=0;$j=0;$k = 0;
for($i=0; $i<strlen($txtStream); $i++){
$k = ($k == strlen($password)) ? 0 : $k;
$j = strpos($lockstream,$txtStream[$i]) - $lockCount - ord($password[$k]);
while($j < 0){
$j = $j + ($lockLen);
}
$tmpStream .= $lockstream[$j];
$k++;
}
return base64_decode($tmpStream);
}
以上來自於:浪跡天涯在德問上的回答

因工作需要,我翻譯了個C++版編碼的,特記錄下來

Bool EnCrypt(const String& src, String& des)
{
	String passwordRand = password;
	//隨機找一個數字,並從密鎖串中找到一個密鎖值
	Int lockstreamLength = lockstream.GetLength();
	srand((unsigned)time(NULL));
	Int lockCount = rand() % lockstreamLength;
	Char randomLock = lockstream[lockCount];

	String md5EncodePwd;
	passwordRand += randomLock;

	if (!Md5Encode(passwordRand, md5EncodePwd))
	{
		return FALSE;
	}
	String base64EncodeSrc;
	if (!Base64Encode(src,base64EncodeSrc))
	{
		return FALSE;
	}

	Int i = 0, j = 0, k = 0;
	Int encrySrcLength = base64EncodeSrc.GetLength()+1;
	Char* encryptSrc = New<VChar>(encrySrcLength);
	memset(encryptSrc, 0, encrySrcLength);
	for (i = 0; i < base64EncodeSrc.GetLength(); ++i)
	{
		k = (k == md5EncodePwd.GetLength() ? 0 : k);
		VInt index = lockstream.Find(base64EncodeSrc[i]);
		j = (index + lockCount + md5EncodePwd[k]) % lockstreamLength;
		encryptSrc[i] = lockstream[j];
		k++;
	}

	des = encryptSrc;
	des += randomLock;
	Delete<Char>(encryptSrc);
	return V_TRUE;
}


注意:PHP rand(0,10),返回任意一個0-10中的數,包括0和10;

C++ rand() % 11,返回一個任意一個0-10中的數,包括0和10;而且是一個偽隨機;

需要srand時間作為一個種子,但是獲取系統時間的時候,連續迴圈100次,會得到同一個時間種子,務必注意時間差。

另外,password是一個固定的string,passwordRand後記得還原,不然就累加了