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 編輯 ) `! t8 w# i3 z3 ~  Z5 p

2 E: ~0 z3 @, x
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:
6 D- b5 v5 H; X/ I+ u3 t3 e4 O
  1. rpm -qa | grep php-mcrypt
複製代碼
! r! y1 K& Q) I+ x' {& d
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
0 J& _. w2 N# o* W/ ?1 V
  1. <?php
    # L' ]6 d( p5 l2 O8 C3 D  z
  2. // Show all information, defaults to INFO_ALL" M& j5 i* h& n
  3. phpinfo();
    - N) a: A* @7 p$ u+ v
  4. ?>
複製代碼
( [: M1 U; X# w. |7 E& L9 Z
然後於browser 執行phpinfo.php,結果如下:
7 ?! V2 U' J+ i! w) B( O) u% ^5 W

- L, U7 {. a$ o$ D
5 L, j6 j) }+ I9 V4 L! \2 I
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:
6 o" R. J7 z( }1 x  Y- @/ X* F
  1. //加密函數撰寫. Q+ q/ ^9 n8 m* s
  2. function encrypt($source,$toencrypt){  
    2 C* l+ l+ @+ B* c# U
  3. //加密用的key   % l! }" P  J- g- d: R0 w
  4. $key = $source;    M; m3 d0 l* q: b  M
  5. //使用3DES方法加密   
    + n; |$ F0 y  c
  6. $encryptMethod = MCRYPT_TRIPLEDES;
    & h: W! U% b- l7 q' S
  7. //初始化向量來增加安全性
    " z0 s2 m& Q& Y2 C( M
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  ) Q6 o+ b5 W; a" C
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式* a6 l0 T, |5 P( T- G3 J
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   
    8 a+ N, e0 u* f* v7 U% D3 y# ~1 l  e
  11. //回傳解密後字串
      o  l0 U  {9 r4 m# B; Q
  12. return base64_encode($encrypted_toencrypt);  . X1 y1 x; |5 M, o2 Z+ i' O8 L
  13. }  
    7 ]9 v7 I3 b' p; x' G
  14. //解密函數撰寫
    0 a6 B1 [( w/ i- P
  15. function decrypt($source,$todecrypt) {  
    ) [1 I- N8 d1 {6 {, p1 F! D
  16. //解密用的key,必須跟加密用的key一樣   
    , V9 {7 T) a# T/ x# D
  17. $key = $source;  
    # D; }+ t" s  j: y! z4 D
  18. //解密前先解開base64碼  ]1 d4 ?5 }& x/ N3 X$ A% O
  19. $todecrypt = base64_decode($todecrypt);1 H4 x' h7 r( a+ S! o
  20. //使用3DES方法解密
    4 I% u" D. O3 }) F6 ]. y
  21. $encryptMethod = MCRYPT_TRIPLEDES;  
    2 N) D9 ]1 `1 H) D1 m4 ], p; K
  22. //初始化向量來增加安全性 4 @4 z% S% w. T# ^  B0 r$ m
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    / l$ X1 ^  g9 e
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  5 \" p' k/ @0 B& v8 H
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);
    $ W5 B. w8 ~: {- k* U! J
  26. //回傳解密後字串
    " k- R% Z- W; Q, @- }2 ^/ b
  27. return $decrypted_todecrypt;  
    4 N  x) E5 @# ?  n1 m2 N( C, t1 O9 O
  28. }  ( I  v! ?( I1 o7 ~
  29. //寫好加解密的函數之後,就可以來進行測試了$ F$ a2 f" M/ Y  g
  30. //key設定5 T* r3 O3 ?$ r8 i5 j) `
  31. $source ="1234567890";+ k' y6 y4 |4 o3 ?
  32. //要加密的字串% C% O- l+ q7 P5 p+ b% `8 ]
  33. $string ="www.av4u.co";; X7 G% |- ?! C! D: {
  34. echo "string=".$string."<br>";5 r6 Z" }* r! _5 _6 C
  35. //進行加密並顯示加密後的字串
    0 T: w, w5 ^1 `- R
  36. $encode = encrypt($source,$string);# m3 f( s8 Q) f
  37. echo "encode=".$encode."<br>";& c2 I, E7 d- M  J
  38. //進行解密並顯示解密後的字串( P" `, W: ?, r( i. j
  39. $decode = decrypt($source,$encode);
    0 w0 l3 k: u# L  D& b% G' n
  40. echo "decode=".$decode."<br>";
複製代碼
' c0 B1 @8 q. N
結果如下:

. e  R, y* ]/ r5 B" w6 {- u) L

" }3 x! V& Y8 C+ h9 x
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
8 }8 F7 P# }  f! [+ w





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