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

$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后记得还原,不然就累加了

原文:http://blog.csdn.net/a49688448/article/details/21476223

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值