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 編輯
8 G1 |" [6 h' k, @- |0 l. e% L6 o5 r9 Y! T( b, ?& [
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:

, [2 ]$ `1 J( \: W: r
  1. rpm -qa | grep php-mcrypt
複製代碼

7 G" n+ M+ h4 |或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
9 q, i' H# i( D* X% N( N6 W
  1. <?php
      S) p! c( b" O4 R' h2 q
  2. // Show all information, defaults to INFO_ALL
    4 M8 m' R, b+ [9 L5 J; J. h* B
  3. phpinfo();# \: {# Q( f. Z& D. a! D0 j+ }
  4. ?>
複製代碼
1 q! u6 F5 {) v
然後於browser 執行phpinfo.php,結果如下:

7 J3 J: ]  ?6 ?, d8 e9 h

6 s/ C, [1 b( a3 @

- W  b6 ?! Z7 K; p9 O
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:
7 I4 }/ _% F. w2 _
  1. //加密函數撰寫
    4 P  }* d- g" f3 u2 |1 d6 c
  2. function encrypt($source,$toencrypt){  
    ; V- v8 ^) _! [% y) B; w9 E9 Y4 j
  3. //加密用的key   " N0 H) H8 p. u( A2 ]' B
  4. $key = $source;  
    ! o! X7 o, q, m) e6 }) u
  5. //使用3DES方法加密   & e. Z5 T; D/ w1 b. H6 O# y
  6. $encryptMethod = MCRYPT_TRIPLEDES;
    , E. Q% l# E# R( K  w
  7. //初始化向量來增加安全性
    ' g5 B! C1 \; y+ U
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  . V2 n$ r$ r. G9 h, v1 S
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式
      J. n4 T9 E. d+ r: s! H7 Y  ?! K
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   1 I" v' S, P% V7 D! ?
  11. //回傳解密後字串
    8 n: s3 p4 H6 `0 I0 z  u1 P
  12. return base64_encode($encrypted_toencrypt);  
    0 h# F& x6 V% @/ L4 K7 O
  13. }  + Z' K7 w$ \3 l  A' R; O
  14. //解密函數撰寫, \/ X$ m2 `1 B
  15. function decrypt($source,$todecrypt) {  
    1 R! y' J& i: S* X5 B
  16. //解密用的key,必須跟加密用的key一樣   2 |" a1 B$ Q1 w" }
  17. $key = $source;  
    " v% s) L8 K* s
  18. //解密前先解開base64碼" ~3 {# o' E$ M1 W9 p  E
  19. $todecrypt = base64_decode($todecrypt);
    ' p8 p; h. n) S# J! I
  20. //使用3DES方法解密
    + a1 }. i; S1 l* n, q; Q
  21. $encryptMethod = MCRYPT_TRIPLEDES;  
    * d# i* M8 L' ~: a* E% A0 O, N" S
  22. //初始化向量來增加安全性 ; e+ x$ q1 c  d( ^0 j. e
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    / O' d4 o+ W6 J7 A5 S' y5 i
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  
    ) v2 J/ Z5 t" j/ x/ q: ~6 m# ~$ f
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);" S; L( D! v! Z+ e2 U# y
  26. //回傳解密後字串; [+ g- s, B+ g3 U1 z
  27. return $decrypted_todecrypt;  $ _2 Q5 [* w5 q" I
  28. }  5 x' n$ P0 v) h& \0 l* b# t* b
  29. //寫好加解密的函數之後,就可以來進行測試了# }* z0 j  V. W
  30. //key設定
    / v6 y+ X$ G9 c: D$ i
  31. $source ="1234567890";( S2 g% a5 K" [- p/ ~. B  E
  32. //要加密的字串
    2 X5 y$ R' {; y6 b( f
  33. $string ="www.av4u.co";; Y+ G, Q; ?5 i: |$ _8 P
  34. echo "string=".$string."<br>";/ w: ?$ O; A3 @9 h4 Z2 v5 Q
  35. //進行加密並顯示加密後的字串
    - i. P' Q/ z8 ^9 K3 Z' S6 K: O
  36. $encode = encrypt($source,$string);
    ( H- N, b9 _! p- l6 m
  37. echo "encode=".$encode."<br>";
    # g) |- T" o/ \  I$ R# T: w
  38. //進行解密並顯示解密後的字串* l2 c# e  h3 ^) z8 @' l  V
  39. $decode = decrypt($source,$encode);5 S5 k& ~4 D/ q. |2 C6 `
  40. echo "decode=".$decode."<br>";
複製代碼
# i- Y6 `$ K0 o! n! L8 W
結果如下:
5 `& d! P5 I9 U" i6 M! m# U

0 O) E' T. [$ X( ?9 h5 f
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:

' G4 j6 {( h- j3 o- g" w' T





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