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 編輯
+ k, E3 ]- T5 H' Q% r( \( F( Z6 J* d5 h
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:
0 [+ j  n+ V+ X' ~* V
  1. rpm -qa | grep php-mcrypt
複製代碼
& ~' E' ?- ^1 t, q# A
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
! Y  ]% y/ w' l& \
  1. <?php- Z4 G$ u+ L# b" t4 u
  2. // Show all information, defaults to INFO_ALL; r$ K/ Z; Q" q" `3 S+ A
  3. phpinfo();
    ( _/ R: Y$ O9 p: @9 L# n4 e! u
  4. ?>
複製代碼
+ m7 ~0 a* b& D% |* O$ H  |" F
然後於browser 執行phpinfo.php,結果如下:

1 W; E' |* z8 U
7 P( a0 Z) \! o% j

" G& ^  X! k" D+ A5 m* A
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:
* {2 Q8 q3 u- R* W$ j2 t
  1. //加密函數撰寫& B: m: z% C3 F. r
  2. function encrypt($source,$toencrypt){  : S- `( S9 J4 _! i
  3. //加密用的key   7 }5 b3 _* e' ]9 F
  4. $key = $source;  8 s, r: w$ L6 y. ~: J2 [; R
  5. //使用3DES方法加密   
    ' n$ a+ a+ j( b! o4 R
  6. $encryptMethod = MCRYPT_TRIPLEDES;
    + W. r/ [! @6 Q: T! a
  7. //初始化向量來增加安全性0 `' n; |! Z7 X
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  # W) o9 h# o, t
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式; X, w5 r0 f) E% u
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   # V6 J) S; k+ t* C
  11. //回傳解密後字串
    1 C: ?5 y$ s$ \+ ^' _& z8 x8 z4 R
  12. return base64_encode($encrypted_toencrypt);  / |' [8 a4 R8 [" Y% r$ c; M
  13. }  3 Q' x2 J( O/ K  b; i) N
  14. //解密函數撰寫
    # O: P; o' u- S
  15. function decrypt($source,$todecrypt) {  
    ' Q  K* H# g7 h# x0 B+ g
  16. //解密用的key,必須跟加密用的key一樣   ; J- `& ~* @$ L$ w0 O/ }: ~/ W
  17. $key = $source;  0 h3 Y# J! ^! Y! C+ y* }: R& S
  18. //解密前先解開base64碼
    $ B* i2 N  y0 o  A6 v( Z0 Z* a
  19. $todecrypt = base64_decode($todecrypt);8 v; b7 X7 S" C% `
  20. //使用3DES方法解密; X" l; S( k5 D
  21. $encryptMethod = MCRYPT_TRIPLEDES;  - {5 u1 y- @* n
  22. //初始化向量來增加安全性
    2 s& @+ F& J2 D+ d6 H1 M, X
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    % w, `0 f1 O; x3 g$ T9 P) Y+ ^( D) |9 ~6 ^
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式    a$ Y' H# W# S: b' [# E3 P- f
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);
    : A( a( s6 D2 s  ^+ C
  26. //回傳解密後字串. b7 {% G; v9 [2 c
  27. return $decrypted_todecrypt;  9 X( Z+ c$ c# k2 j8 A/ I
  28. }  1 ~/ T! S0 Q% _  G2 K& J
  29. //寫好加解密的函數之後,就可以來進行測試了
    5 J9 M/ H2 x7 w  y( `
  30. //key設定. l1 x" Z8 R4 M, M
  31. $source ="1234567890";
    2 l6 ]# i* t( Y5 y  T& \4 h1 Y
  32. //要加密的字串
    . V( o4 j" \8 ~# w6 T0 [8 i& I3 |
  33. $string ="www.av4u.co";- G! `0 _: j: g9 w  i/ {
  34. echo "string=".$string."<br>";
    ; r" w, V, q. K; U+ X4 L
  35. //進行加密並顯示加密後的字串
    $ ~/ K/ R4 Q# r
  36. $encode = encrypt($source,$string);# I' `1 P! p& Q4 Q8 ^3 o# t
  37. echo "encode=".$encode."<br>";5 C! t6 d+ }* k/ a8 \; O
  38. //進行解密並顯示解密後的字串1 P7 g/ T" i8 {: z
  39. $decode = decrypt($source,$encode);5 f$ E0 E' K; j5 I
  40. echo "decode=".$decode."<br>";
複製代碼

! ^; [5 k8 E9 Z* M
結果如下:
: b7 @5 {4 f- [: A/ q( u( f* F/ B

( }6 y; Z% q# n# M7 K" Q
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:

5 s' b3 y! R  M





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