ホームページ  >  記事  >  バックエンド開発  >  可逆動的暗号化関数 (2-WAY PHP バージョン) を探していますか?

可逆動的暗号化関数 (2-WAY PHP バージョン) を探していますか?

WBOY
WBOYオリジナル
2016-06-23 13:50:56861ブラウズ

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

たとえば、上記のユーザー パラメーターの値はすべて、同じユーザー名 (ABCD) の情報ページを指します。これにより、1 つのユーザー名が数千の暗号化された文字に対応することを実現できます。可逆機能がない場合は対応関係をデータベースに保存する必要があるので面倒です。

要件は次のとおりです:
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
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

ABC 3STUV D

)IJKL : ABCD
)IJKL : ABCD
Ddefg : ABCD
Zz{|} : ABCD
@`abc : ABCD
o1234 : ABCD
j,-./ : ABCD
3STUV : ABCD

ここでも神は最高です!ありがとう!特殊な記号を削除する方法はありますか? URLとして使っても良いのではないでしょうか?

プロジェクトに追加しました。文字に / が含まれている場合、書き換えるとエラーが発生します

数字の中に & が表示される可能性が高くなります。特殊文字を表示しないようにする方法はありますか?

関数内の配列 $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
mYyhZ : ABCD
Z_YDr : ABCD
F Br_h : ABCD



コードを調整します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;}

ああ、投稿を見逃しました

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 : フライ
VIi4k : ABCD
etlSL : ABCD
un6vP : ABCD
PXnKM : ABCD

ありがとうございました!完璧に近いですが、唯一の欠点は「ABCD:フライ」が時々発生することです。
次に、愚かな方法でフィルタリングし、最初に 10 回、それらを 1 つずつ比較し、正しいものを選択します。

これは追跡する必要があります
平文は 4 文字、暗号文は 5 文字である必要があります。平文 ABCD と暗号文 ABCD では、明らかに 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;}

使用効率。再帰の方が優れていますが、暗号化および復号化アルゴリズムの知識はほぼゼロです。プロジェクトが完了したら補います。マスター Buzhu がこのテーマに関する本を勧めてくれますか?


ああ、見逃しました

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


9SpQl : ABCD

yDhBY : ABCD
LctwQ : ABCD
dEWGj : ABCD
xf2qO : ABCD
ABCD : フライ
VIi4k : ABCD
etlSL : ABCD
un6vP : ABCD
PXnKM : ABCD

ありがとうございます!完璧に近いですが、唯一の欠点は「ABCD:フライ」が時々発生することです。
次に、愚かな方法でフィルタリングし、最初に 10 回、1 つずつ比較し、正しいものを選択します。


$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那问了几天没人回,在这几小时就解决了!!真的谢谢!
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。