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 編輯 ) ^% y6 U$ f& h& T, U$ m$ J
/ R6 ?6 m& M) t
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:

* c* g9 |3 p4 _- u% Z1 d, J
  1. rpm -qa | grep php-mcrypt
複製代碼

6 t: o1 s, B; {4 a$ \) J+ k或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
+ k% F# ]: M) Y
  1. <?php
    ' V. N- x% ^; }5 \* R8 E, d
  2. // Show all information, defaults to INFO_ALL! g2 P, N9 T4 `, w$ V' j- G1 ~; U) c  t  h
  3. phpinfo();
    3 W+ A* Z# `8 R/ P: ~: N& S& [% U) R- o) ]
  4. ?>
複製代碼
" S) R! P# K# W4 y" Z
然後於browser 執行phpinfo.php,結果如下:

! ]1 _) Y1 M0 p/ i- f% x/ W

/ s+ N5 ~7 F# q' f. M$ R! h

0 j# d( M! G# L/ H  [
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:
# A2 e) o; J% r9 o0 m6 a5 e
  1. //加密函數撰寫
    6 N  b3 E* x( _, ^- {* t2 B
  2. function encrypt($source,$toencrypt){  
    4 R% [/ Q5 G0 e# U2 ~6 F
  3. //加密用的key   . p" v* l% F+ F8 Z* d- s
  4. $key = $source;  ) W+ w  C2 E5 [$ ~9 Q
  5. //使用3DES方法加密   
    & d  ?. d  J1 U, t2 l# R7 L
  6. $encryptMethod = MCRYPT_TRIPLEDES; ( X* R3 j/ }* r0 o, U! @; r) v
  7. //初始化向量來增加安全性
      w9 c; j; h& `/ _9 H' I. r
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    $ e& d3 C/ {9 |! d- D- y
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式7 Y' [0 E% ~4 `: Y7 n& G4 A
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   ) C! ]1 I: |- |! J0 ^. ^
  11. //回傳解密後字串
    6 x* E2 r6 V+ B. C# h" Z0 {$ M* z; X
  12. return base64_encode($encrypted_toencrypt);  
    # G8 j2 ^) d( M# B, C8 |
  13. }  4 }- K6 `8 d8 n
  14. //解密函數撰寫
      q/ M' d) Z: s
  15. function decrypt($source,$todecrypt) {  8 x8 W5 ?2 Q6 C+ L, z1 u3 E
  16. //解密用的key,必須跟加密用的key一樣   
    # e9 R2 b& e, i3 V
  17. $key = $source;  
    1 c- ?' L; O/ C. }
  18. //解密前先解開base64碼
    " U6 j- N. L' |- N9 x
  19. $todecrypt = base64_decode($todecrypt);
    6 B2 \7 A+ P1 ?5 k! C
  20. //使用3DES方法解密5 ^; j, _- d  [+ P$ {
  21. $encryptMethod = MCRYPT_TRIPLEDES;  
    % c- x2 I8 W3 X/ P9 G. s; z
  22. //初始化向量來增加安全性
    ( t( G" ^* l- _6 \
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    $ ^7 d; O3 ]4 Y1 m2 K! D' Z+ |
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  3 f  k: J3 [  X/ B
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);
    . ?( S* _' Z  X( H* H8 z
  26. //回傳解密後字串
    ! ?7 l& ~* p, a3 {6 Z
  27. return $decrypted_todecrypt;  ( T; _9 x4 Z% E; W6 X
  28. }  
    " w" L4 M2 x1 ^: a2 b
  29. //寫好加解密的函數之後,就可以來進行測試了! o, N+ E0 G$ X/ M, l0 S& B
  30. //key設定
    + c, Q5 {6 @. o  H( t
  31. $source ="1234567890";
    + ^: V1 @& E5 _; [: d
  32. //要加密的字串
    - }9 ]6 y! }6 M1 T
  33. $string ="www.av4u.co";
    ) t7 G2 @0 ]; K
  34. echo "string=".$string."<br>";
    + x. f, U: ?, d$ Y( k9 j
  35. //進行加密並顯示加密後的字串
    3 N- Q6 D1 T8 H- w5 y" [
  36. $encode = encrypt($source,$string);5 m$ s) L0 W1 R& q4 b9 `0 g4 r
  37. echo "encode=".$encode."<br>";
    6 Z# m) c. E, I; X1 v- f/ \3 f
  38. //進行解密並顯示解密後的字串. P. n$ }2 c! \% `0 o( k
  39. $decode = decrypt($source,$encode);/ y; `+ H7 `- {& e  c
  40. echo "decode=".$decode."<br>";
複製代碼
6 L8 k' _0 G$ y
結果如下:

. c8 I0 N* j# k" P

2 H5 m) L! l( }/ }
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
9 L0 w# J+ D$ M" Z1 P% M' I8 P





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