① php加密解密問題,一道10000+公司的phper,大公司的php面試題。
<?php
/**
*加密解密類
*該演算法僅支持加密數字。比較適用於資料庫中id欄位的加密解密,以及根據數字顯示url的加密。
*@author深秋的竹子
*@versionalpha
*@加密原則標記長度+補位+數字替換
*@加密步驟:
*將a-z,A-Z,0-962個字元打亂,取前M(數字最大的位數)位作為標記長度字元串,取第M+1到第M+10位為數字替換字元串,剩餘的為補位字元串
*1.計算數字長度n,取亂碼的第n位作為標記長度。
*2.計算補位的長度,加密串的長度N-1-n為補位的長度。根據指定的演算法得到補位字元串。
*3.根據數字替換字元串替換數字,得到數字加密字元串。
*標記長度字元+補位字元串+數字加密字元串=加密串
*Usage:
*$obj=newXDeode(9);
*$e_txt=$obj->encode(123);
*echo$e_txt.'<br/>';
*echo$key->decode($e_txt);
*/
classXDeode{
private$strbase="";
private$key,$length,$codelen,$codenums,$codeext;
function__construct($length=9,$key=2543.5415412812){
$this->key=$key;
$this->length=$length;
$this->codelen=substr($this->strbase,0,$this->length);
$this->codenums=substr($this->strbase,$this->length,10);
$this->codeext=substr($this->strbase,$this->length+10);
}
functionencode($nums){
$rtn="";
$numslen=strlen($nums);
//密文第一位標記數字的長度
$begin=substr($this->codelen,$numslen-1,1);
//密文的擴展位
$extlen=$this->length-$numslen-1;
$temp=str_replace('.','',$nums/$this->key);
$temp=substr($temp,-$extlen);
$arrextTemp=str_split($this->codeext);
$arrext=str_split($temp);
foreach($arrextas$v){
$rtn.=$arrextTemp[$v];
}
$arrnumsTemp=str_split($this->codenums);
$arrnums=str_split($nums);
foreach($arrnumsas$v){
$rtn.=$arrnumsTemp[$v];
}
return$begin.$rtn;
}
functiondecode($code){
$begin=substr($code,0,1);
$rtn='';
$len=strpos($this->codelen,$begin);
if($len!==false){
$len++;
$arrnums=str_split(substr($code,-$len));
foreach($arrnumsas$v){
$rtn.=strpos($this->codenums,$v);
}
}
return$rtn;
}
}
一個PHP針對數字的加密解密類
你可以參照這個來寫
② 如何寫PHP加密演算法
第一步.變數名稱混淆[可選]
第二步.將所有代碼用16進制字元或八進制字元表示組成字元串,如\x78,\187
第三步.將組合成的字元串先base64編碼在base64解碼,如base64_decode(base64_encode(str));
第四步.將組合成的字元串放入到eval()函數中執行
第五步 偽裝整個頁面
ok完成
當然也可以自己寫個加密解密函數,加入到文件裡面。
③ PHP加密解密函數 回答有追加!!!
我這里用到了一個函數,與你上面說的解密函數類似,不過是加密解密都和在一起的
/*
* $string: 明文 或 密文
* $operation:DECODE表示解密,其它表示加密
* $key: 密匙
* $expiry:密文有效期
* */
function authcode($string, $operation = 'DECODE', $key = '', $expiry = 0)
{
// 動態密匙長度,相同的明文會生成不同密文就是依靠動態密匙
$ckey_length = 4;
// 密匙
$key = md5($key ? $key : 'livcmsencryption ');
// 密匙a會參與加解密
$keya = md5(substr($key, 0, 16));
// 密匙b會用來做數據完整性驗證
$keyb = md5(substr($key, 16, 16));
// 密匙c用於變化生成的密文
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : '';
// 參與運算的密匙
$cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey);
// 明文,前10位用來保存時間戳,解密時驗證數據有效性,10到26位用來保存$keyb(密匙b),解密時會通過這個密匙驗證數據完整性
// 如果是解碼的話,會從第$ckey_length位開始,因為密文前$ckey_length位保存 動態密匙,以保證解密正確
$string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;
$string_length = strlen($string);
$result = '';
$box = range(0, 255);
$rndkey = array();
// 產生密匙簿
for($i = 0; $i <= 255; $i++) {
$rndkey[$i] = ord($cryptkey[$i % $key_length]);
}
// 用固定的演算法,打亂密匙簿,增加隨機性,好像很復雜,實際上對並不會增加密文的強度
for($j = $i = 0; $i < 256; $i++) {
$j = ($j + $box[$i] + $rndkey[$i]) % 256;
$tmp = $box[$i];
$box[$i] = $box[$j];
$box[$j] = $tmp;
}
// 核心加解密部分
for($a = $j = $i = 0; $i < $string_length; $i++) {
$a = ($a + 1) % 256;
$j = ($j + $box[$a]) % 256;
$tmp = $box[$a];
$box[$a] = $box[$j];
$box[$j] = $tmp;
// 從密匙簿得出密匙進行異或,再轉成字元
$result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
}
if($operation == 'DECODE') {
// substr($result, 0, 10) == 0 驗證數據有效性
// substr($result, 0, 10) - time() > 0 驗證數據有效性
// substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16) 驗證數據完整性
// 驗證數據有效性,請看未加密明文的格式
if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) {
return substr($result, 26);
} else {
return '';
}
} else {
// 把動態密匙保存在密文里,這也是為什麼同樣的明文,生產不同密文後能解密的原因
// 因為加密後的密文可能是一些特殊字元,復制過程可能會丟失,所以用base64編碼
return $keyc.str_replace('=', '', base64_encode($result));
}
}
④ php md5加密可以破解嗎
雖然md5是不可逆的加密方式,但是網上還是可以解密的,在線解密md5運用的是一次md5加密方式去解析的,解析的方式也是運用強大的數據內容一
一去對比的,找到匹配的就可以了。在程序中你可以多次用md5加密和字元串截取,或者追加字元串,比如密碼,傳來的值用同樣的方式加密和資料庫保存的密碼做對比就可以了,這樣安全性會很高,再強大的md5資料庫內容也找不到你設置的密碼
⑤ 在php5中md5在加密字元串後如何解密
MD5加密是不能逆運算的,現在的破解大都是窮盡法,就是有一個龐大的MD5碼對照表放在那裡,然後一個一個去對照著查。
⑥ PHP解密Unicode及Escape加密字元串
在json中不支持中文,用它傳送中文數據就會出現數據丟失或者亂碼,必須在傳送前對要發送的字元串進行編碼,由於傳送過去需要用js進行數據解析,考慮
到js中有unescape函數,故若在php中有個escape函數,對數據進行編碼,在客戶端用unescape進行
解碼,這樣就會方便很多。
本文給大家分享一個PHP解密Unicode及Escape加密字元串函數
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
?php
function
uni_decode($s)
{
preg_match_all('/#([0-9]{2,5});/',
$s,
$html_uni);
preg_match_all('/[%]u([0-9a-f]{4})/ie',
$s,
$js_uni);
$source
=
array_merge($html_uni[0],
$js_uni[0]);
$js
=
array();
for($i=0;$icount($js_uni[1]);$i++)
{
$js[]
=
hexdec($js_uni[1][$i]);
}
$utf8
=
array_merge($html_uni[1],
$js);
$code
=
$s;
for($j=0;$jcount($utf8);$j++)
{
$code
=
str_replace($source[$j],
unicode2utf8($utf8[$j]),
$code);
}
return
$code;//$s;//preg_replace('/u([0-9a-f]{4})/ie',
chr(hexdec('1')),
$s);
}
function
unicode2utf8($c)
{
$str=;
if
($c
0x80)
{
$str.=chr($c);
}
else
if
($c
0x800)
{
$str.=chr(0xc0
|
$c6);
$str.=chr(0x80
|
$c
0x3f);
}
else
if
($c
0x10000)
{
$str.=chr(0xe0
|
$c12);
$str.=chr(0x80
|
$c6
0x3f);
$str.=chr(0x80
|
$c
0x3f);
}
else
if
($c
0x200000)
{
$str.=chr(0xf0
|
$c18);
$str.=chr(0x80
|
$c12
0x3f);
$str.=chr(0x80
|
$c6
0x3f);
$str.=chr(0x80
|
$c
0x3f);
}
return
$str;
}
$str='%u5927%u5BB6%u597D%uFF0C我是孤魂!br
/';
echo
uni_decode($str);
//
大家好,我是孤魂!這是測試文本!
在網上搜索一把,很多用php實現的escape函數,大同小異
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function
phpescape($str){
preg_match_all(/[x80-xff].|[x01-x7f]+/,$str,$newstr);
$ar
=
$newstr[0];
foreach($ar
as
$k=$v){
if(ord($ar[$k])=127){
$tmpString=bin2hex(iconv(GBK,ucs-2,$v));
if
(!eregi(WIN,PHP_OS)){
$tmpString
=
substr($tmpString,2,2).substr($tmpString,0,2);
}
$reString.=%u.$tmpString;
}
else
{
$reString.=
rawurlencode($v);
}
}
return
$reString;
}
以上所述就是本文的全部內容了,希望大家能夠喜歡。
⑦ 求個簡單的PHP & C++ 字元串加密解密演算法
不需要解密的話使用MD5便是了,但是需要解密的話考慮別的,簡單的比如BASE64,其他的如RSA,DES什麼的
⑧ 請教 php如何對字元串加密和解密,求一個相關的實例!
base64_decode() 解密
base64_encode()加密
<?php
$str='Thisisanencodedstring';
echobase64_encode($str);
?>