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 編輯 $ g) A, E. F- i$ b( B% f2 w# D$ V

6 \: y1 ?5 U; g' Z+ k& Y7 N. h, j
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:

7 m- T) n/ A+ |$ l' s. ^. \* C
  1. rpm -qa | grep php-mcrypt
複製代碼
" n$ R' [" E2 l5 q
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module

7 ~) D9 e" k  [3 B) |1 Z7 x+ [1 I4 l
  1. <?php6 x  C! A- W2 O# @* p5 Z
  2. // Show all information, defaults to INFO_ALL, E2 ?' {, c8 K" D5 n& W
  3. phpinfo();
    ! h) k' a+ n  I! N' `" o$ {
  4. ?>
複製代碼
5 D" C, A) p$ v
然後於browser 執行phpinfo.php,結果如下:
6 q1 m; }% ~& Q; D; ~- r' N
* k, d( Z- w1 ~
( `. ?# Z* B. F% Y7 n, d
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:

$ w, I: k1 @: Q3 C: F2 T9 H! {
  1. //加密函數撰寫
    3 l/ `; L' P( U9 B9 O
  2. function encrypt($source,$toencrypt){  
    % t2 Y$ G. J6 @: y
  3. //加密用的key   
    9 L  p$ b) ]2 x' B3 J* c& m
  4. $key = $source;  ; n2 n$ p4 v+ D) }* d$ |% b
  5. //使用3DES方法加密   ; I1 x- P( B- W6 v4 s4 \
  6. $encryptMethod = MCRYPT_TRIPLEDES; " Z* t# h" e2 F
  7. //初始化向量來增加安全性; n+ w1 P( p9 o' d2 ]
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    ( F' A! O' r1 M$ E6 w
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式; p0 B% Y6 @1 ^. N6 {, ~9 k
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   9 Q. U; z* m0 `6 \8 A
  11. //回傳解密後字串
    - u7 R+ i5 L' G( {$ d) u! J( D& [
  12. return base64_encode($encrypted_toencrypt);  
    ! A" x3 u, Z) l& J- q
  13. }  - C, ]1 G/ L: f) Z4 x7 v0 {  f% C
  14. //解密函數撰寫
    8 D1 a8 [% ~+ C  g) e% `& O7 w
  15. function decrypt($source,$todecrypt) {  4 V: a  M# _3 R8 E' g# O
  16. //解密用的key,必須跟加密用的key一樣   7 O1 L; ~! }# [( n/ k( W' S9 o
  17. $key = $source;  , e1 {6 v" ?  }& S
  18. //解密前先解開base64碼
    / b) h. _$ w  c4 S. T5 o+ T
  19. $todecrypt = base64_decode($todecrypt);  G6 R: S% S$ E. n
  20. //使用3DES方法解密$ T+ ]4 a3 p$ [8 e# s
  21. $encryptMethod = MCRYPT_TRIPLEDES;  
    & {5 x, n9 U( h* n4 b3 F
  22. //初始化向量來增加安全性 : M' N1 m# L+ ^* Z: m
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    3 N0 A* a( Y1 H, V' y) @
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  ) X# H5 n3 g( Y. M  w( p7 a# s
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);9 j& U# Y' R% @1 }
  26. //回傳解密後字串
    8 X# N8 P. e7 |% d$ t
  27. return $decrypted_todecrypt;  7 T; y6 u& k! O* U) J* \$ c
  28. }  7 K$ F# @* X( B! O4 N
  29. //寫好加解密的函數之後,就可以來進行測試了
    8 |6 l+ P  A5 M* l
  30. //key設定
    ; T4 O8 \5 V; K7 Y" @: g. o3 k4 T
  31. $source ="1234567890";# Q2 y& u' M, \
  32. //要加密的字串! P4 z- X' Z6 X  ]
  33. $string ="www.av4u.co";
    % \- t' b) ?* i3 G3 j
  34. echo "string=".$string."<br>";' r4 \0 N0 L8 |6 I. K! i+ O) A
  35. //進行加密並顯示加密後的字串, q% r. e. l* V
  36. $encode = encrypt($source,$string);) J3 p+ e# c* W% g
  37. echo "encode=".$encode."<br>";& z$ C4 C$ u3 b; z9 t4 _% {$ ]2 ?
  38. //進行解密並顯示解密後的字串6 S; Q; S3 W# g# V% V; f& h
  39. $decode = decrypt($source,$encode);
    ! _0 D1 N9 [9 h
  40. echo "decode=".$decode."<br>";
複製代碼
/ p( f/ y# ^4 ]: [; f
結果如下:

+ ?; O6 b0 h4 w: ]& a7 ^2 }
, u& u  H6 c9 g$ Y; m; N
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:

! A% z4 L5 n# S





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