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 編輯
* Y. M( G  e# M, E$ g
% a; Y+ B/ f" X. n) b$ b
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:

3 n; H" z( Y, _: ?  V8 J; N8 u
  1. rpm -qa | grep php-mcrypt
複製代碼
7 A2 b9 a" v( x) v8 K
或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
) V/ b6 e1 r" ]4 P
  1. <?php- K( y7 C1 E8 K+ I6 `" p6 @
  2. // Show all information, defaults to INFO_ALL' U3 G& h; ~, Z  r; _) M+ z& K
  3. phpinfo();/ C$ c- A: e' A0 F
  4. ?>
複製代碼
4 k. b8 a) M( l/ X5 r
然後於browser 執行phpinfo.php,結果如下:

: C# _% D) Z3 q
% z; f; i+ j) x& G  ~# B6 A4 h
! z& b5 N  \7 C/ M
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:
: d1 d5 d; Z! L6 ~) t# m0 ]
  1. //加密函數撰寫8 ?5 k" p+ i) f1 h6 K- }
  2. function encrypt($source,$toencrypt){  
    1 n+ Z# |; o. U' j, H, V% I/ Z
  3. //加密用的key   , n2 ?. d5 [- S/ l
  4. $key = $source;  
    : O5 E( i: Y7 k6 O- I! {1 m
  5. //使用3DES方法加密   
    6 N3 X* V7 Y9 ^; p9 u0 K+ n
  6. $encryptMethod = MCRYPT_TRIPLEDES;
    ( J- ]. R" x% h( f
  7. //初始化向量來增加安全性
    . o9 {# V9 T8 J* P7 v( l& Z% N
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    3 o/ j- S; W; K6 Y  b/ H) D0 {
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式
      ~9 o6 ~; P1 `; X) R
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   $ |2 a4 J1 N6 _+ v, F, n3 K
  11. //回傳解密後字串) X: F4 {! T* \
  12. return base64_encode($encrypted_toencrypt);  
    2 ~+ w; `$ r% y- m6 f& U: x
  13. }  
    : |5 N, B  v0 d# e
  14. //解密函數撰寫
    6 q0 S# x( i) u1 r# |; t; i8 u; r0 [" b
  15. function decrypt($source,$todecrypt) {  : h% F1 ?/ ?! ~+ ~: x' `, c
  16. //解密用的key,必須跟加密用的key一樣   
    * |4 i; z2 Q, V. @6 T3 d- A# b
  17. $key = $source;  
    ' Z# C, v$ t2 n' v9 m1 m# V" P4 W
  18. //解密前先解開base64碼8 U( r- G" `3 I1 d* B4 V' }
  19. $todecrypt = base64_decode($todecrypt);3 ^/ f; `1 y2 ^
  20. //使用3DES方法解密: t5 c( T3 m( ?
  21. $encryptMethod = MCRYPT_TRIPLEDES;  5 C$ K4 ^, F6 ], ?
  22. //初始化向量來增加安全性 . t" Y, N/ ?5 R# h0 {1 b
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    $ u: V/ E9 A/ g, P2 k' H0 J$ c
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  
    & z% I4 k& r- s, c4 ?
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);
    ) {! e; E) u6 ^- \- H
  26. //回傳解密後字串, V3 g( V) i. _+ B) R4 `6 T; E
  27. return $decrypted_todecrypt;  
    5 n, R9 r! v1 W: w
  28. }  
    - S/ p9 `" o; B
  29. //寫好加解密的函數之後,就可以來進行測試了
    . U# d: V5 ?) c; d, ~2 ]: `+ x9 C, d9 Q
  30. //key設定  A. I' d) _2 n' ?1 L
  31. $source ="1234567890";
    6 b- V* a% o* j& i* a7 C# u0 M7 J
  32. //要加密的字串
    7 @( l: T' ~9 N, M) ^
  33. $string ="www.av4u.co";: `  Z" W( r0 h/ E& r4 B; w+ ~
  34. echo "string=".$string."<br>";5 k/ u5 o, m- G3 V7 P
  35. //進行加密並顯示加密後的字串6 x3 }3 m. x) r0 `  }
  36. $encode = encrypt($source,$string);
      q) ], ?# ^; @8 ?9 H; f& @
  37. echo "encode=".$encode."<br>";
    1 E2 ~, T% v: W; _3 z
  38. //進行解密並顯示解密後的字串
    0 M( Y: f. |/ C. g/ Q; i2 `
  39. $decode = decrypt($source,$encode);
    9 c3 ?% u! p, l3 r7 w+ v6 G$ H8 K
  40. echo "decode=".$decode."<br>";
複製代碼

6 G. q; `7 _6 [- k+ G4 O6 t
結果如下:
( o# S* [; L2 g6 d. t2 j% t

. ~3 f1 e- u7 n  l# m: e0 e) |
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:

  `/ h6 f* r' d; g4 ^





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