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 編輯
' C: [: @  m0 K0 U) p+ o" n* I8 s) u/ }% }& `  y( f
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:

2 j" r1 B8 T, ?6 B: r1 }
  1. rpm -qa | grep php-mcrypt
複製代碼

$ j) W) m1 j3 v) m* @或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
, E. W# B, [7 L& m% b
  1. <?php' ~2 v* j2 ?2 A# k2 {6 p
  2. // Show all information, defaults to INFO_ALL$ e# O: {- r4 O" C) D
  3. phpinfo();! |' F+ x$ D- H8 f# i
  4. ?>
複製代碼

, L! r9 o9 U* \' y然後於browser 執行phpinfo.php,結果如下:

. M- W# U' p# J

& z0 q. z6 n! c1 c

/ g0 O7 P) y, r; Y
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:

# M. c6 q* l/ W: w$ R# X3 j
  1. //加密函數撰寫* `8 r/ n  \' Z; j& C8 H1 ~' E
  2. function encrypt($source,$toencrypt){  7 Y4 \" J: M# e, i( Z1 B  F4 s
  3. //加密用的key   ) e8 p6 z0 C9 _: p0 G
  4. $key = $source;  $ J$ b2 o3 ~) U' B; e2 W  T' G
  5. //使用3DES方法加密   
    ) t+ ~9 q& L  a4 {5 @
  6. $encryptMethod = MCRYPT_TRIPLEDES; 4 ^- n7 D# L, r
  7. //初始化向量來增加安全性
    , X$ I. r7 K. S+ @
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
      X- ]  X: U! _  H7 f9 X0 h, c  z
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式
    4 C1 X! h1 h( ~7 b) B, q6 y
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   
    ( n! a, e7 M5 o
  11. //回傳解密後字串0 w2 H/ p% H2 f4 u! t: H
  12. return base64_encode($encrypted_toencrypt);  
    6 K4 Z$ o% m. }: w+ C
  13. }  
    ) K. U4 C% |; Q, w% K+ Z0 [
  14. //解密函數撰寫
      Z/ R: ]# Q, i) `- s
  15. function decrypt($source,$todecrypt) {  / S$ |- r3 S+ }  @" _4 H* N
  16. //解密用的key,必須跟加密用的key一樣   4 @* c7 J; y+ \/ S! n4 K
  17. $key = $source;  
    " b* H* h5 f2 S9 l  K. D
  18. //解密前先解開base64碼
    2 R" |, y3 a( \( j, K) J) M9 k
  19. $todecrypt = base64_decode($todecrypt);3 W9 u$ J, x3 d) O
  20. //使用3DES方法解密
    ' F% u$ F2 ~7 i. Y' D
  21. $encryptMethod = MCRYPT_TRIPLEDES;  # G* ]5 J/ {1 R% V1 X, `4 {( R
  22. //初始化向量來增加安全性 ( G& `# [; E6 v/ S& D. \: g
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  4 ?# u/ B+ a( d4 w8 ?& Q. j3 y- g
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  " o! D8 s/ a. A  I
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);2 i. m5 S& Q+ P9 F: T
  26. //回傳解密後字串
    0 ~: T) k7 d$ F
  27. return $decrypted_todecrypt;  $ S: Y0 F1 D7 l: U" N7 P
  28. }  # ?2 L+ I! _) R7 y
  29. //寫好加解密的函數之後,就可以來進行測試了
    * c5 l% ]( v0 W0 n8 ]
  30. //key設定$ x" M4 y( @' K; A5 a
  31. $source ="1234567890";8 p- y6 Z* Q8 H" ?
  32. //要加密的字串
    & E; H) v! O8 Q  X( R9 ^4 z3 y* J
  33. $string ="www.av4u.co";
    ) j; j% v( e3 n- _7 C( j
  34. echo "string=".$string."<br>";2 \9 G# n  |: I
  35. //進行加密並顯示加密後的字串
    + j  x; T9 Z. l% u
  36. $encode = encrypt($source,$string);& M) k! k* X- F' i; \2 {
  37. echo "encode=".$encode."<br>";  [; A0 K" u$ n
  38. //進行解密並顯示解密後的字串) V: s& d$ Q4 N7 N* @
  39. $decode = decrypt($source,$encode);
    # @: @  Z' |% P
  40. echo "decode=".$decode."<br>";
複製代碼
4 \4 K& {) {* S6 U  @5 t
結果如下:
2 E+ T/ h# t. d1 r/ [: |

9 U  l6 ~. c. j! ]; i' l
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
3 @& J/ g2 o1 M- z





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