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 編輯 % ^4 r$ C2 P8 M! _4 N) {, ^/ |8 L- v
: C! X5 `7 R' d" s: i
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:

* V, W7 ~6 c$ f$ z& w3 I
  1. rpm -qa | grep php-mcrypt
複製代碼

  z3 K! k. O5 T; t3 @或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
& O5 a2 `) k- n7 c
  1. <?php
    ( V9 Z: v1 h- u+ j, ]+ d
  2. // Show all information, defaults to INFO_ALL7 I* l$ f0 u! v. N( X2 q. T
  3. phpinfo();
    , |$ G$ z3 O) Z
  4. ?>
複製代碼

8 M: M( z9 U2 }3 z# }4 f( o8 p然後於browser 執行phpinfo.php,結果如下:
- i' M" X( c; k: z" Z
2 v: e" Z* ^0 [( H" t

: _# h) N! M8 h7 S# \
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:
2 p: ~  }6 _/ W; Q3 G5 A5 v. x" R6 Z
  1. //加密函數撰寫
    1 X0 p) f4 n5 ?3 R9 B5 r
  2. function encrypt($source,$toencrypt){  
    1 U/ g  [3 g4 H3 R8 C
  3. //加密用的key   
    0 z6 x: w& [" O
  4. $key = $source;  . ?; n7 h0 {, |
  5. //使用3DES方法加密   
    9 f- u1 s; ?5 c: C4 a) T5 P" e
  6. $encryptMethod = MCRYPT_TRIPLEDES;
    . Q. E: Z1 B; l- w) X0 x3 A: p
  7. //初始化向量來增加安全性$ _" M6 ~3 N  g! l* }0 T; g2 ?
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  ! ~4 j* h. c9 t' W
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式
    ' D1 W) _, I! V8 x2 Q$ d) S- v% \5 W
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   % W0 [/ y: {. n8 P; t3 x
  11. //回傳解密後字串
    + n: R6 ~& V$ o/ f$ V
  12. return base64_encode($encrypted_toencrypt);  
    " r/ {4 Q1 ?0 [, s% J
  13. }  & v# X+ p6 z5 d8 e; g' K. \. u
  14. //解密函數撰寫
    7 V( p3 S5 p" \- h1 w( d
  15. function decrypt($source,$todecrypt) {  
    % J/ j5 F+ Q( `* ]1 D6 Q- @
  16. //解密用的key,必須跟加密用的key一樣   
    7 A4 s& U; A$ ~# G3 g
  17. $key = $source;  6 F) q2 {: Q3 h) x6 o: ^
  18. //解密前先解開base64碼
    6 v5 j9 S6 `, K; U2 _. N; Z2 u2 C
  19. $todecrypt = base64_decode($todecrypt);
    & F- Q+ R) ]$ e  p+ m
  20. //使用3DES方法解密+ Y8 k, v2 f1 O" y% U: Q
  21. $encryptMethod = MCRYPT_TRIPLEDES;  
    4 L4 I/ b) a9 x) _
  22. //初始化向量來增加安全性 9 ]( d" @1 |6 p9 M) V
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    - ?. h+ i5 w5 s5 `0 z! i7 `8 U
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  
    & {; d: S, s8 _
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);7 }  H$ k2 U3 W/ R( |; U
  26. //回傳解密後字串  D/ o! V: v( v2 ]- p8 D
  27. return $decrypted_todecrypt;  7 m9 d3 h( n3 S; K- w: {" h" a8 ^
  28. }  3 f0 t- m( J2 k6 s# r. ~
  29. //寫好加解密的函數之後,就可以來進行測試了
    & D) b" l. u! |) c( U
  30. //key設定* i! x1 c' X! j( t/ o
  31. $source ="1234567890";& g* D: \0 h! s# f+ H- A* J+ Y
  32. //要加密的字串
    3 c' [2 }+ G: P. K) Q; D1 `/ ?$ o
  33. $string ="www.av4u.co";# q8 @0 o5 r& F; F& F
  34. echo "string=".$string."<br>";
    & j9 U# x$ h; w/ o4 n
  35. //進行加密並顯示加密後的字串
    ) W' O; ^+ o+ O) K7 V" \0 Y& T2 h
  36. $encode = encrypt($source,$string);
    ! M" U# v" }1 T
  37. echo "encode=".$encode."<br>";
    6 Q" T* U- f. U/ e: D# G9 i
  38. //進行解密並顯示解密後的字串
    - O" n, _; e, G. o; O) Q2 S
  39. $decode = decrypt($source,$encode);2 f4 j. D- D) M: u% n
  40. echo "decode=".$decode."<br>";
複製代碼

) z( [4 t7 A; A$ d8 k+ m4 L/ o+ ~  x
結果如下:
9 `- z- p! I3 f4 {8 k: g9 v

  ~& y7 e. a  d/ o' v0 q
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
% z5 s. n6 _, S





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