PHP 基础篇 - PHP 中 DES 加解密详解

举报
lxw1844912514 发表于 2022/03/27 02:49:12 2022/03/27
【摘要】 一、简介 DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。所谓对称性加密即加密和解密密钥相同,对称性加密一般会按照固定长度,把待加密字符串分成块,不足一整块或者刚好最后有特殊填充字符。...

一、简介

DES 是对称性加密里面常见一种,全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。密钥长度是64位(bit),超过位数密钥被忽略。所谓对称性加密即加密和解密密钥相同,对称性加密一般会按照固定长度,把待加密字符串分成块,不足一整块或者刚好最后有特殊填充字符。

跨语言做 DES 加密解密经常会出现问题,往往是填充方式不对、编码不一致或者加密解密模式没有对应上造成。常见的填充模式有: pkcs5、pkcs7、iso10126、ansix923、zero。加密模式有:DES-ECB、DES-CBC、DES-CTR、DES-OFB、DES-CFB。

作为一个软件开发者,可以通过工具测试 DES 加密解密,这里推荐一个在线工具:http://tool.chacuo.net/cryptdes

二、实现

PHP 提供了 Mcrypt 系列函数来实现 DES 的加解密,但该扩展中的函数陆续被废弃,自 PHP 7.2.0 起,会移到 PECL。

所以本代码用了更通用的 OPENSSL 方式实现 DES 的加解密,具体的实现和使用代码如下:


     
  1. <?php
  2. /**
  3. * openssl 实现的 DES 加密类,支持各种 PHP 版本
  4. */
  5. class DES
  6. {
  7. /**
  8. * @var string $method 加解密方法,可通过 openssl_get_cipher_methods() 获得
  9. */
  10. protected $method;
  11. /**
  12. * @var string $key 加解密的密钥
  13. */
  14. protected $key;
  15. /**
  16. * @var string $output 输出格式 无、base64、hex
  17. */
  18. protected $output;
  19. /**
  20. * @var string $iv 加解密的向量
  21. */
  22. protected $iv;
  23. /**
  24. * @var string $options
  25. */
  26. protected $options;
  27. // output 的类型
  28. const OUTPUT_NULL = '';
  29. const OUTPUT_BASE64 = 'base64';
  30. const OUTPUT_HEX = 'hex';
  31. /**
  32. * DES constructor.
  33. * @param string $key
  34. * @param string $method
  35. * ECB DES-ECB、DES-EDE3 (为 ECB 模式时,$iv 为空即可)
  36. * CBC DES-CBC、DES-EDE3-CBC、DESX-CBC
  37. * CFB DES-CFB8、DES-EDE3-CFB8
  38. * CTR
  39. * OFB
  40. *
  41. * @param string $output
  42. * base64、hex
  43. *
  44. * @param string $iv
  45. * @param int $options
  46. */
  47. public function __construct($key, $method = 'DES-ECB', $output = '', $iv = '', $options = OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)
  48. {
  49. $this->key = $key;
  50. $this->method = $method;
  51. $this->output = $output;
  52. $this->iv = $iv;
  53. $this->options = $options;
  54. }
  55. /**
  56. * 加密
  57. *
  58. * @param $str
  59. * @return string
  60. */
  61. public function encrypt($str)
  62. {
  63. $str = $this->pkcsPadding($str, 8);
  64. $sign = openssl_encrypt($str, $this->method, $this->key, $this->options, $this->iv);
  65. if ($this->output == self::OUTPUT_BASE64) {
  66. $sign = base64_encode($sign);
  67. } else if ($this->output == self::OUTPUT_HEX) {
  68. $sign = bin2hex($sign);
  69. }
  70. return $sign;
  71. }
  72. /**
  73. * 解密
  74. *
  75. * @param $encrypted
  76. * @return string
  77. */
  78. public function decrypt($encrypted)
  79. {
  80. if ($this->output == self::OUTPUT_BASE64) {
  81. $encrypted = base64_decode($encrypted);
  82. } else if ($this->output == self::OUTPUT_HEX) {
  83. $encrypted = hex2bin($encrypted);
  84. }
  85. $sign = @openssl_decrypt($encrypted, $this->method, $this->key, $this->options, $this->iv);
  86. $sign = $this->unPkcsPadding($sign);
  87. $sign = rtrim($sign);
  88. return $sign;
  89. }
  90. /**
  91. * 填充
  92. *
  93. * @param $str
  94. * @param $blocksize
  95. * @return string
  96. */
  97. private function pkcsPadding($str, $blocksize)
  98. {
  99. $pad = $blocksize - (strlen($str) % $blocksize);
  100. return $str . str_repeat(chr($pad), $pad);
  101. }
  102. /**
  103. * 去填充
  104. *
  105. * @param $str
  106. * @return string
  107. */
  108. private function unPkcsPadding($str)
  109. {
  110. $pad = ord($str{strlen($str) - 1});
  111. if ($pad > strlen($str)) {
  112. return false;
  113. }
  114. return substr($str, 0, -1 * $pad);
  115. }
  116. }
  117. $key = 'key123456';
  118. $iv = 'iv123456';
  119. // DES CBC 加解密
  120. $des = new DES($key, 'DES-CBC', DES::OUTPUT_BASE64, $iv);
  121. echo $base64Sign = $des->encrypt('Hello DES CBC');
  122. echo "\n";
  123. echo $des->decrypt($base64Sign);
  124. echo "\n";
  125. // DES ECB 加解密
  126. $des = new DES($key, 'DES-ECB', DES::OUTPUT_HEX);
  127. echo $base64Sign = $des->encrypt('Hello DES ECB');
  128. echo "\n";
  129. echo $des->decrypt($base64Sign);

  

三、相关链接

文章来源: blog.csdn.net,作者:lxw1844912514,版权归原作者所有,如需转载,请联系作者。

原文链接:blog.csdn.net/lxw1844912514/article/details/100028526

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。