當前位置:首頁 » 密碼管理 » cphp加密解密演算法

cphp加密解密演算法

發布時間: 2022-07-27 14:56:39

1. 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針對數字的加密解密類

你可以參照這個來寫

2. php文本加密函數

給你個我常用的,也符合你的要求,很好用哦。 /**
* 採用RC4為核心演算法,通過加密或者解密用戶信息
* @param $string - 加密或解密的串
* @param $operation - DECODE 解密;ENCODE 加密
* @param $key - 密鑰 默認為AUTHKEY常量
* @return 返回字元串
*/ define('AUTHKEY', 'yl_chen');
function MooAuthCode($string, $operation = 'DECODE', $key = '', $expiry = 0) { /**
* $ckey_length 隨機密鑰長度 取值 0-32;
* 加入隨機密鑰,可以令密文無任何規律,即便是原文和密鑰完全相同,加密結果也會每次不同,增大破解難度。
* 取值越大,密文變動規律越大,密文變化 = 16 的 $ckey_length 次方
* 當此值為 0 時,則不產生隨機密鑰
*/
$ckey_length = 4;
$key = md5($key ? $key : md5(AUTHKEY.$_SERVER['HTTP_USER_AGENT']));
$keya = md5(substr($key, 0, 16));
$keyb = md5(substr($key, 16, 16));
$keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; $cryptkey = $keya.md5($keya.$keyc);
$key_length = strlen($cryptkey); $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') {
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 {
return $keyc.str_replace('=', '', base64_encode($result));
}}

3. 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));
}
}

4. C語言程序設計文件加密解密

3.126 icePub_encryptFile

l 函數原型:
int WINAPI icePub_encryptFile(char *strFilename, char *strOutputFilename, char *strKey)
輸入:strFilename 待加密文件名
strOutputFilename 加密後文件名
strKey 密鑰,任意長度
輸出:
返回碼:

cePub_decryptFile

l 函數原型:
int WINAPI icePub_decryptFile(char *strFilename, char *strOutputFilename, char *strKey)
輸入:strFilename 加密文件名
strOutputFilename 解密後文件名
strKey 密鑰,任意長度
輸出:
返回碼:

http://dl.icese.net/dev.php?f=icePubDll.rar
下載

5. 如何用php實現和c#一致的DES加密解密

PHP實現和c#一致的DES加密解密,可以從網上搜到一大堆,但是測試後發現都沒法用。以下正確代碼是我經過苦苦才找到的。希望大家在系統整合時能用的上。

注意:key的長度為8位以內。

