A. php怎樣生成一個32位的隨機字元串
php生成32位不重復的隨機數,代碼如下:
functiongetRandom($param){
$str="";
$key="";
for($i=0;$i<$param;$i++)
{
$key.=$str{mt_rand(0,32)};//生成php隨機數
}
return$key;
}
調用:getRandom(32)
輸出結果:一個32位隨機數
B. PHP隨即生成6位數三位0-9三位a-z
以下函數可以實現隨機生成6位數,且其中三位為數字,另外三位為小寫字母:
functionmyRand(){
if(PHP_VERSION<'4.2.0'){
srand();
}
$randArr=array();
for($i=0;$i<3;$i++){
$randArr[$i]=rand(0,9);
$randArr[$i+3]=chr(rand(0,25)+97);
}
shuffle($randArr);
returnimplode('',$randArr);
}
解釋:
PHP_VERSION < '4.2.0'判斷PHP的版本,在版本>=4.2.0時,rand函數會自動播種,不需要調用srand,故此處只有在低於4.2.0版本下需要播種
rand函數會產生一個隨機數,范圍是兩個參數之間的整數(包括邊界),如rand(0,9)返回0~9中的任意一個(包括0和9)
chr返回指定ascii碼所代表的字元,97為a的ascii碼,chr(rand(0, 25) + 97)返回a-z中任意一個字元
shuffle函數會將數組的順序打亂
implode將數組中的元素用空白的字元連接成字元串,即拼接數組成為一個字元串
C. php 怎麼生成rsa加密的公鑰和私鑰
附上出處鏈接:http://bbs.csdn.net/topics/370014844
四,用PHP生成密鑰
PEAR::Crypt_RSA的Crypt_RSA_KeyPair類可以生成密鑰。調用步驟如下:
require_once('Crypt/RSA.php');
$math_obj = &Crypt_RSA_MathLoader::loadWrapper();
$key_pair = new Crypt_RSA_KeyPair($key_lenth);
if (!$key_pair->isError()){
$public_key = $key_pair->getPublicKey();
$private_key = $key_pair->getPrivateKey();
$e =$math_obj->hexstr($math_obj->bin2int($public_key->getExponent()));
$d =$math_obj->hexstr($math_obj->bin2int($private_key->getExponent()));
$n =$math_obj->hexstr($math_obj->bin2int($public_key->getMolus()));
}
hexstr()是自己添加的函數,用來把十進制字元串轉換為十六進制。對Crypt_RSA_Math_GMP很簡單,只需:
function hexstr($num){
return gmp_strval($num,16);
}
對Crypt_RSA_Math_BCMath略麻煩些:
function hexstr($num){
$result = '';
do{
$result = sprintf('%02x',intval(bcmod($num,256))).$result;
$num = bcdiv($num, 256);
}while(bccomp($num, 0));
return ltrim($result,'0');
}
五,用php生成密鑰(二)
為了提高加密速度,一般選一個較小的e。比較常用的是3、17、257、65537幾個素數。
generate()生成密鑰的演算法是依次計算p,q,n,e,d。因此做了如下改動,以便可以自己選e值:
原來的:
function Crypt_RSA_KeyPair($key_len, $wrapper_name = 'default', $error_handler = '')
改後增加一個參數e:
function Crypt_RSA_KeyPair($key_len, $e = null, $wrapper_name = 'default', $error_handler = '')
這個函數調用generate()。效應地:
function generate($key_len = null)
也增加一個參數e:
function generate($key_len = null, $e = null)
把CRYPT_RSA-1.0.0的KeyPair.php中屬於generate()的245~271行改動順序,由e確定p和q:
if($e != null&&$this->_math_obj->cmpAbs($e,2)>0)
$e = $this->_math_obj->nextPrime($this->_math_obj->dec($e));//取個素數
else
{
while(true)
{
$e = $this->_math_obj->getRand($q_len, $this->_random_generator);
if ($this->_math_obj->cmpAbs($e,2)<=0)
continue;
$e = $this->_math_obj->nextPrime($this->_math_obj->dec($e));
break;
}
}
do{
$p = $this->_math_obj->getRand($p_len, $this->_random_generator, true);
$p = $this->_math_obj->nextPrime($p);
do{
do{
$q = $this->_math_obj->getRand($q_len, $this->_random_generator, true);
$tmp_len = $this->_math_obj->bitLen($this->_math_obj->mul($p, $q));
if ($tmp_len < $key_len)
$q_len++;
elseif ($tmp_len > $key_len)
$q_len--;
} while ($tmp_len != $key_len);
$q = $this->_math_obj->nextPrime($q);
$tmp = $this->_math_obj->mul($p, $q);
} while ($this->_math_obj->bitLen($tmp) != $key_len);
// $n - is shared molus
$n = $this->_math_obj->mul($p, $q);
// generate public ($e) and private ($d) keys
$pq = $this->_math_obj->mul($this->_math_obj->dec($p), $this->_math_obj->dec($q));
if($this->_math_obj->isZero($this->_math_obj->dec($this->_math_obj->gcd($e, $pq))))
break;
}while(true);
(網易的服務真體貼啊,連pre標記裡面的東西都給改。還改不好)這樣,如果要生成e為3的1024位密鑰,可以如下調用:
$key_pair = new Crypt_RSA_KeyPair(1024,3);
六,干什麼用
加密比較重要的數據。比如注冊時用戶輸入的密碼。
登錄時把密碼hmac一下就可以防止重放攻擊(replay attack)了。對注冊不存在這種攻擊,但有密碼泄露的危險。上傳密碼hash那點安全性根本不算什麼。這個可以用RSA加密解決。
不過,對中間人攻擊還是沒辦法。
另外一個
http://www.mingup.cn/php/2011/0121/101568.html
D. PHP常用加密解密方法
作者/上善若水
1.md5(string $str,bool $flag = false);
$flag = false 默認返回32位的16進至數據散列值
$flag = true 返回原始流數據
2.sha1($string,$flag = false)
$flag = false 默認返回40位的16進至數據散列值
true 返回原始流數據
3.hash(string $algo,srting $str,bool $flag);
$algo : 演算法名稱,可通過hash_algos()函數獲取所有hash加密的演算法
如:md5,sha1等,採用md5,sha1加密所得結果和1,2兩種方式結 果相同。
$flag = false 默認返回16進至的數據散列值,具體長度根據演算法不同
而不同。
true 返回原始流數據。
4.crypt(string $str,$string $salt);
函數返回使用 DES、Blowfish 或 MD5 演算法加密的字元串。
具體演算法依賴於PHP檢查之後支持的演算法和$salt的格式和長度,當 然具體結果也和操作系統有關。比較結果採用 hash_equals($crypted,crypt($input,$salt));//且salt值相同
Password_verify($str,$crypted);
5.password_hash ( string $str, integer $algo [, array $options ] )
函數返回哈希加密後的密碼字元串, password_hash() 是crypt()的 一個簡單封裝
$algo : 演算法 PASSWORD_DEFAULT ,PASSWORD_BCRYPT
$options = [
「cost」=>10,//指明演算法遞歸的層數,
「salt」=>「xxadasdsad」//加密鹽值,即將被遺 棄,採用系統自動隨機生成安全性更高
];
使用的演算法、cost 和鹽值作為哈希的一部分返回
Password_verify($str,$hashed);
6.base64_encode(string $str)
設計此種編碼是為了使二進制數據可以通過非純 8-bit 的傳輸層 傳輸,例如電子郵件的主體。base64_decode(string $encoded)
可以進行解碼;
7.mcrypt_encrypt ( string $cipher , string $key , string $data ,
string $mode [, string $iv ] )
mcrypt_decrypt ( string $cipher , string $key , string $crypted ,
string $mode [, string $iv ] )
$ciper:加密演算法,mcrypt_list_algorithms()可以獲取該函數所有支持的演算法
如MCRYPT_DES(「des」),MCRYPT_RIJNDAEL_128(「rijndael-128」);
$mode : 加密模式 ,mcrypt_list_modes()獲取所有支持的加密模式,ecb,cbc
$key: 加密的秘鑰,mcrypt_get_key_size ( string $cipher , string $mode )
獲取指定的演算法和模式所需的密鑰長度。$key要滿足這個長度,如果長 度無效會報出警告。
$iv : 加密的初始向量,可通過mcrypt_create_iv ( int $size [, int $source = MCRYPT_DEV_URANDOM ] ),
Iv的參數size:
通過mcrypt_get_iv_size ( string $cipher , string $mode )獲取
Iv 的參數source:
初始向量數據來源。可選值有: MCRYPT_RAND (系統隨機數生成 器), MCRYPT_DEV_RANDOM (從 /dev/random 文件讀取數據) 和 MCRYPT_DEV_URANDOM (從 /dev/urandom 文件讀取數據)。 在 Windows 平台,PHP 5.3.0 之前的版本中,僅支持 MCRYPT_RAND。
請注意,在 PHP 5.6.0 之前的版本中, 此參數的默認值 為 MCRYPT_DEV_RANDOM。
Note: 需要注意的是,如果沒有更多可用的用來產生隨機數據的信息, 那麼 MCRYPT_DEV_RANDOM 可能進入阻塞狀態。
$data : 要加密的字元串數據
E. php如何實現驗證碼許昌鯉魚IT計算機電腦軟體編程培訓中心
驗證碼在表單實現越來越多了,但是用js的寫的驗證碼,總覺得不方便,所以學習了下php實現的驗證碼。好吧,其實是沒有事情干,但是又不想浪費時間,所以學習了下php實現驗證碼。正所謂,技多不壓身。而且,也可以封裝成一個函數,以後使用的時候也是很方便的,當然現在未封裝。
現在來說說簡單的純數字驗證碼吧。
如果是初學者,建議按照我代碼的注釋 //數字 一步步來。最簡單的方法,還是把整個代碼復制走了。
新建一個captcha.php:
php //10>設置session,必須處於腳本最頂部
session_start(); $image = imagecreatetruecolor(100, 30); //1>設置驗證碼圖片大小的函數
//5>設置驗證碼顏色 imagecolorallocate(int im, int red, int green, int blue);
$bgcolor = imagecolorallocate($image,255,255,255); //#ffffff
//6>區域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的區域著色,col 表示欲塗上的顏色
imagefill($image, 0, 0, $bgcolor); //10>設置變數
$captcha_code = ""; //7>生成隨機數字
for($i=0;$i<4;$i++){ //設置字體大小
$fontsize = 6;
//設置字體顏色,隨機顏色
$fontcolor = imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120)); //0-120深顏色
//設置數字
$fontcontent = rand(0,9); //10>.=連續定義變數
$captcha_code .= $fontcontent;
//設置坐標
$x = ($i*100/4)+rand(5,10); $y = rand(5,10);
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
} //10>存到session
$_SESSION['authcode'] = $captcha_code; //8>增加干擾元素,設置雪花點
for($i=0;$i<200;$i++){ //設置點的顏色,50-200顏色比數字淺,不幹擾閱讀
$pointcolor = imagecolorallocate($image,rand(50,200), rand(50,200), rand(50,200));
//imagesetpixel — 畫一個單一像素
imagesetpixel($image, rand(1,99), rand(1,29), $pointcolor);
} //9>增加干擾元素,設置橫線
for($i=0;$i<4;$i++){ //設置線的顏色
$linecolor = imagecolorallocate($image,rand(80,220), rand(80,220),rand(80,220)); //設置線,兩點一線
imageline($image,rand(1,99), rand(1,29),rand(1,99), rand(1,29),$linecolor);
} //2>設置頭部,image/png
header('Content-Type: image/png'); //3>imagepng() 建立png圖形函數
imagepng($image); //4>imagedestroy() 結束圖形函數 銷毀$image
imagedestroy($image);
接著就是靜態頁的代碼了:index.html
doctype html><html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>確認驗證碼title>
head>
<body>
<form method="post" action="./form.php">
<p>驗證碼: <img id="captcha_img" border='1' src='./captcha.php?r=echo rand(); ?>' style="width:100px; height:30px" /> <a href="javascript:void(0)" onclick="document.getElementById('captcha_img').src='./captcha.php?r='+Math.random()">換一個?a>
p>
<P>請輸入驗證碼:<input type="text" name='authcode' value=''/>p>
<p><input type='submit' value='提交' style='padding:6px 5px;'/>p>
body>html>
從index.html可以看到,提交的表單是到form.php的,所以還要有一個判斷的form.php代碼:
php header("Content-Type:text/html;charset=utf-8"); //設置頭部信息
//isset()檢測變數是否設置
if(isset($_REQUEST['authcode'])){ session_start(); //strtolower()小寫函數
if(strtolower($_REQUEST['authcode'])== $_SESSION['authcode']){ //跳轉頁面
echo "<script language=\"javascript\">"; echo "document.location=\"./form.php\""; echo "</script>";
}else{ //提示以及跳轉頁面
echo "<script language=\"javascript\">"; echo "alert('輸入錯誤!');"; echo "document.location=\"./form.php\""; echo "</script>";
} exit();
}
那麼,純數字的實現了,數字加英文的也應該不難了。要修改的代碼 只是在 captcha.php 將 //7>生成隨機數字 修改成 //7>生成隨機的字母和數字,如果你真的很可愛的就修改這幾個字就認為可以實現的話,那麼祝賀你,你永遠保持快樂。腦殘兒童歡樂多。
廢話不多說了,拉代碼吧。
php //10>設置session,必須處於腳本最頂部
session_start(); $image = imagecreatetruecolor(100, 30); //1>設置驗證碼圖片大小的函數
//5>設置驗證碼顏色 imagecolorallocate(int im, int red, int green, int blue);
$bgcolor = imagecolorallocate($image,255,255,255); //#ffffff
//6>區域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的區域著色,col 表示欲塗上的顏色
imagefill($image, 0, 0, $bgcolor); //10>設置變數
$captcha_code = ""; //7>生成隨機的字母和數字
for($i=0;$i<4;$i++){ //設置字體大小
$fontsize = 8;
//設置字體顏色,隨機顏色
$fontcolor = imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120)); //0-120深顏色
//設置需要隨機取的值,去掉容易出錯的值如0和o
$data =''; //取出值,字元串截取方法 strlen獲取字元串長度
$fontcontent = substr($data, rand(0,strlen($data)),1); //10>.=連續定義變數
$captcha_code .= $fontcontent;
//設置坐標
$x = ($i*100/4)+rand(5,10); $y = rand(5,10);
imagestring($image,$fontsize,$x,$y,$fontcontent,$fontcolor);
} //10>存到session
$_SESSION['authcode'] = $captcha_code; //8>增加干擾元素,設置雪花點
for($i=0;$i<200;$i++){ //設置點的顏色,50-200顏色比數字淺,不幹擾閱讀
$pointcolor = imagecolorallocate($image,rand(50,200), rand(50,200), rand(50,200));
//imagesetpixel — 畫一個單一像素
imagesetpixel($image, rand(1,99), rand(1,29), $pointcolor);
} //9>增加干擾元素,設置橫線
for($i=0;$i<4;$i++){ //設置線的顏色
$linecolor = imagecolorallocate($image,rand(80,220), rand(80,220),rand(80,220)); //設置線,兩點一線
imageline($image,rand(1,99), rand(1,29),rand(1,99), rand(1,29),$linecolor);
} //2>設置頭部,image/png
header('Content-Type: image/png'); //3>imagepng() 建立png圖形函數
imagepng($image); //4>imagedestroy() 結束圖形函數 銷毀$image
imagedestroy($image);
其他的兩個頁面,不許要修改。
一般而言,現在就已經夠用了。但是就像動漫一樣,總會有番外。
那麼,我們來個漢字的番外吧。其實我也准備將漢字的驗證碼放到我的畢業設計裡面,雖然現在很流行滑動驗證碼,但是本人畢竟不是專門學習js的。
而且,還可以和答辯的老師說,我們驗證碼不需要素材,連圖片也是生成的,用自己的知識裝13,也沒有設么的。
php //11>設置session,必須處於腳本最頂部
session_start(); //1>設置驗證碼圖片大小的函數
$image = imagecreatetruecolor(200, 60);
//5>設置驗證碼顏色 imagecolorallocate(int im, int red, int green, int blue);
$bgcolor = imagecolorallocate($image,255,255,255); //#ffffff
//6>區域填充 int imagefill(int im, int x, int y, int col) (x,y) 所在的區域著色,col 表示欲塗上的顏色
imagefill($image, 0, 0, $bgcolor); //7>設置ttf字體
$fontface = 'FZYTK.TTF'; //7>設置字型檔,實現簡單的數字儲備
$str='天地不仁以萬物為芻狗聖人不仁以百姓為芻狗這句經常出現在控訴暴君暴政上地殘暴不仁把萬物都當成低賤的豬狗來看待而那些高高在上的所謂聖人們也沒兩樣還不是把我們老百姓也當成豬狗不如的東西但實在正取的解讀是地不情感用事對萬物一視同仁聖人不情感用事對百姓一視同仁執子之手與子偕老當男女主人公含情脈脈看著對方說了句執子之手與子偕老女方淚眼朦朧含羞地回一句討厭啦這樣的情節我們是不是見過很多但是我們來看看這句的原句死生契闊與子成說執子之手與子偕老於嗟闊兮不我活兮於嗟洵兮不我信兮意思是說戰士之間的約定說要一起死現在和我約定的人都走了我怎麼活啊赤裸裸的兄弟江湖戰友友誼啊形容好基友的基情比男女之間的愛情要合適很多吧'; //str_split()切割字元串為一個數組,一個中文在utf_8為3個字元
$strdb = str_split($str,3);
//>11
$captcha_code = ''; //8>生成隨機的漢子
for($i=0;$i<4;$i++){ //設置字體顏色,隨機顏色
$fontcolor = imagecolorallocate($image, rand(0,120),rand(0,120), rand(0,120)); //0-120深顏色
//隨機選取中文
$in = rand(0,count($strdb)); $cn = $strdb[$in]; //將中文記錄到將保存到session的字元串中
$captcha_code .= $cn; /*imagettftext (resource $image ,float $size ,float $angle ,int $x ,int $y,int $color,
string $fontfile ,string $text ) 幕布 ,尺寸,角度,坐標,顏色,字體路徑,文本字元串
mt_rand()生成更好的隨機數,比rand()快四倍*/
imagettftext($image, mt_rand(20,24),mt_rand(-60,60),(40*$i+20),mt_rand(30,35),$fontcolor,$fontface,$cn);
} //11>存到session
$_SESSION['authcode'] = $captcha_code; //9>增加干擾元素,設置點
for($i=0;$i<200;$i++){ //設置點的顏色,50-200顏色比數字淺,不幹擾閱讀
$pointcolor = imagecolorallocate($image,rand(50,200), rand(50,200), rand(50,200));
//imagesetpixel — 畫一個單一像素
imagesetpixel($image, rand(1,199), rand(1,59), $pointcolor);
} //10>增加干擾元素,設置線
for($i=0;$i<4;$i++){ //設置線的顏色
$linecolor = imagecolorallocate($image,rand(80,220), rand(80,220),rand(80,220)); //設置線,兩點一線
imageline($image,rand(1,199), rand(1,59),rand(1,199), rand(1,59),$linecolor);
} //2>設置頭部,image/png
header('Content-Type: image/png'); //3>imagepng() 建立png圖形函數
imagepng($image); //4>imagedestroy() 結束圖形函數 銷毀$image
imagedestroy($image);
其他的頁面也是不需要修改的。
效果圖如下: