Heim  >  Artikel  >  Backend-Entwicklung  >  有没有大神??求可逆的动态加密函数(2-WAY PHP版本)

有没有大神??求可逆的动态加密函数(2-WAY PHP版本)

WBOY
WBOYOriginal
2016-06-23 13:50:56900Durchsuche

http://www.xxx.tld/?user=K5idDC
http://www.xxx.tld/?user=2RK4dm
http://www.xxx.tld/?user=3wemcF
http://www.xxx.tld/?user=492mF3。。。。。。

比如以上user参数的值都指向同一用户名(ABCD)的资料页,有动态可逆的函数这样可以实现一个用户名对应上千个加密字符,如果没有可逆函数,需用数据库保存对应关系的话,那很麻烦!

要求如下:
1、刷新一次可变一次,并且可逆;
2、要和被加密内容差不多长短;

不知道有这样的函数吗?有大神知道吗?麻烦分享一下,谢谢!

网上搜索的DZ函数加密后密文太长了,不合适用作URL


回复讨论(解决方案)

for($i=0; $i<10; $i++) {  echo $m = encode('ABCD');  echo ' : ' . decode($m) . PHP_EOL;}function encode($s) {  $d = array_map('chr', range(0x21, 0x7e));  $len = count($d);  $t = rand(0, $len);  $r = $d[$t];  for($i=0; $i<strlen($s); $i++) {    $r .= $d[(ord($s{$i}) - 0x21 + $t) % $len];  }  return $r;}function decode($s) {  $d = array_map('chr', range(0x21, 0x7e));  $len = count($d);  $r = '';  $t = array_search($s{0}, $d);  for($i=1; $i<strlen($s); $i++) {    $r .= $d[(ord($s{$i}) - 0x21 +($len - $t)) % $len];  }  return $r;}
Iijkl : ABCD
3STUV : ABCD
)IJKL : ABCD
)IJKL : ABCD
Ddefg : ABCD
Zz{|} : ABCD
@`abc : ABCD
o1234 : ABCD
j,-./ : ABCD
3STUV : ABCD

for($i=0; $i<10; $i++) {  echo $m = encode('ABCD');  echo ' : ' . decode($m) . PHP_EOL;}function encode($s) {  $d = array_map('chr', range(0x21, 0x7e));  $len = count($d);  $t = rand(0, $len);  $r = $d[$t];  for($i=0; $i<strlen($s); $i++) {    $r .= $d[(ord($s{$i}) - 0x21 + $t) % $len];  }  return $r;}function decode($s) {  $d = array_map('chr', range(0x21, 0x7e));  $len = count($d);  $r = '';  $t = array_search($s{0}, $d);  for($i=1; $i<strlen($s); $i++) {    $r .= $d[(ord($s{$i}) - 0x21 +($len - $t)) % $len];  }  return $r;}
Iijkl : ABCD
3STUV : ABCD
)IJKL : ABCD
)IJKL : ABCD
Ddefg : ABCD
Zz{|} : ABCD
@`abc : ABCD
o1234 : ABCD
j,-./ : ABCD
3STUV : ABCD



大神还是这里的强!谢谢!有没有办法去掉特殊符号呢?用来做URL不太好吧?

刚刚放到项目去。字符有 / 的就rewrite就出错了

数字的还有很大几率出现 &  ,请问有什么办法能让它不出现特殊字符吗?

函数中的数组 $d 是所有允许出现的字符列表,我示例的是全部可打印的ASCII 字符(空格除外)
你可根据你的需求调整其规模

调整一下代码

/*//生成随机字典$d = str_split('0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');shuffle($d);echo join('', $d) . PHP_EOL;*/define('DICT', 'hpkE6F0VWb8Cc3Ha_t4OMYl5xPy9ojuRA1dqKBQIJvrLiGsZeNgTm7wzfXDSU2n');for($i=0; $i<10; $i++) {  echo $m = encode('ABCD');  echo ' : ' . decode($m) . PHP_EOL;}function encode($s) {  $d = str_split(DICT);  $len = count($d);  $t = rand(0, $len);  $r = $d[$t];  for($i=0; $i<strlen($s); $i++) {    $r .= $d[(array_search($s{$i}, $d) + $t) % $len];  }  return $r;}
OTfuH : ABCD
oUkI5 : ABCD
ciN5V : ABCD
6Kvan : ABCD
4gzj3 : ABCD
un6vP : ABCD
So1Vw : ABCD
mYyhZ : ABCD
Z_YDr : ABCD
FBr_h : ABCD

