Cc3des.php 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. <?php
  2. /**
  3. *
  4. * PHP版3DES加解密类
  5. *
  6. * 可与java的3DES(DESede)加密方式兼容
  7. *
  8. * @Author:蓝凤(ilanfeng.com)
  9. *
  10. * @version: V0.1 2011.02.18
  11. *
  12. */
  13. namespace Qii\Library;
  14. class Cc3des{
  15. //加密的时候只用替换key就行了,ecb模式不需要提供iv值
  16. public $key = "0123456789QWEQWEEWQQ1234";
  17. public $iv = "33889955"; //like java: private static byte[] myIV = { 50, 51, 52, 53, 54, 55, 56, 57 };
  18. //解密
  19. public function decrypt($string) {
  20. $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
  21. srand();
  22. $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
  23. $key = substr($this->key, 0, mcrypt_enc_get_key_size($td));
  24. mcrypt_generic_init($td, $key, $iv);
  25. $value = @pack("H*", $string);
  26. $ret = trim(mdecrypt_generic($td, $value));
  27. // 去掉多余的补位
  28. $ret = $this->pkcs5_unpad($ret);
  29. mcrypt_generic_deinit($td);
  30. mcrypt_module_close($td);
  31. return $ret;
  32. }
  33. //加密
  34. public function encrypt($value) {
  35. $td = mcrypt_module_open(MCRYPT_3DES, '', MCRYPT_MODE_ECB, '');
  36. srand();
  37. $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
  38. $key = substr($this->key, 0, mcrypt_enc_get_key_size($td));
  39. mcrypt_generic_init($td, $key, $iv);
  40. $value = $this->pkcs5_pad($value, mcrypt_get_block_size(MCRYPT_3DES, 'ecb'));
  41. $ret = mcrypt_generic($td, $value);
  42. mcrypt_generic_deinit($td);
  43. mcrypt_module_close($td);
  44. return strtoupper(bin2hex($ret));
  45. }
  46. /*
  47. * 位数补齐
  48. */
  49. private function pkcs5_pad($text, $blocksize) {
  50. $pad = $blocksize - (strlen($text) % $blocksize);
  51. return $text . str_repeat(chr($pad), $pad);
  52. }
  53. /*
  54. * 去除补位
  55. */
  56. private function pkcs5_unpad($text) {
  57. $pad = ord($text{strlen($text) - 1});
  58. if($pad > strlen($text)) {
  59. return false;
  60. }
  61. if(strspn($text, chr($pad), strlen($text) - $pad) != $pad) {
  62. return false;
  63. }
  64. return substr($text, 0, -1 * $pad);
  65. }
  66. }