php DES加解密?

/**
     * 16进制转字符串
     * @param string $hex
     * @return string
     */
    public function hexToStr(string $hex)
    {
        $string = "";
        for ($i = 0; $i < strlen($hex) - 1; $i += 2)
            $string .= chr(hexdec($hex[$i] . $hex[$i + 1]));
        return  $string;
    }

    /**
     * 解密
     * @param string $str
     * @param string $key
     * @return string
     */
    public function desDecrypt(string $str, string $key)
    {
        $base64 = base64_encode($this->hexToStr($str));
        return openssl_decrypt($base64, 'des-ecb', $key);
    }

上述方法是des的解密,请问一下加密该如何操作,能够让加密出来的结果,通过desDecrypt可以解密出来。试了好久没有搞出来

$test = openssl_encrypt($string, 'des-ecb', $key, 0);
var_dump(bin2hex(base64_decode($test)));
写了如上的加密,貌似是可以了,就是不知道对不对

阅读 2.4k
3 个回答

没有加密的代码,当然就不能加密咯!
下面是我补充完整后的代码:

<?php
class DES {
    private $key;
    
    public function __construct($key) {
        $this->key = $key;
    }

    /**
     * 16进制转字符串
     * @param string $hex
     * @return string
     */
    public function hexToStr($hex)
    {
        $string = "";
        for ($i = 0; $i < strlen($hex); $i += 2)
            $string .= chr(hexdec($hex[$i] . $hex[$i + 1]));
        return $string;
    }

    /**
     * 字符串转16进制
     * @param string $string
     * @return string
     */
    public function strToHex($string)
    {
        $hex = "";
        for ($i = 0; $i < strlen($string); $i++)
            $hex .= dechex(ord($string[$i]));
        return $hex;
    }

    /**
     * 加密
     * @param string $str
     * @return string
     */
    public function desEncrypt($str)
    {
        $base64 = base64_encode(openssl_encrypt($str, 'des-ecb', $this->key));
        return $this->strToHex($base64);
    }

    /**
     * 解密
     * @param string $str
     * @return string
     */
    public function desDecrypt($str)
    {
        $base64 = base64_decode($this->hexToStr($str));
        return openssl_decrypt($base64, 'des-ecb', $this->key);
    }
}

$key = "testkey";
$des = new DES($key);
$name = "123";
$encryptedName = $des->desEncrypt($name);
echo "加密: " . $encryptedName . "\n";
$decryptedName = $des->desDecrypt($encryptedName);
echo "解密: " . $decryptedName . "\n";
?>

openssl_encrypt openssl_decrypt 去看文档吧

https://www.php.net/manual/zh/function.openssl-decrypt.php
https://www.php.net/manual/zh/function.openssl-encrypt.php

$method = 'DES-ECB';
$key = 'sg202303';
$data = '> 本文参与了[SegmentFault 思否面试闯关挑战赛](https://segmentfault.com/a/1190000043508712),欢迎正在阅读的你也加入。';

$result = openssl_encrypt($data, $method, $key);
var_dump($result);

var_dump(openssl_decrypt($result, $method, $key));

输出

➜  ~ php -v
PHP 8.0.0 (cli) (built: Nov 30 2020 13:47:29) ( NTS )
Copyright (c) The PHP Group
Zend Engine v4.0.0-dev, Copyright (c) Zend Technologies
    with Zend OPcache v8.0.0, Copyright (c), by Zend Technologies

➜ ~ php xx.php
string(192) "P+fEE0NngTu8Ak1E78zGGds3ozPA+M6h1u8v/FMih/Wi1k3YM/q+In+3wUgTv1XGhViBxCRYpqofV5ih0BN+vZTf2fnT4VbH59eRTAQoyl+4ePrKtVf1FngTbcBAT3CHNaYVUIXMbsAUpLwpcgMhJlqM6k4qbzqnEndrIMCzkkyk413alLIUy2/Fo97PvGdR"
string(143) "> 本文参与了[SegmentFault 思否面试闯关挑战赛](https://segmentfault.com/a/1190000043508712),欢迎正在阅读的你也加入。"

本文参与了SegmentFault 思否面试闯关挑战赛,欢迎正在阅读的你也加入。

你碰到的问题是不是别人给你的加密数据不是base64格式的数据,而是16进制的?由于你没有提供加密后的数据,你可以尝试如下办法

<?php
$password         = '123456';

$str="helloworld";


$encryptedString  =  '81499397a138934e8c516e5ae7cc6cf1'; //helloworld加密后的HEX



$opensslDecrypt   = openssl_decrypt(hex2bin($encryptedString),'DES-ECB', $password, OPENSSL_ZERO_PADDING | OPENSSL_RAW_DATA );

var_dump($opensslDecrypt);
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题