这里有两个我之前经常用的加密/解密的字符串函数:
/**
* 可逆的字符串加密函数
* @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
$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
$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(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(encryptSrc);
return V_TRUE;
}
注意:PHP rand(0,10),返回任意一个0-10中的数,包括0和10;
C++ rand() % 11,返回一个任意一个0-10中的数,包括0和10;而且是一个伪随机;
需要srand时间作为一个种子,但是获取系统时间的时候,连续循环100次,会得到同一个时间种子,务必注意时间差。
另外,password是一个固定的string,passwordRand后记得还原,不然就累加了