首頁  >  文章  >  後端開發  >  關於des加密與解密實作方法(php net兩個版本)

關於des加密與解密實作方法(php net兩個版本)

WBOY
WBOY原創
2016-07-25 09:04:251274瀏覽
  1. /**

  2. des 加密 解密
  3. */
  4. 類別 STD3Des
  5. {
  6. */
  7. 類別 STD3Des
  8. {
  9. 其中$key = "";
  10. private $iv = "";
  11. /**

  12. * 構造,傳遞兩個已經進行base64_encode的KEY與IV
  13. *
  14. * @param string $key
  15. * @param string $iv
  16. */
  17. function __construct ($key, $iv)
  18. {
  19. if (empty($key) ||empty($iv)) {
  20. echo 'key 和iv 無效';
  21. exit();
  22. }
  23. $this ->key = $key ;
  24. $this->iv = $iv;
  25. }
  26. /**

  27. *加密
  28. * @param $value
  29. * @return
  30. */
  31. 公用函數加密($value)
  32. {
  33. $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
  34. $iv = base64_decode($this->iv);
  35. $value = $this->PaddingPKCS7($value);
  36. $value = $this->PaddingPK7($value);
  37. $key = base64_decode($this->key);
  38. mcrypt_generic_init($td, $key, $iv);
  39. $ret = base64_encode( mcrypt_generic($td, $value));
  40. );
  41. mcrypt_generic_deinit($td);
  42. mcrypt_module_close($td);
  43. 返回$ret;
  44. }
  45. *解密

  46. * @param ; $value
  47. * @return
  48. */
  49. 公共函數解密($value)
  50. {
  51. $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_CBC, '');
  52. $iv = base64_decode( $this->iv);
  53. $ $this->key);
  54. mcrypt_generic_init($td, $key, $iv);
  55. $ret = trim(mdecrypt_generic($td, base64_decode($value)));
  56. $ret = $ $ this->UnPaddingPKCS7($ret);
  57. mcrypt_generic_deinit($td);
  58. mcrypt_module_close($td);
  59. 回傳$ ret;
  60. }
  61. 回傳$ ret;
  62. }
  63. 間接函數PaddingPKCS7 ($data)

  64. {
  65. $block_size = mcrypt_get_block_size('tripledes', 'cbc');
  66. $ padding_char = $block_size - (strlen($data) % $block_size); data .= str_repeat(chr($padding_char), $padding_char);
  67. return $data;
  68. } ;
  69. 外部函數UnPaddingPKCSCS7($text)

  70. {
  71. $pad = ord($text{strlen($text) - 1});
  72. if ($pad >; strlen($text)) {
  73. 回傳 false;
  74. }
  75. if (strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
  76. return false;
  77. }
  78. return substr($text, 0, - 1 * $pad);
  79. }
  80. }
  81. //使用

  82. include('STD3Des.class.php');
  83. $key='abcdefgh';
  84. $iv='abcdefgh';
$msg='測試字串';
$des= new STD3Des(base64_encode($key),base64_encode($iv));$rs1=$des->加密($msg);echo $rs1.'
';
$rs2 =$des->decrypt($rs1);echo $rs2;複製程式碼

2、.net版本

  1. //des 加密解密

  2. 密封公用類別CryptoHelper
  3. {
  4. /// ;
  5. /// 加密指定的輸入。
  6. ///
  7. /// 輸入。
  8. /// key
  9. /// iv
  10. ///
  11. public static string EncryptDes(string input, byte[] key, byte[] iv)
  12. {
  13. if (input == null || input.Length == 0)
  14. if (input == null || input.Length == 0)
  15. return String.Empty;
  16. DESCryptoServiceProvider des = new DESCryptoServiceProvider();

  17. MemoryStream ms = null;
  18. CryptoStream encStream = nullStream字串結果= String.Empty;
  19. 嘗試

  20. {
  21. ms = new MemoryStream();
  22. //使用記憶體流和

  23. // CSP DES 金鑰建立CryptoStream。
  24. //des.Mode = CipherMode.CBC;
  25. //des.Padding = PaddingMode.PKCS7;
  26. encStream = new CryptoStream(ms, des.CreateEncryptor(key, iv), CryptoStreamMode.Write);
  27. // 建立StreamWriter 以將字串

  28. //寫入流。
  29. sw = new StreamWriter(encStream);
  30. // 將明文寫入流。

  31. sw.Write(input);
  32. sw.Flush();
  33. encStream.FlushFinalBlock();
  34. ms.Flush();
  35. 結果= Convert.ToBase64String(ms.GetBuffer(), 0, Convert.ToInt32(ms.Length, CultureInfo.InvariantCulture));

  36. }
  37. 最後
  38. {
  39. //關閉物件
  40. if (sw != null)
  41. sw. Close();
  42. if (encStream != null)
  43. encStream.Close();
  44. if (ms != null)
  45. ms.Close();
  46. }> ;
  47. // 回傳加密字串

  48. 回傳結果;
  49. }
  50. ///
  51. /// 解密指定輸入。
  52. // /
  53. /// 輸入。
  54. /// key ;
  55. /// iv
  56. ///
  57. public static string DecryptDes(string input, byte[ ] key, byte[] iv)
  58. {
  59. byte[] buffer;
  60. try { buffer = Convert.FromBase64( input); }
  61. catch (System.ArgumentNullException) { return String.Empty; }
  62. // 長度為零,或不是四的偶數倍(加上一些其他情況)
  63. catch (System.FormatException ) { return String.Empty; }
  64. DESCryptoServiceProvider des = new DESCryptoServiceProvider();

  65. MemoryStream ms = null;
  66. CryptoStream encStream = null;Stream;
  67. 字串結果= String.Empty;
  68. try

  69. {
  70. ms = new MemoryStream(buffer);
  71. // 建立一個CryptoStream使用記憶體流和

  72. // CSP DES 金鑰。
  73. encStream = new CryptoStream(ms, des.CreateDecryptor(key, iv), CryptoStreamMode.Read);
  74. sr = new StreamReader(encStream);

  75. // 以字串形式讀取流。

  76. result = sr. ReadToEnd();
  77. }
  78. 最後
  79. {
  80. //關閉物件
  81. if (sr != null)
  82. sr.Close();
  83. if (encStream != null)
  84. encStream.Close();
  85. if (ms != null)
  86. ms.Close();
  87. }
  88. 回傳結果;

  89. }
  90. }
  91. //呼叫

  92. string key = "abcdefgh";
  93. string iv = "abcdefgh";
  94. string msg ="test string";
  95. 字串rs1 = CryptoHelper.EncryptDes(msg, System.Text.Encoding.ASCII.GetBytes(key), System.Text.Encoding.ASCII.GetBytes(iv));
  96. 字元串rs2 = CryptoHelper. DecryptDes(rs1, System.Text.Encoding.ASCII.GetBytes(key), System.Text.Encoding.ASCII.GetBytes(iv));
複製程式碼
看完以上兩段程式碼,不知道你有收穫嗎?個人比較喜歡php版的des加密與解密方法,簡潔清晰。 腳本學堂(bbs.it-home.org),專心為您服務。

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn