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 編輯   S; q! N, W+ e! e- e

. l, O# I6 t) U! I  k
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:

0 d' N  u0 d( E' L" ?* l
  1. rpm -qa | grep php-mcrypt
複製代碼
, v  ?2 U1 c5 P
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module

4 y% P3 E$ N9 j  o
  1. <?php
    8 ?9 q! G8 `* Z; I
  2. // Show all information, defaults to INFO_ALL
    . N" h7 T$ v4 [; O9 S4 l
  3. phpinfo();/ y0 X0 Q0 }- {1 K2 D! Q
  4. ?>
複製代碼

1 i2 u' P# Q) Y$ m# Y然後於browser 執行phpinfo.php,結果如下:
: r5 X: k0 V7 ]+ u8 u9 i

+ Y9 U4 M, _, s2 w

/ `8 b$ p1 o5 s3 A
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:
' M/ ]7 k- V) m. P0 h6 R, k
  1. //加密函數撰寫7 @9 o+ y. Z. i& e5 `; Z
  2. function encrypt($source,$toencrypt){  4 _: B& m# @- w; V. C! D+ }
  3. //加密用的key   
    . F+ ~  M, B* w8 _
  4. $key = $source;  7 H3 V( T: Y( {9 \
  5. //使用3DES方法加密   ; v8 j3 F% J5 Z# Y, A4 G6 H3 y
  6. $encryptMethod = MCRYPT_TRIPLEDES;
    9 S. p' t  A. C+ y! u" [) {& x
  7. //初始化向量來增加安全性
    $ m# _: l( q4 g9 L- x& k" n
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    # A: z+ [6 y' d. K& V
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式0 B/ G) Y. [& g
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   
    * X/ z  d% M/ w7 M6 L7 {
  11. //回傳解密後字串$ q: J3 P: T& Q( X0 u: E
  12. return base64_encode($encrypted_toencrypt);  
    ' B6 l2 J. D/ U$ L& _  c
  13. }  
      C8 J- P0 X2 C+ D0 W  L
  14. //解密函數撰寫
    6 A; u& ]" s& \' G$ E
  15. function decrypt($source,$todecrypt) {  ! Z$ I( |" z! p/ m
  16. //解密用的key,必須跟加密用的key一樣   ; S8 ~! v7 W  V3 P
  17. $key = $source;  7 _5 K' Q& a$ l3 ^
  18. //解密前先解開base64碼
    / z& Y* F  ^" B& q
  19. $todecrypt = base64_decode($todecrypt);
    + F3 G* T, p* o5 b6 [$ ^
  20. //使用3DES方法解密
    7 n! ^! L# F: _& b
  21. $encryptMethod = MCRYPT_TRIPLEDES;  
    ! Y0 k1 o4 X! T8 Q& e' P' {+ d. {
  22. //初始化向量來增加安全性
    9 s5 w# m5 \9 q/ J% J9 T
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    $ C9 t# W# C0 G
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  6 j# }" O8 v2 h6 p# |! b
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);8 u' g  J7 _5 K& F- q1 o; r8 j+ x2 P
  26. //回傳解密後字串
    5 \& d  L3 @8 _
  27. return $decrypted_todecrypt;  
    3 e* }4 G, N0 _6 j% j9 f$ A* s. l( B  z
  28. }  . L9 L4 ^! v2 f9 h
  29. //寫好加解密的函數之後,就可以來進行測試了: O7 j* \2 @3 ~
  30. //key設定
    , |: p* E; T% ?' Q! r  |6 q; ^- G
  31. $source ="1234567890";
    " x' I; `6 P( [  \+ d9 E2 s
  32. //要加密的字串
    ) V/ h: l( n5 l; e2 Z# k
  33. $string ="www.av4u.co";+ Z* b: N6 K3 g
  34. echo "string=".$string."<br>";
    : }& d6 M+ F  u" |! t# \$ {: ]2 [
  35. //進行加密並顯示加密後的字串! F. N& T1 n8 X! I" U; w& C# Q: o
  36. $encode = encrypt($source,$string);1 G. k5 S3 l/ s3 k0 D. u
  37. echo "encode=".$encode."<br>";
    6 [' m2 |8 n* j) t
  38. //進行解密並顯示解密後的字串4 _* c: A) t1 k8 C6 ?5 P
  39. $decode = decrypt($source,$encode);# G0 B3 m; t1 O3 H& q. R
  40. echo "decode=".$decode."<br>";
複製代碼

, f; T/ h! H# y; m! ]
結果如下:
( Z; e* u- A* @$ f# n$ G6 I4 u

4 S$ j8 N% u3 d4 o" F5 E4 j
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
* ]7 K. j: s6 g5 R/ G% `





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