PHP实现3DES(ECB模式)加密

xiaoxiao2025-08-06  28

最近公司项目需要用php对数据进行3des加密,输入输出为十六进制。网上的方法大部分都是基于mcrypt扩展库,php7开始已经废弃,所以使用openssl扩展进行加密。贴上代码记录一下,ECB模式:

class ThreeDesUtil { private static $Algorithm = 'DES-EDE3';//定义加密算法 /** * 创建密钥,长度为24字节 * @param $key * @return bool/string */ static function createKeyBytes($key){ $dest=''; $temp=self::hexStringToBytes($key); try{ if(strlen($temp)<24){ $dest=substr($temp,0,strlen($temp)); $dest.=substr($temp,0,24-strlen($temp)); } }catch (Exception $exception){ $exception->getTrace(); } return $dest; } /** * 加密,ecb模式 * @param $key 密钥 * @param $src 被加密的数据缓冲区(明文) 十六进制 * @return null|string 加密后的密文 十六进制 */ public static function encryptMode($key, $src){ try{ if(!is_null($src)&&!is_null($key)){ $result = openssl_encrypt( self::hexStringToBytes($src), self::$Algorithm, self::createKeyBytes($key), OPENSSL_NO_PADDING, '' ); return self::convertByteToHexString($result); }else{ return 'KEY/内容为空'; } }catch (Exception $exception){ $exception->getTrace(); } return null; } /** 解密,ecb模式 * @param $key 加密使用的密钥 * @param $src 加密后的密文 十六进制 * @return string 解密后的明文 十六进制 */ public static function decryptMode($key,$src){ try{ if(!is_null($src)&&!is_null($key)){ $result=openssl_decrypt(self::hexStringToBytes($src), self::$Algorithm, self::createKeyBytes($key), OPENSSL_NO_PADDING, ''); return self::convertByteToHexString($result); }else{ return 'KEY/内容为空'; } }catch (Exception $exception){ $exception->getTrace(); } } private static function hexStringToBytes($hexString){ $len=strlen($hexString); $buf=''; $i=0; $j=0; if(($len%2)==1){ $buf[$j++]=chr(self::fromDigit($hexString[$i++])); } while ($i<$len){ $buf[$j++]=chr((self::fromDigit($hexString[$i++])<<4)|self::fromDigit($hexString[$i++])); } return implode($buf); } private static function convertByteToHexString($bytes){ $result=''; for ($i=0;$i<strlen($bytes);$i++){ $temp=ord($bytes[$i])&0xff; $tempHex=dechex($temp); if(strlen($tempHex)<2){ $result.='0'.$tempHex; }else{ $result.=$tempHex; } } return $result; } private static function fromDigit($ch){ if (ord($ch) >= ord('0') && ord($ch)<= ord('9')) { return ord($ch) - ord('0'); } if (ord($ch) >= ord('A') && ord($ch) <= ord('F')) { return ord($ch) - ord('A') + 10; } if (ord($ch) >= ord('a') && ord($ch) <= ord('f')) { return ord($ch) - ord('a') + 10; } throw new InvalidArgumentException('invalid hex digit:'.$ch); } } echo ThreeDesUtil::encryptMode('010203040506070818082322380201F2','A1A2A3A4A5A6A7AF'); //echo ThreeDesUtil::decryptMode('010203040506070818082322380201F2','19BD70BCF1855728');

得到结果和工具测试结果一样。加密结果为:19bd70bcf1855728

转载请注明原文地址: https://www.6miu.com/read-5034355.html

最新回复(0)