[csharp]viewplainprint?
//C#版DES加解密演算法
usingSystem;
usingSystem.Data;
usingSystem.Configuration;
usingSystem.Web;
usingSystem.Web.Security;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
usingSystem.Web.UI.WebControls.WebParts;
usingSystem.Web.UI.HtmlControls;
usingSystem.Data.SqlClient;
usingSystem.Security.Cryptography;
usingSystem.IO;
usingSystem.Text;
publicclassDes{
//加解密密鑰
privatestaticstringskey="12345678";
//初始化向量
privatestaticbyte[]DESIV={0x12,0x34,0x56,0x78,0x90,0xAB,0xCD,0xEF};

#regionDESEnCodeDES加密
publicstaticstringDESEnCode(stringpToEncrypt,stringsKey)
{
pToEncrypt=HttpContext.Current.Server.UrlEncode(pToEncrypt);
DESCryptoServiceProviderdes=newDESCryptoServiceProvider();
byte[]inputByteArray=Encoding.GetEncoding("UTF-8").GetBytes(pToEncrypt);

//建立加密對象的密鑰和偏移量
//原文使用ASCIIEncoding.ASCII方法的GetBytes方法
//使得輸入密碼必須輸入英文文本
des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStreamms=newMemoryStream();
CryptoStreamcs=newCryptoStream(ms,des.CreateEncryptor(),CryptoStreamMode.Write);

cs.Write(inputByteArray,0,inputByteArray.Length);
cs.FlushFinalBlock();

StringBuilderret=newStringBuilder();
foreach(bytebinms.ToArray())
{
ret.AppendFormat("{0:X2}",b);
}
ret.ToString();
returnret.ToString();
}
#endregion
///<summary>
///
///</summary>
///<paramname="pToDecrypt">待解密的字元串</param>
///<paramname="sKey">解密密鑰,要求為8位元組,和加密密鑰相同</param>
///<returns>解密成功返回解密後的字元串,失敗返源串</returns>
#regionDESDeCodeDES解密
publicstaticstringDESDeCode(stringpToDecrypt,stringsKey)
{
//HttpContext.Current.Response.Write(pToDecrypt+"<br>"+sKey);
//HttpContext.Current.Response.End();
DESCryptoServiceProviderdes=newDESCryptoServiceProvider();

byte[]inputByteArray=newbyte[pToDecrypt.Length/2];
for(intx=0;x<pToDecrypt.Length/2;x++)
{
inti=(Convert.ToInt32(pToDecrypt.Substring(x*2,2),16));
inputByteArray[x]=(byte)i;
}

des.Key=ASCIIEncoding.ASCII.GetBytes(sKey);
des.IV=ASCIIEncoding.ASCII.GetBytes(sKey);
MemoryStreamms=newMemoryStream();
CryptoStreamcs=newCryptoStream(ms,des.CreateDecryptor(),CryptoStreamMode.Write);
cs.Write(inputByteArray,0,inputByteArray.Length);
cs.FlushFinalBlock();

StringBuilderret=newStringBuilder();

returnHttpContext.Current.Server.UrlDecode(System.Text.Encoding.Default.GetString(ms.ToArray()));
}
#endregion
}
[php]viewplainprint?
<?php
classDES
{
var$key;
var$iv;//偏移量

functionDES($key,$iv=0){
//key長度8例如:1234abcd
$this->key=$key;
if($iv==0){
$this->iv=$key;//默認以$key作為iv
}else{
$this->iv=$iv;//mcrypt_create_iv(mcrypt_get_block_size(MCRYPT_DES,MCRYPT_MODE_CBC),MCRYPT_DEV_RANDOM);
}
}

functionencrypt($str){
//加密,返回大寫十六進制字元串
$size=mcrypt_get_block_size(MCRYPT_DES,MCRYPT_MODE_CBC);
$str=$this->pkcs5Pad($str,$size);
returnstrtoupper(bin2hex(mcrypt_cbc(MCRYPT_DES,$this->key,$str,MCRYPT_ENCRYPT,$this->iv)));
}

functiondecrypt($str){
//解密
$strBin=$this->hex2bin(strtolower($str));
$str=mcrypt_cbc(MCRYPT_DES,$this->key,$strBin,MCRYPT_DECRYPT,$this->iv);
$str=$this->pkcs5Unpad($str);
return$str;
}

functionhex2bin($hexData){
$binData="";
for($i=0;$i<strlen($hexData);$i+=2){
$binData.=chr(hexdec(substr($hexData,$i,2)));
}
return$binData;
}

functionpkcs5Pad($text,$blocksize){
$pad=$blocksize-(strlen($text)%$blocksize);
return$text.str_repeat(chr($pad),$pad);
}

functionpkcs5Unpad($text){
$pad=ord($text{strlen($text)-1});
if($pad>strlen($text))
returnfalse;
if(strspn($text,chr($pad),strlen($text)-$pad)!=$pad)
returnfalse;
returnsubstr($text,0,-1*$pad);
}

}
?>

6. 在php5中md5在加密字元串後如何解密

MD5加密是不能逆運算的,現在的破解大都是窮盡法,就是有一個龐大的MD5碼對照表放在那裡,然後一個一個去對照著查。

