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 編輯
5 F& @: b9 i4 M2 m. C) O
( U0 `, ^1 r4 B4 n' k# ~
由於敝網站文字加密的需要,需要複雜加密的演算法,因此選擇3DES加密。
3DES加密(Triple DES),是三重加密演算法的通稱,而3DES共有四種模式,下面介紹的是ECB模式的寫法。
首先先檢查linux是否有安裝mcrypt模組,方法如下:
# {. N/ _5 b/ ]. C( K5 ?
  1. rpm -qa | grep php-mcrypt
複製代碼

7 h. a) Q! O; r或在你的網站建一個php檔,如phpinfo.php(內容如下)查看是否有mcrypt module
' T3 E1 S, r  F* L5 L% i
  1. <?php
    ! v- ?: r. p- n/ C2 d3 l* V
  2. // Show all information, defaults to INFO_ALL# ^  K+ _* \  S: R- W' D
  3. phpinfo();
    3 \8 b) H# p; E
  4. ?>
複製代碼
0 @* g3 @, m! z
然後於browser 執行phpinfo.php,結果如下:
$ o  t' j" ]# U0 P' }' s9 I
. h" F& P4 G! o3 {( _

! `0 K7 ^8 @! O1 J( x" B
如果沒有安裝php-mcrypt,則進行安裝(安裝方法),安裝完後再以上述兩種方法擇一加以檢查。
之後就可以撰寫加密程式如下:
  f; O: }: z- K8 o# w: z
  1. //加密函數撰寫
    & @  N# `" s( ^5 H! f/ w
  2. function encrypt($source,$toencrypt){  : h5 Y6 ~+ t: l( d' M
  3. //加密用的key   
    3 b7 m2 W+ P  b
  4. $key = $source;  
    8 M2 d5 @& W) F; g
  5. //使用3DES方法加密   8 S0 o  Y9 c+ G6 K: ~1 p4 b, I
  6. $encryptMethod = MCRYPT_TRIPLEDES; 3 L6 |/ ?, [6 M+ g; i# S/ \) M/ S4 G6 x
  7. //初始化向量來增加安全性& e, e" a# M# ^# e( o( \8 q
  8. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  
    6 d5 S8 \) Q+ E1 t& p1 O6 ^: H
  9. //使用mcrypt_encrypt函數加密,MCRYPT_MODE_ECB表示使用ECB模式# w7 A) A; W. J, v: q/ x
  10. $encrypted_toencrypt = mcrypt_encrypt($encryptMethod, $key, $toencrypt, MCRYPT_MODE_ECB,$iv);   
    / X' A) r; r6 `: x
  11. //回傳解密後字串7 |" y' X7 T1 g
  12. return base64_encode($encrypted_toencrypt);  / j' E; x" R! N0 o, v
  13. }  1 O1 o+ t% V: n
  14. //解密函數撰寫
    9 V7 w8 V) ]; `5 K
  15. function decrypt($source,$todecrypt) {  ' t7 N) F2 Q. q6 I% e% ?1 O' j# K
  16. //解密用的key,必須跟加密用的key一樣   ' \# I8 i4 Q7 `
  17. $key = $source;  
    ! {% p. h* s; C; ]8 o4 Z4 V
  18. //解密前先解開base64碼) r5 U. \: ]" u  I( e. ?2 s! ~1 Y, F
  19. $todecrypt = base64_decode($todecrypt);- P* |, v  [- @& h
  20. //使用3DES方法解密
      @' l: S3 z8 ~) \) T
  21. $encryptMethod = MCRYPT_TRIPLEDES;  + z* G- \# {( W/ b: n
  22. //初始化向量來增加安全性
    1 U8 E  `. h8 W' _+ T. R. x
  23. $iv = mcrypt_create_iv(mcrypt_get_iv_size($encryptMethod,MCRYPT_MODE_ECB), MCRYPT_RAND);  . s. E+ u/ Y; u' G
  24. //使用mcrypt_decrypt函數解密,MCRYPT_MODE_ECB表示使用ECB模式  , h; Z) ?4 ?9 ^0 ?- G9 _/ f
  25. $decrypted_todecrypt = mcrypt_decrypt($encryptMethod, $key, $todecrypt, MCRYPT_MODE_ECB,$iv);
    & O2 O7 L$ L- o. i/ B0 V1 w* b
  26. //回傳解密後字串" g# W6 ^- T+ ~7 m# O! ~  h
  27. return $decrypted_todecrypt;  
    + p8 V  M, I9 ~2 c, v7 ]
  28. }  # W5 M; o* B( B+ j$ K! C& X
  29. //寫好加解密的函數之後,就可以來進行測試了
    2 `- k8 {9 @% T1 f6 c
  30. //key設定
    - S; Y! F. Y7 M# V+ \4 h
  31. $source ="1234567890";
    : |, e+ T: [8 F( e* F5 j
  32. //要加密的字串+ [8 h5 [/ b# {
  33. $string ="www.av4u.co";
    # C5 s/ z! m7 [8 p
  34. echo "string=".$string."<br>";
    2 n# H, n; [8 F5 ~
  35. //進行加密並顯示加密後的字串
    1 z/ Z/ G2 n/ w- I# M
  36. $encode = encrypt($source,$string);3 R4 @; V  Q2 m- Q3 ?* j
  37. echo "encode=".$encode."<br>";
    9 Y! p7 H( ~8 e: u* q1 ?  ~8 f6 ]( L+ Y
  38. //進行解密並顯示解密後的字串
    * m( `' c# A1 a1 Y, X
  39. $decode = decrypt($source,$encode);
    8 q) S# B; Y( n
  40. echo "decode=".$decode."<br>";
複製代碼
2 D2 E6 p! H8 C- S
結果如下:
) U, u( E1 n" W1 O1 c8 `8 o
1 A9 u0 t. [0 M) X# X% Q4 y
注意:
      如果加解密過程沒有使用base64碼的話:會造成跨網域的資料傳輸時,接收端無法解讀(是加密過後的資料傳輸錯誤造成,但是在同一網站內的加解密是沒問題的),結果如下:
. U+ W6 _4 D9 V" @* f! S





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