看流星社区

 找回密码
 注册账号
查看: 1844|回复: 0

加密解密算法,客户端C++加密,服务端PHP解密

[复制链接]

该用户从未签到

发表于 2016-9-21 11:10:44 | 显示全部楼层 |阅读模式

这里有两个我之前经常用的加密/解密的字符串函数:

/**
* 可逆的字符串加密函数
* @param int $txtStream 待加密的字符串内容
* @param int $password 加密密码
* @return string 加密后的字符串
*/
在CODE上查看代码片派生到我的代码片
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 解密后的字符串
*/
[php] view plain copy 在CODE上查看代码片派生到我的代码片
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++版编码的,特记录下来

在CODE上查看代码片派生到我的代码片
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后记得还原,不然就累加了
点击按钮快速添加回复内容: 支持 高兴 激动 给力 加油 苦寻 生气 回帖 路过 感恩
您需要登录后才可以回帖 登录 | 注册账号

本版积分规则

小黑屋|手机版|Archiver|看流星社区 |网站地图

GMT+8, 2024-4-18 16:47

Powered by Kanliuxing X3.4

© 2010-2019 kanliuxing.com

快速回复 返回顶部 返回列表