调整一下代码

/*//生成随机字典$d = str_split('0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ');shuffle($d);echo join('', $d) . PHP_EOL;*/define('DICT', 'hpkE6F0VWb8Cc3Ha_t4OMYl5xPy9ojuRA1dqKBQIJvrLiGsZeNgTm7wzfXDSU2n');for($i=0; $i<10; $i++) {  echo $m = encode('ABCD');  echo ' : ' . decode($m) . PHP_EOL;}function encode($s) {  $d = str_split(DICT);  $len = count($d);  $t = rand(0, $len);  $r = $d[$t];  for($i=0; $i<strlen($s); $i++) {    $r .= $d[(array_search($s{$i}, $d) + $t) % $len];  }  return $r;}
OTfuH : ABCD
oUkI5 : ABCD
ciN5V : ABCD
6Kvan : ABCD
4gzj3 : ABCD
un6vP : ABCD
So1Vw : ABCD
mYyhZ : ABCD
Z_YDr : ABCD
FBr_h : ABCD


谢谢!就是想要这样的,请问对应的decode是什么,我算法很菜!

噢,贴漏了

function decode($s) {  $d = str_split(DICT);  $len = count($d);  $r = '';  $t = array_search($s{0}, $d);  for($i=1; $i<strlen($s); $i++) {    $r .= $d[(array_search($s{$i}, $d) + ($len - $t)) % $len];  }  return $r;}

噢,贴漏了

function decode($s) {  $d = str_split(DICT);  $len = count($d);  $r = '';  $t = array_search($s{0}, $d);  for($i=1; $i<strlen($s); $i++) {    $r .= $d[(array_search($s{$i}, $d) + ($len - $t)) % $len];  }  return $r;}



9SpQl : ABCD
yDhBY : ABCD
LctwQ : ABCD
dEWGj : ABCD
xf2qO : ABCD
ABCD : Fry
VIi4k : ABCD
etlSL : ABCD
un6vP : ABCD
PXnKM : ABCD

太感谢!接近完美了,美中不足的是偶尔会出现 “ ABCD : Fry ” 这样的情况。
现在用笨方法过滤,先for 10 次,逐条比较取一条正确的出来。

这个得跟踪一下
明文4个字符,密文应5个字符,对于明文 ABCD 密文 ABCD 明显是少了一个字符

function get_encode($s){    $en_s = encode($s);    if($en_s == $s) {        return get_encode($s);    }else {        return $en_s;    }}

用了递归效率比较好一些了,加密解密算法知识几乎为0,等项目完成后狠狠恶补一下,请问斑竹大神有没有这方面的书推荐一下!


噢,贴漏了

function decode($s) {  $d = str_split(DICT);  $len = count($d);  $r = '';  $t = array_search($s{0}, $d);  for($i=1; $i<strlen($s); $i++) {    $r .= $d[(array_search($s{$i}, $d) + ($len - $t)) % $len];  }  return $r;}



9SpQl : ABCD
yDhBY : ABCD
LctwQ : ABCD
dEWGj : ABCD
xf2qO : ABCD
ABCD : Fry
VIi4k : ABCD
etlSL : ABCD
un6vP : ABCD
PXnKM : ABCD

太感谢!接近完美了,美中不足的是偶尔会出现 “ ABCD : Fry ” 这样的情况。
现在用笨方法过滤,先for 10 次,逐条比较取一条正确的出来。

是加密的时候$t = rand(0, $len);这里错了,应该是$t = rand(0, $len -1);



噢,贴漏了

function decode($s) {  $d = str_split(DICT);  $len = count($d);  $r = '';  $t = array_search($s{0}, $d);  for($i=1; $i<strlen($s); $i++) {    $r .= $d[(array_search($s{$i}, $d) + ($len - $t)) % $len];  }  return $r;}



9SpQl : ABCD
yDhBY : ABCD
LctwQ : ABCD
dEWGj : ABCD
xf2qO : ABCD
ABCD : Fry
VIi4k : ABCD
etlSL : ABCD
un6vP : ABCD
PXnKM : ABCD

太感谢!接近完美了,美中不足的是偶尔会出现 “ ABCD : Fry ” 这样的情况。
现在用笨方法过滤,先for 10 次,逐条比较取一条正确的出来。

是加密的时候$t = rand(0, $len);这里错了,应该是$t = rand(0, $len -1);
在PHPCHINA那问了几天没人回,在这几小时就解决了!!真的谢谢!
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn