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 編輯
$ S" u' e" u9 Y+ I  T  \( b1 D; @4 A% ^1 C) b. C  B
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:

' `( J! Y- g( D& L' A' z- N
  1. rpm -qa | grep php-mcrypt
複製代碼

: @* x1 A8 p$ U0 h或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
9 G  E* g- H" n+ E4 D' G3 i
  1. <?php7 j$ e' j. d) L" Y) F, x. v1 C
  2. // Show all information, defaults to INFO_ALL7 q" J& K6 X: o2 M# w- A6 A
  3. phpinfo();
    ; w7 d& [+ V5 L/ k2 g6 n4 T
  4. ?>
複製代碼

7 S' Z- i! [# J- a3 }然後於browser 執行phpinfo.php,結果如下:

) t" r$ C9 Q2 ]. P! Z, B/ |  u

$ T5 {2 z& i4 z

  }% ~7 z( u7 t4 @) C6 _
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:
9 A% z3 B8 W6 H, m
  1. //加密函數撰寫- J& ?, ?0 w2 B( p$ Q6 \
  2. function encrypt($source,$toencrypt){  
    ) b5 Z5 o: u1 G* E
  3. //加密用的key   , m7 V, e9 o# F! p/ o5 H
  4. $key = $source;  
    ) X* E5 c1 [  c% h: R" z$ T% n6 K
  5. //使用3DES方法加密   
    9 I& R) |# Y, s' d* S4 A; q8 D
  6. $encryptMethod = MCRYPT_TRIPLEDES; , L' i* J' T0 U
  7. //初始化向量來增加安全性
    ; ~$ k+ j, b/ h, V; W
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    ) \& P0 Z# g! J, E* e
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式+ L1 B! V) W: l9 B+ B8 D# F
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   3 M0 X8 D  k4 U8 k( o. {
  11. //回傳解密後字串& I8 ?9 O/ u4 G. F7 \' Q
  12. return base64_encode($encrypted_toencrypt);  6 M; }3 d/ r! P! L( ]9 O3 b
  13. }  4 U$ p* {: `: A5 m/ ?
  14. //解密函數撰寫7 W: ]  q4 T( V" \# `- G
  15. function decrypt($source,$todecrypt) {  $ s8 X* p1 r# Y8 _
  16. //解密用的key,必須跟加密用的key一樣   
    8 u' R4 F/ @1 ?/ X$ y3 z- H
  17. $key = $source;    f! E6 P7 H2 [! z
  18. //解密前先解開base64碼) |: k4 a5 i* P! U
  19. $todecrypt = base64_decode($todecrypt);: d2 |& B# `+ w. N; j
  20. //使用3DES方法解密; m5 ?. @% C$ X! U( J
  21. $encryptMethod = MCRYPT_TRIPLEDES;  , Q( m, O: d% b; h/ d
  22. //初始化向量來增加安全性
    $ _/ ]  }; `7 P
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    / h% Z, v5 h; u/ B8 S( \7 r
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  
    ; {8 z2 U0 t' r4 X
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);8 ~0 r* x! Y2 a) W. m6 X+ Z& r8 w
  26. //回傳解密後字串; N% M. ~* Z# ~( _+ S8 D8 j4 r
  27. return $decrypted_todecrypt;  
    , E* x, L- I4 e# S+ a+ a+ c
  28. }  1 H* r7 r+ g3 k. `3 g8 Z
  29. //寫好加解密的函數之後,就可以來進行測試了
    6 B$ m, j6 m) J
  30. //key設定* Z3 Y% x; u" H6 p: K7 _1 Q2 [
  31. $source ="1234567890";$ ]7 L# o' z; E2 Y2 z% M: A
  32. //要加密的字串, u9 o$ @& f" R& _) {
  33. $string ="www.av4u.co";" b; I' y3 p( Z7 m7 i
  34. echo "string=".$string."<br>";" K: t5 p# A( A/ l! O
  35. //進行加密並顯示加密後的字串0 ^. j( U1 R- J& J+ K
  36. $encode = encrypt($source,$string);
    ! X/ I# t: j0 i* U  H; v
  37. echo "encode=".$encode."<br>";6 |) G' ]4 Z' X7 x6 E* F! d4 m. g
  38. //進行解密並顯示解密後的字串3 ^# M( k8 U+ i2 \
  39. $decode = decrypt($source,$encode);
    # C0 [! r- e* c1 `( a" L
  40. echo "decode=".$decode."<br>";
複製代碼

3 `: G) J$ m$ P. X7 K9 ^
結果如下:

$ q. E7 W) `8 r# {
# m# l- v7 f, }7 d- F$ `
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:

/ F6 E# ?. z/ i, ~" `





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