52AV手機A片王|52AV.ONE

標題: Linux下以PHP撰寫 3DES(mcrypt) 加密方法(ECB模式) [打印本頁]

作者: IT_man    時間: 2014-12-11 21:02
標題: Linux下以PHP撰寫 3DES(mcrypt) 加密方法(ECB模式)
本帖最後由 IT_man 於 2014-12-11 22:31 編輯 5 W$ p5 i1 B& ]
5 ^$ _. B* D- ~) q* _
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:
/ p8 c$ w' e1 A
  1. rpm -qa | grep php-mcrypt
複製代碼

5 @* Q3 v* r, H9 Y# I或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module

; {' W: C9 N6 m: M) S+ w
  1. <?php
    7 l8 c- B  p4 X) x' Y3 H0 q1 L
  2. // Show all information, defaults to INFO_ALL
    + s& k' \, i4 q8 T% ?
  3. phpinfo();
    1 y/ V' z, ?3 A+ D1 e8 e$ O1 {" p
  4. ?>
複製代碼
7 T/ @& i( h, v. [
然後於browser 執行phpinfo.php,結果如下:
+ a8 V/ E2 l1 F. s& W" _

! G6 ~8 f6 F) [  `4 D
* V& Z. w2 R3 R9 s# C/ C4 c
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:

6 S: t& w8 L- G8 @. W
  1. //加密函數撰寫
    , g3 }2 Y2 n# K, c5 b
  2. function encrypt($source,$toencrypt){  
    1 U) N* Y( [) G2 I# D
  3. //加密用的key   
    ! t3 k  w5 t6 ]5 z% p. R
  4. $key = $source;  ) K' Z; m% f  P/ B& X6 M3 X8 d3 m
  5. //使用3DES方法加密   ' ~! I8 J+ @7 U; W* Q6 i
  6. $encryptMethod = MCRYPT_TRIPLEDES;
    5 Y6 P! b/ L6 L! p9 A
  7. //初始化向量來增加安全性& O9 g/ B+ Z" l* V  Z6 T2 I9 z
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  9 f* A/ V9 i) E) b. ~3 a6 h: i
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式, t0 E  G+ w6 L5 i: ?. r6 Y
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   ! a, ?0 u1 g; V5 l, G* ?- ^4 _* u
  11. //回傳解密後字串
    ' F1 T4 d4 q* o0 s4 I. n6 a' E" ^
  12. return base64_encode($encrypted_toencrypt);  
    & v* U6 x# e+ Y& L2 _4 ^: q* P
  13. }  # B9 t& q& M( V8 r  G8 m
  14. //解密函數撰寫8 R7 }$ o  V; D. u; B- _* H: a
  15. function decrypt($source,$todecrypt) {  
    * Y+ M$ F4 h$ q- ~# g3 Q
  16. //解密用的key,必須跟加密用的key一樣   
    6 v1 \" u3 B- ]
  17. $key = $source;  5 ^3 ^& s; B! L% Q+ U. l$ E1 y
  18. //解密前先解開base64碼, N% {/ |& u, V' E/ t; F# d
  19. $todecrypt = base64_decode($todecrypt);% _) z8 d: }( I
  20. //使用3DES方法解密0 S7 c4 l, ]* s4 Q  t- Z+ T
  21. $encryptMethod = MCRYPT_TRIPLEDES;  
    0 `4 b. x1 E* K1 r* H1 E+ i
  22. //初始化向量來增加安全性 0 ]. t" d6 x4 W# R" P/ V) e6 S
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    : {2 S1 |8 B. [( v& J- y
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  ! n/ p0 L7 e# @! G% X% I' W
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);
    ) a5 x, e! {; p. e& o5 g  U2 G: s" m& M
  26. //回傳解密後字串0 k. ]& h, [4 y1 N+ V! H
  27. return $decrypted_todecrypt;  
    ! u( w+ [# e" V3 H4 e
  28. }  7 w% w8 Z1 ~5 v3 N' n0 c
  29. //寫好加解密的函數之後,就可以來進行測試了7 v; I0 C2 o6 ?) K
  30. //key設定
    / D8 E$ q8 R5 B" C; a
  31. $source ="1234567890";
    0 l% p" f  r2 \$ u( k' {! }
  32. //要加密的字串
    9 s  m5 u$ u7 X4 o" V# Y# V' f
  33. $string ="www.av4u.co";  f- [& v' ?# G7 J% G9 z: o1 k
  34. echo "string=".$string."<br>";+ c  ]$ |6 J& R% h4 P
  35. //進行加密並顯示加密後的字串& l$ E% {7 F9 H: Z; s
  36. $encode = encrypt($source,$string);& `* Z2 O% X# e) H
  37. echo "encode=".$encode."<br>";7 J8 Y+ J) `8 O: i2 @4 F& ^
  38. //進行解密並顯示解密後的字串
    ; a0 o/ H% u1 J/ j' U5 S
  39. $decode = decrypt($source,$encode);/ U" |8 P! @& D1 K
  40. echo "decode=".$decode."<br>";
複製代碼
% G1 k6 C: C8 e4 ^0 E
結果如下:
8 _# k1 G: f/ o+ k3 t! U: N

$ }; m: f* z* j9 Y6 g0 @3 B
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:

1 y  J0 \6 u0 u8 Q





歡迎光臨 52AV手機A片王|52AV.ONE (https://www.52av.one/) Powered by Discuz! X3.2