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 編輯
3 M2 Y2 \) ^6 a' @+ w- X
$ _+ _+ v2 b/ s& {* E$ L/ E
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:

) S) ^; J4 J2 C- a
  1. rpm -qa | grep php-mcrypt
複製代碼

0 k/ K6 K- V4 `* R或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module

& J  P, A" Y7 o& t- V2 Y
  1. <?php. B( U0 M) j0 ]& i- j$ r5 n9 T: J1 T
  2. // Show all information, defaults to INFO_ALL
    9 D0 H1 G# }, b+ K7 l1 `8 @
  3. phpinfo();
    5 R2 y- Q- G3 I, A% d
  4. ?>
複製代碼
% x3 y9 f' p0 |/ a4 L$ t8 L& F
然後於browser 執行phpinfo.php,結果如下:

1 [: e$ O# e, K, d  L
( _( M7 k: T+ F% B2 U- p5 h
; X. Y& T4 @; ?; @4 N+ M
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:
' H& Y) n* C1 Q& P+ {" c5 w# C  X# v
  1. //加密函數撰寫- {  {1 J' V, u3 A* t5 t
  2. function encrypt($source,$toencrypt){  
    2 M! e' i7 [* ^( v
  3. //加密用的key   0 r$ V+ G: z/ ?
  4. $key = $source;  % s" S5 f3 w+ C, m6 U" H
  5. //使用3DES方法加密   
    4 c( |6 x/ S- P, [) g. z3 J! r4 f( c
  6. $encryptMethod = MCRYPT_TRIPLEDES; * N: J8 b5 d$ v
  7. //初始化向量來增加安全性
    5 Z5 q  H, s) J5 V% u# {
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  % }# s5 ?  L5 o4 q
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式
    ' N# T* u- s- G
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   , e9 s8 m+ E, G0 x, v, c$ b  U
  11. //回傳解密後字串2 V  t" `: W/ p# f
  12. return base64_encode($encrypted_toencrypt);  : P- c! ^" S. r9 p4 U3 [7 u
  13. }  
    : {+ Q& j$ X% i: t) w( Y% c
  14. //解密函數撰寫$ ~4 ^# Z* p- X+ B
  15. function decrypt($source,$todecrypt) {  
    . h: g5 b- p- {: z9 d5 h
  16. //解密用的key,必須跟加密用的key一樣   
    $ H& L! Z# ^( U- c# ~! e3 A& K, W, J
  17. $key = $source;  
    ' i% h5 O7 a2 \/ M1 }+ G; R
  18. //解密前先解開base64碼
    - ]6 @9 R& l( ?. l' [5 ]
  19. $todecrypt = base64_decode($todecrypt);
    8 e$ C+ V& ?' C. e! R
  20. //使用3DES方法解密
    + e- p) G2 c7 X( b6 T) p) t9 ?
  21. $encryptMethod = MCRYPT_TRIPLEDES;  
    " f+ W/ a* P- Z+ {+ F/ W. K, s  _2 d
  22. //初始化向量來增加安全性 2 G% |6 z6 _( B7 [) J
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  ; W' c5 u: Z0 ~
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  
    1 k" y5 s" i1 U0 O, u6 C/ K
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);$ s5 ?! P4 G% p$ l3 C. m
  26. //回傳解密後字串$ ?/ o; G  ?, n1 k/ K
  27. return $decrypted_todecrypt;  6 |+ B" u$ V" l" v0 {; r: U
  28. }  
    ( D9 D' }1 Z2 [7 @, I
  29. //寫好加解密的函數之後,就可以來進行測試了1 h: e" f" @+ _) `+ {- `5 y, G
  30. //key設定
    3 D* I" p( N5 I. @1 U
  31. $source ="1234567890";8 H- h) m- |4 u- L) ?/ v& {
  32. //要加密的字串4 M9 C' D+ D7 ]0 H, y' m
  33. $string ="www.av4u.co";& v1 r+ m2 t3 o4 ?$ [- T
  34. echo "string=".$string."<br>";( c5 x* v9 I, Z* x$ ~( Z3 @. }6 _/ c& Y
  35. //進行加密並顯示加密後的字串- s5 A* J8 R+ w7 f9 b
  36. $encode = encrypt($source,$string);6 U6 E4 L! l  q; E- r8 }' g! h0 a  ?
  37. echo "encode=".$encode."<br>";+ J  s( c) I3 Q0 G) A, s9 ?
  38. //進行解密並顯示解密後的字串( B9 _, t% M; t9 f- e8 |
  39. $decode = decrypt($source,$encode);3 o" v7 L3 I8 v% T& ~% z
  40. echo "decode=".$decode."<br>";
複製代碼

4 B7 u  t! P7 Q7 @/ Z( y3 @6 w
結果如下:

+ x: r0 J; r" Q$ l  e6 _; ^
% |! {& ]* O/ M; D
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:

2 k% O. v  U/ L$ L9 P- Y





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