加密解密演算法,客戶端C++加密,服務端PHP解密
阿新 • • 發佈:2019-01-22
這裡有兩個我之前經常用的加密/解密的字串函式:
/**
* 可逆的字串加密函式
* @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後記得還原,不然就累加了