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 編輯
) D1 l* \. r1 E1 Y7 V- ~! @& }+ a7 Q" Z  q! M. V) R  X
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:
% O7 H* w  l: B4 j5 a3 z0 j
  1. rpm -qa | grep php-mcrypt
複製代碼

* \1 S. x5 I( P( U0 ^! L或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module

; e* U+ T: d' s, n* b
  1. <?php
    6 s- y8 n. V0 X# J% U8 u* c
  2. // Show all information, defaults to INFO_ALL
    ; ^1 D% q; n# k! R' Y" ?
  3. phpinfo();
    9 g; i3 |3 j" m; c& Q" |) t* o( m
  4. ?>
複製代碼

& |2 G' \# G- w9 W然後於browser 執行phpinfo.php,結果如下:
6 L# t! ]+ i5 J& u- X
  L  e1 C6 P: X! j

$ E* O/ z! V* T6 I/ Z4 [8 x
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:
7 e* C( V5 L! s9 F
  1. //加密函數撰寫2 c$ Z. m1 d1 F, X
  2. function encrypt($source,$toencrypt){  * q$ P; l  p( w' Y7 z
  3. //加密用的key   . I" l% _3 J  I% t
  4. $key = $source;  
    4 A2 g( I7 Q! `, G
  5. //使用3DES方法加密   
    5 ]  ^; X+ j: j! \9 d2 [$ ?4 Z
  6. $encryptMethod = MCRYPT_TRIPLEDES;
    ) `, d- x' \& K5 W2 O
  7. //初始化向量來增加安全性
    ( }7 h' Z$ }! W" j
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    * ]4 \) c0 D) I- g
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式$ X5 X6 f( _( v# V8 t# i
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   . Z4 c. V/ e- y! X; D. h" h2 _
  11. //回傳解密後字串
    ' F3 g" G2 H4 t4 ]7 T/ `0 U  Y
  12. return base64_encode($encrypted_toencrypt);  
    ) ^0 b9 P9 b; I
  13. }  ' }4 F5 f$ p" f9 T
  14. //解密函數撰寫! K# Y3 P0 k; C( t( y
  15. function decrypt($source,$todecrypt) {  5 z' [5 u4 O/ s8 }5 l: ?
  16. //解密用的key,必須跟加密用的key一樣   - J# C% n" j8 T1 P' k, N
  17. $key = $source;  0 ]* @* o8 Z6 b6 x+ K
  18. //解密前先解開base64碼. O8 s& q$ z$ \5 o9 _# \5 s: Z
  19. $todecrypt = base64_decode($todecrypt);: P# H+ I: T9 u, S+ a
  20. //使用3DES方法解密
    6 }* d' H+ x& [
  21. $encryptMethod = MCRYPT_TRIPLEDES;  
    " f. g7 K+ I% l  f0 t+ L
  22. //初始化向量來增加安全性
      \$ z- e& n1 U0 b3 Q' I
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    ( D; q! C$ `& R$ q2 d
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  
    7 a7 b9 g1 l* W+ y7 A! ]
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);; @$ W8 j5 C' a: M- K/ p/ n" }
  26. //回傳解密後字串# l* {) p$ b" o
  27. return $decrypted_todecrypt;  
      d# m* W4 J  |8 E+ M" P: N: |
  28. }  
    ' y( x5 [. D4 R* l
  29. //寫好加解密的函數之後,就可以來進行測試了; }2 b( }/ V- \$ I1 y/ L
  30. //key設定
    . ~8 n, b4 B: A) q: d4 l" t- ~; K
  31. $source ="1234567890";1 e3 l/ Q  c3 w& V8 Y, H6 z) X
  32. //要加密的字串
    " }( Z% [: V! R9 h
  33. $string ="www.av4u.co";
    * p$ b5 S1 C0 W5 G: a$ s- J8 \
  34. echo "string=".$string."<br>";0 h. j8 _. T  ]9 W  Y+ @: \
  35. //進行加密並顯示加密後的字串
    7 m! h; L( O+ S$ n# @5 s* M
  36. $encode = encrypt($source,$string);4 ?6 K# s# s% ^4 Z5 w, l  b6 F
  37. echo "encode=".$encode."<br>";
    6 b" q# T. k) B& L1 A- _  e
  38. //進行解密並顯示解密後的字串
    - ?$ l; m2 ]( w, Q7 H! D6 ?" n! M
  39. $decode = decrypt($source,$encode);
    ! s$ g! y4 ~; K
  40. echo "decode=".$decode."<br>";
複製代碼

( R6 Y7 _- O4 A* V) G
結果如下:
+ p* |$ p, {' T; H  o! f

$ w; `7 D; n2 Y+ ^+ N
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:

4 ?: h/ _2 D$ s$ B' G8 U3 ?3 q





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