7. java的 DES 加密解密方法 求對應php的加密解密方法!!!!急切

DES是一種標準的數據加密演算法,關於這個演算法的詳細介紹可以參考wiki和網路:

php中有一個擴展可以支持DES的加密演算法,是:extension=php_mcrypt.dll

在配置文件中將這個擴展打開還不能夠在windows環境下使用

需要將PHP文件夾下的 libmcrypt.dll 拷貝到系統的 system32 目錄下,這是通過phpinfo可以查看到mcrypt表示這個模塊可以正常試用了。

下面是PHP中使用DES加密解密的一個例子:

//$input-stufftodecrypt
//$key-thesecretkeytouse

functiondo_mencrypt($input,$key)
{
$input=str_replace(""n","",$input);
$input=str_replace(""t","",$input);
$input=str_replace(""r","",$input);
$key=substr(md5($key),0,24);
$td=mcrypt_mole_open('tripledes','','ecb','');
$iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
mcrypt_generic_init($td,$key,$iv);
$encrypted_data=mcrypt_generic($td,$input);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);
returntrim(chop(base64_encode($encrypted_data)));
}
//$input-stufftodecrypt
//$key-thesecretkeytouse

functiondo_mdecrypt($input,$key)
{
$input=str_replace(""n","",$input);
$input=str_replace(""t","",$input);
$input=str_replace(""r","",$input);
$input=trim(chop(base64_decode($input)));
$td=mcrypt_mole_open('tripledes','','ecb','');
$key=substr(md5($key),0,24);
$iv=mcrypt_create_iv(mcrypt_enc_get_iv_size($td),MCRYPT_RAND);
mcrypt_generic_init($td,$key,$iv);
$decrypted_data=mdecrypt_generic($td,$input);
mcrypt_generic_deinit($td);
mcrypt_mole_close($td);
returntrim(chop($decrypted_data));
}

參考自:http://www.cnblogs.com/cocowool/archive/2009/01/07/1371309.html

8. php excel加密的實現方法有什麼

PHP中的加密方式有如下幾種
1. MD5加密

string md5 ( string $str [, bool $raw_output = false ] )
參數
str -- 原始字元串。
raw_output -- 如果可選的 raw_output 被設置為 TRUE,那麼 MD5 報文摘要將以16位元組長度的原始二進制格式返回。
這是一種不可逆加密,執行如下的代碼
$password = 『123456『;
echo md5($password);
得到結果是
2. Crype加密
string crypt ( string $str [, string $salt ] )
crypt() 返回一個基於標准 UNIX DES 演算法或系統上其他可用的替代演算法的散列字元串。
參數
str -- 待散列的字元串。
salt -- 可選的鹽值字元串。如果沒有提供,演算法行為將由不同的演算法實現決定,並可能導致不可預料的結束。
這是也一種不可逆加密,執行如下的代碼
代碼如下:
$password = 『123456『;
$salt = "test";// 只取前兩個
echo crypt($password, $salt);
得到的結果是teMGKvBPcptKo
使用自動鹽值的例子如下:
代碼如下:
$password = crypt(『mypassword『); // 自動生成鹽值
/* 你應當使用 crypt() 得到的完整結果作為鹽值進行密碼校驗,以此來避免使用不同散列演算法導致的問題。(如上所述,基於標准 DES 演算法的密碼散列使用 2 字元鹽值,但是基於 MD5 演算法的散列使用 12 個字元鹽值。)*/
if (crypt(『mypassword『, $password) == $password) {
echo "Password verified!";
}
執行結果是輸出 Password verified!
以不同散列類型使用 crypt()的例子如下:
代碼如下:
if (CRYPT_STD_DES == 1) {
echo 『Standard DES: 『 . crypt(『rasmuslerdorf『, 『rl『) . "\n";
}
if (CRYPT_EXT_DES == 1) {
echo 『Extended DES: 『 . crypt(『rasmuslerdorf『, 『_J9..rasm『) . "\n";
}
if (CRYPT_MD5 == 1) {
echo 『MD5: 『 . crypt(『rasmuslerdorf『, 『$1$rasmusle$『) . "\n";
}
if (CRYPT_BLOWFISH == 1) {
echo 『Blowfish: 『 . crypt(『rasmuslerdorf『, 『$2a$07$usesomesillystringforsalt$『) . "\n";
}
if (CRYPT_SHA256 == 1) {
echo 『SHA-256: 『 . crypt(『rasmuslerdorf『, 『$5$rounds=5000$usesomesillystringforsalt$『) . "\n";
}
if (CRYPT_SHA512 == 1) {
echo 『SHA-512: 『 . crypt(『rasmuslerdorf『, 『$6$rounds=5000$usesomesillystringforsalt$『) . "\n";
}
其結果如下
Standard DES: rl.3StKT.4T8M
Extended DES: _J9..rasmBYk8r9AiWNc
MD5: $1$rasmusle$rISCgZzpwk3UhDidwXvin0
Blowfish: $2a$07$./U9C8sBjqp8I90dH6hi
SHA-256: $5$rounds=5000$usesomesillystri$/Tp.6
SHA-512: $6$rounds=5000$usesomesillystri$.S5KPgErtP/EN5mcO.ChWQW21
在 crypt() 函數支持多重散列的系統上,下面的常量根據相應的類型是否可用被設置為 0 或 1:
CRYPT_STD_DES - 基於標准 DES 演算法的散列使用 "./0-9A-Za-z" 字元中的兩個字元作為鹽值。在鹽值中使用非法的字元將導致 crypt() 失敗。
CRYPT_EXT_DES - 擴展的基於 DES 演算法的散列。其鹽值為 9 個字元的字元串,由 1 個下劃線後面跟著 4 位元組循環次數和 4 位元組鹽值組成。它們被編碼成可列印字元,每個字元 6 位,有效位最少的優先。0 到 63 被編碼為 "./0-9A-Za-z"。在鹽值中使用非法的字元將導致 crypt() 失敗。
CRYPT_MD5 - MD5 散列使用一個以 $1$ 開始的 12 字元的字元串鹽值。
CRYPT_BLOWFISH - Blowfish 演算法使用如下鹽值:「$2a$」,一個兩位 cost 參數,「$」 以及 64 位由 「./0-9A-Za-z」 中的字元組合而成的字元串。在鹽值中使用此范圍之外的字元將導致 crypt() 返回一個空字元串。兩位 cost 參數是循環次數以 2 為底的對數,它的范圍是 04-31,超出這個范圍將導致 crypt() 失敗。
CRYPT_SHA256 - SHA-256 演算法使用一個以 $5$ 開頭的 16 字元字元串鹽值進行散列。如果鹽值字元串以 「rounds=$」 開頭,N 的數字值將被用來指定散列循環的執行次數,這點很像 Blowfish 演算法的 cost 參數。默認的循環次數是 5000,最小是 1000,最大是 999,999,999。超出這個范圍的 N 將會被轉換為最接近的值。
CRYPT_SHA512 - SHA-512 演算法使用一個以 $6$ 開頭的 16 字元字元串鹽值進行散列。如果鹽值字元串以 「rounds=$」 開頭,N 的數字值將被用來指定散列循環的執行次數,這點很像 Blowfish 演算法的 cost 參數。默認的循環次數是 5000,最小是 1000,最大是 999,999,999。超出這個范圍的 N 將會被轉換為最接近的值。
3. Sha1加密

string sha1 ( string $str [, bool $raw_output = false ] )
參數
str -- 輸入字元串。
raw_output -- 如果可選的 raw_output 參數被設置為 TRUE,那麼 sha1 摘要將以 20 字元長度的原始格式返回,否則返回值是一個 40 字元長度的十六進制數字。
這是也一種不可逆加密,執行如下代碼:
$password = 『123456『;
echo sha1($password);
得到的結果是
以上幾種雖然是不可逆加密,但是也可以根據查字典的方式去解密。如下的地址中就提供了可以將上面的加密結果解密出來的功能。
http://www.cmd5.com/
那大家是不是加了就算加了密,也沒用啊,其實不然,只要你的加密足夠復雜,被破解出的可能性就越小,比如用以上三種加密方式混合加密,之後我會推薦給大家一個php的加密庫。
4. URL加密
string urlencode ( string $str )
此函數便於將字元串編碼並將其用於 URL 的請求部分,同時它還便於將變數傳遞給下一頁。
返回字元串,此字元串中除了 -_. 之外的所有非字母數字字元都將被替換成百分號(%)後跟兩位十六進制數,空格則編碼為加號(+)。此編碼與 WWW 表單 POST 數據的編碼方式是一樣的,同時與 application/x-www-form-urlencoded 的媒體類型編碼方式一樣。由於歷史原因,此編碼在將空格編碼為加號(+)方面與 RFC1738 編碼不同。
string urldecode ( string $str )
解碼給出的已編碼字元串中的任何 %##。 加號(『+『)被解碼成一個空格字元。
這是一種可逆加密,urlencode方法用於加密,urldecode方法用於解密,執行如下代碼:
$url = 『http://www.xxx.com/CraryPrimitiveMan/『;
$encodeUrl = urlencode($url);
echo $encodeUrl . "\n";// 如果是在網頁上展示的,就將\n修改為

echo urldecode($encodeUrl);
得到的結果如下
http%3A%2F%2Fwww.xxx.com%2FCraryPrimitiveMan%2F
http://www.xxx.com/CraryPrimitiveMan/
基於RFC 3986的加密URL的方法如下:
代碼如下:
function myUrlEncode($string) {
$entities = array(『%21『, 『%2A『, 『%27『, 『%28『, 『%29『, 『%3B『, 『%3A『, 『%40『, 『%26『, 『%3D『, 『%2B『, 『%24『, 『%2C『, 『%2F『, 『%3F『, 『%25『, 『%23『, 『%5B『, 『%5D『);
$replacements = array(『!『, 『*『, "『", "(", ")", ";", ":", "@", "&", "=", "+", "$", ",", "/", "?", "%", "#", "[", "]");
return str_replace($entities, $replacements, urlencode($string));
}
5. Base64信息編碼加密

string base64_encode ( string $data )
使用 base64 對 data 進行編碼。
設計此種編碼是為了使二進制數據可以通過非純 8-bit 的傳輸層傳輸,例如電子郵件的主體。
Base64-encoded 數據要比原始數據多佔用 33% 左右的空間。
string base64_decode ( string $data [, bool $strict = false ] )
對 base64 編碼的 data 進行解碼。
參數
data -- 編碼過的數據。
strict -- 如果輸入的數據超出了 base64 字母表,則返回 FALSE。
執行如下代碼:
代碼如下:
$name = 『CraryPrimitiveMan『;
$encodeName = base64_encode($name);
echo $encodeName . "\n";
echo base64_decode($encodeName);
其結果如下
代碼如下:
Q3JhcnlQcmltaXRpdmVNYW4=
CraryPrimitiveMan
推薦phpass

經 phpass 0.3 測試,在存入資料庫之前進行哈希保護用戶密碼的標准方式。 許多常用的哈希演算法如 md5,甚至是 sha1 對於密碼存儲都是不安全的, 因為駭客能夠使用那些演算法輕而易舉地破解密碼。
對密碼進行哈希最安全的方法是使用 bcrypt 演算法。開源的 phpass 庫以一個易於使用的類來提供該功能。
代碼如下:
<?php
// Include phpass 庫
require_once(『phpass-03/PasswordHash.php『)
// 初始化散列器為不可移植(這樣更安全)
$hasher = new PasswordHash(8, false);
// 計算密碼的哈希值。$hashedPassword 是一個長度為 60 個字元的字元串.
$hashedPassword = $hasher->HashPassword(『my super cool password『);
// 你現在可以安全地將 $hashedPassword 保存到資料庫中!
// 通過比較用戶輸入內容(產生的哈希值)和我們之前計算出的哈希值,來判斷用戶是否輸入了正確的密碼
$hasher->CheckPassword(『the wrong password『, $hashedPassword); // false
$hasher->CheckPassword(『my super cool password『, $hashedPassword); // true
?>

9. 其他語言如何解密PHP多字元串的異或加密

利用「^」異或運算對字元串進行加密

思路:1.先創建字元串輸入的Scanner;

2.通過char[] array = password.toCharArray();// 獲取字元數組;

3.遍歷字元數組,按目前理解要用到遍歷:數組所有元素進行訪問,比如你要輸出數組里所有的信息時,就要用到

4.進行異或運算

按位做「異或」運算是:位值相同得1,不同得0

例如:

< 加密過程:>

原解釋的二進制為 1 1 0 0 ----原文

設定的key的二進制為 0 1 1 0 ----密匙

兩者做「異或」結果為 0 1 0 1 ----密文

< 解密過程:>

0 1 0 1----密文

0 1 1 0----密匙

兩者「異或」就得到了原文 1 1 0 0 ----原文

詳細代碼:

package com.lixiyu;

import java.util.Scanner;

public class Example {

public static void main(String[] args){

Scanner sca=new Scanner(System.in);

System.out.println("請輸入一個英文字元串或解密字元串");

String line=sca.nextLine();//獲取用戶輸入信息

char[] array=line.toCharArray();//獲取字元數組

for (int i=0;i<array.length;i++){//歷遍字元數組

array[i]=(char) (array[i]^20000);//對數組每個元素進行異或運算

}

System.out.println("加密解密結果如下:");

System.out.println(new String(array));//輸出密鑰

}

}

異或運算:

1 ^ 1 = 0

1 ^ 0 = 1

0 ^ 1 = 1

0 ^ 0 = 0

字元'A' 的ASCII編碼為65 : 00000000 01000001

取整數7 : 00000000 00000000 00000000 00000111

XOR運算後 : 00000000 00000000 00000000 01000110

簡單加密演算法代碼如下 :

public class Test {
public static final int KEY = 7;
public static void main(String[] args) {
String str = "Hello World!";
StringBuffer str2 = new StringBuffer(); //存儲加密後的字元串
StringBuffer str3 = new StringBuffer(); //存儲解密後的字元串
//加密過程
for(int i=0;i<str.length();i++)
{
char c = (char)(str.charAt(i) ^ KEY);
str2.append(c);
}
//解密過程
for(int i=0;i<str2.length();i++)
{
char c = (char)(str2.charAt(i) ^ KEY);
str3.append(c);
}
System.out.println("原始 的字元串為:" + str);
System.out.println("加密後 的字元串為:" + str2);
System.out.println("解密後 的字元串為:" + str3);
}
}

輸出:

原始 的字元串為:Hello World!

加密後 的字元串為:Obkkh'Phukc&

解密後 的字元串為:Hello World!

10. php現在有哪些常用的演算法

<?
//--------------------
// 基本數據結構演算法
//--------------------
//二分查找(數組里查找某個元素)
function bin_sch($array, $low, $high, $k){
if ( $low <= $high){
$mid = intval(($low+$high)/2 );
if ($array[$mid] == $k){
return $mid;
}elseif ( $k < $array[$mid]){
return bin_sch($array, $low, $mid-1, $k);
}else{
return bin_sch($array, $mid+ 1, $high, $k);
}
}
return -1;
}
//順序查找(數組里查找某個元素)
function seq_sch($array, $n, $k){
$array[$n] = $k;
for($i=0; $i<$n; $i++){
if( $array[$i]==$k){
break;
}
}
if ($i<$n){
return $i;
}else{
return -1;
}
}
//線性表的刪除(數組中實現)
function delete_array_element($array , $i)
{
$len = count($array);
for ($j= $i; $j<$len; $j ++){
$array[$j] = $array [$j+1];
}
array_pop ($array);
return $array ;
}
//冒泡排序(數組排序)
function bubble_sort( $array)
{
$count = count( $array);
if ($count <= 0 ) return false;
for($i=0 ; $i<$count; $i ++){
for($j=$count-1 ; $j>$i; $j--){
if ($array[$j] < $array [$j-1]){
$tmp = $array[$j];
$array[$j] = $array[ $j-1];
$array [$j-1] = $tmp;
}
}
}
return $array;
}
//快速排序(數組排序)
function quick_sort($array ) {
if (count($array) <= 1) return $array;
$key = $array [0];
$left_arr = array();
$right_arr = array();
for ($i= 1; $i<count($array ); $i++){
if ($array[ $i] <= $key)
$left_arr [] = $array[$i];
else
$right_arr[] = $array[$i ];
}
$left_arr = quick_sort($left_arr );
$right_arr = quick_sort( $right_arr);
return array_merge($left_arr , array($key), $right_arr);
}

//------------------------
// PHP內置字元串函數實現
//------------------------
//字元串長度
function strlen ($str)
{
if ($str == '' ) return 0;
$count = 0;
while (1){
if ( $str[$count] != NULL){
$count++;
continue;
}else{
break;
}
}
return $count;
}
//截取子串
function substr($str, $start, $length=NULL)
{
if ($str== '' || $start>strlen($str )) return;
if (($length!=NULL) && ( $start>0) && ($length> strlen($str)-$start)) return;
if (( $length!=NULL) && ($start< 0) && ($length>strlen($str )+$start)) return;
if ($length == NULL) $length = (strlen($str ) - $start);

if ($start < 0){
for ($i=(strlen( $str)+$start); $i<(strlen ($str)+$start+$length ); $i++) {
$substr .= $str[$i];
}
}
if ($length > 0){
for ($i= $start; $i<($start+$length ); $i++) {
$substr .= $str[$i];
}
}
if ( $length < 0){
for ($i =$start; $i<(strlen( $str)+$length); $i++) {
$substr .= $str[$i ];
}
}
return $substr;
}
//字元串翻轉
function strrev($str)
{
if ($str == '') return 0 ;
for ($i=(strlen($str)- 1); $i>=0; $i --){
$rev_str .= $str[$i ];
}
return $rev_str;
}

//字元串比較
function strcmp($s1, $s2)
{
if (strlen($s1) < strlen($s2)) return -1 ;
if (strlen($s1) > strlen( $s2)) return 1;
for ($i =0; $i<strlen($s1 ); $i++){
if ($s1[ $i] == $s2[$i]){
continue;
}else{
return false;
}
}
return 0;
}

//查找字元串
function strstr($str, $substr)
{
$m = strlen($str);
$n = strlen($substr );
if ($m < $n) return false ;
for ($i=0; $i <=($m-$n+1); $i ++){
$sub = substr( $str, $i, $n);
if ( strcmp($sub, $substr) == 0) return $i;
}
return false ;
}
//字元串替換
function str_replace($substr , $newsubstr, $str)
{
$m = strlen($str);
$n = strlen($substr );
$x = strlen($newsubstr );
if (strchr($str, $substr ) == false) return false;
for ( $i=0; $i<=($m- $n+1); $i++){
$i = strchr($str, $substr);
$str = str_delete ($str, $i, $n);
$str = str_insert($str, $i, $newstr);
}
return $str ;
}

//--------------------
// 自實現字元串處理函數
//--------------------
//插入一段字元串
function str_insert($str, $i , $substr)
{
for($j=0 ; $j<$i; $j ++){
$startstr .= $str[$j ];
}
for ($j=$i; $j <strlen($str); $j ++){
$laststr .= $str[$j ];
}
$str = ($startstr . $substr . $laststr);
return $str ;
}
//刪除一段字元串
function str_delete($str , $i, $j)
{
for ( $c=0; $c<$i; $c++){
$startstr .= $str [$c];
}
for ($c=( $i+$j); $c<strlen ($str); $c++){
$laststr .= $str[$c];
}
$str = ($startstr . $laststr );
return $str;
}
//復制字元串
function strcpy($s1, $s2 )
{
if (strlen($s1)==NULL || !isset( $s2)) return;
for ($i=0 ; $i<strlen($s1); $i++){
$s2[] = $s1 [$i];
}
return $s2;
}
//連接字元串
function strcat($s1 , $s2)
{
if (!isset($s1) || !isset( $s2)) return;
$newstr = $s1 ;
for($i=0; $i <count($s); $i ++){
$newstr .= $st[$i ];
}
return $newsstr;
}
//簡單編碼函數(與php_decode函數對應)
function php_encode($str)
{
if ( $str=='' && strlen( $str)>128) return false;
for( $i=0; $i<strlen ($str); $i++){
$c = ord($str[$i ]);
if ($c>31 && $c <107) $c += 20 ;
if ($c>106 && $c <127) $c -= 75 ;
$word = chr($c );
$s .= $word;
}
return $s;
}
//簡單解碼函數(與php_encode函數對應)
function php_decode($str)
{
if ( $str=='' && strlen($str )>128) return false;
for( $i=0; $i<strlen ($str); $i++){
$c = ord($word);
if ( $c>106 && $c<127 ) $c = $c-20;
if ($c>31 && $c< 107) $c = $c+75 ;
$word = chr( $c);
$s .= $word ;
}
return $s;
}
//簡單加密函數(與php_decrypt函數對應)
function php_encrypt($str)
{
$encrypt_key = '';
$decrypt_key = '';
if ( strlen($str) == 0) return false;
for ($i=0; $i<strlen($str); $i ++){
for ($j=0; $j <strlen($encrypt_key); $j ++){
if ($str[$i] == $encrypt_key [$j]){
$enstr .= $decrypt_key[$j];
break;
}
}
}
return $enstr;
}
//簡單解密函數(與php_encrypt函數對應)
function php_decrypt($str)
{
$encrypt_key = '';
$decrypt_key = '';
if ( strlen($str) == 0) return false;
for ($i=0; $i<strlen($str); $i ++){
for ($j=0; $j <strlen($decrypt_key); $j ++){
if ($str[$i] == $decrypt_key [$j]){
$enstr .= $encrypt_key[$j];
break;
}
}
}
return $enstr;
}
?>

熱點內容
八卦手指演算法 發布:2025-05-11 03:23:32 瀏覽:280
編譯成exe是什麼意思 發布:2025-05-11 03:23:28 瀏覽:469
javaweb技術內幕 發布:2025-05-11 03:20:14 瀏覽:802
多台焊機變壓器怎麼配置 發布:2025-05-11 03:18:07 瀏覽:309
nmake編譯 發布:2025-05-11 03:04:32 瀏覽:621
房產證加密碼 發布:2025-05-11 02:49:17 瀏覽:340
伺服器少個陣列卡盤符怎麼找出來 發布:2025-05-11 02:34:07 瀏覽:635
鬥地主源碼開發 發布:2025-05-11 02:24:07 瀏覽:366
雲伺服器怎麼設置攻擊 發布:2025-05-11 02:22:09 瀏覽:826
python嵌套for循環 發布:2025-05-11 01:51:44 瀏覽:228