PHP中的加密和解密算法

时间:2015-12-16 09:49:45

标签: php algorithm codeigniter encryption cryptography

我想加密我发送给API的数据。为此,我需要在PHP中使用更安全的加密和解密算法。目前我正在使用codeigniter开发我的应用程序。

实际上,通过阅读一些堆栈溢出论坛,我们无法解密md5转换后的字符串。但我们有在线MD5解密。

  

它们如何运作?

3 个答案:

答案 0 :(得分:3)

正如其他答案所示,MD5不是加密方法,您需要使用某种加密算法。

我会说你应该选择业界最好的AES加密技术,你会得到每种语言的支持类,即OBJC / PHP / JAVA / .NET / NODE.JS等。

由于您在CodeIgnitor工作,我有一个您可以直接使用的库,我希望它能解决您的问题。

这是库代码,只是为了使用php的MCRYPT扩展来更新它,这通常在大多数服务器中启用。 图书馆类

<?php
defined('BASEPATH') OR exit('No direct script access allowed');
Class Api_encrypt
{

    protected $CI;
    private $_encryptKey;
    private $_MD5Key;
    private $_MD5IV;
    private $_apiParams;

    public function __construct()
    {
        $this->CI = & get_instance();
        $this->_encryptKey = $this->CI->config->item("WS_ENC_KEY");
        $this->_MD5Key = substr(md5($this->_encryptKey), 0, 16);
        $this->_MD5IV = str_repeat("\0", mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));
    }

    public function encrypt($sValue = '')
    {
        $block = 16;
        $pad = $block - (strlen($sValue) % $block);
        $sValue .= str_repeat(chr($pad), $pad);
        $str_output = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->_MD5Key, $sValue, MCRYPT_MODE_CBC, $this->_MD5IV));
        $str_output = str_replace(array('+', '/', '='), array('-', '_', '.'), $str_output);
        return $str_output;
    }

    public function decrypt($sValue = '')
    {
        //$sValue = str_replace('~','+',$sValue);
        $sValue = str_replace(array('-', '_', '.'), array('+', '/', '='), $sValue);
        $sValue = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->_MD5Key, base64_decode($sValue), MCRYPT_MODE_CBC, $this->_MD5IV);
        $block = 16;
        $pad = ord($sValue[($len = strlen($sValue)) - 1]);
        $len = strlen($sValue);
        $pad = ord($sValue[$len - 1]);
        $str_output = substr($sValue, 0, strlen($sValue) - $pad);
        return $str_output;
    }

    public function encryptData($sValue = '')
    {
        $block = 16;
        $pad = $block - (strlen($sValue) % $block);
        $sValue .= str_repeat(chr($pad), $pad);
        $str_output = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $this->_MD5Key, $sValue, MCRYPT_MODE_CBC, $this->_MD5IV));
        return $str_output;
    }

    public function decryptData($sValue = '')
    {
        $str_output = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $this->_MD5Key, base64_decode($sValue), MCRYPT_MODE_CBC, $this->_MD5IV);
        $block = 16;
        $pad = ord($str_output[($len = strlen($str_output)) - 1]);
        $len = strlen($str_output);
        $pad = ord($str_output[$len - 1]);
        $str_output = substr($str_output, 0, strlen($str_output) - $pad);
        return $str_output;
    }

    public function decrypt_params($request_arr = array())
    {
        if (!is_array($request_arr) || count($request_arr) == 0) {
            return $request_arr;
        }
        foreach ($request_arr as $key => $val) {
            $param_val = str_replace(' ', '+', $val);
            $request_arr[$key] = $this->decryptData($param_val);
        }
        return $request_arr;
    }
}

以下是有关如何使用此库的代码。

//In Controller
$request_params = $this->input->get_post(NULL, TRUE);
$this->load->library('api_encrypt');
$decrypt_params = $this->api_encrypt->decrypt_params($request_params);

//do operations
//prepare response array

$encrypt_str = $this->api_encrypt->encrypt($response);

由于您声明您正在使用PHP开发API - CI我建议您查看工具&gt; Configure.IT,它们提供了一个可视化界面,我们可以通过它创建API,它们还将为我们可以用来在我们自己的服务器上部署的API提供生成的源代码。我已经将它用于某些项目,它确实帮助了我。

答案 1 :(得分:1)

MD5不是加密,它是Hashing。

无法撤消MD5哈希值。您在线找到的工具通过保留md5哈希结果的数据库来对md5哈希进行反向工程。

如果您想在PHP中查看加密,这是一个很好的开始https://stackoverflow.com/a/30189841/1164668

答案 2 :(得分:-1)

(注意:它是一个核心的php函数)

###### Password  #############
function encrypt($data)
{
    for($i = 0, $key = 27, $c = 48; $i <= 255; $i++)
    {
       $c = 255 & ($key ^ ($c << 1));
       $table[$key] = $c;
       $key = 255 & ($key + 1);
    }
    $len = strlen($data);
    for($i = 0; $i < $len; $i++)
    {
       $data[$i] = chr($table[ord($data[$i])]);
    }
    return base64_encode($data);
}

#########Password Decrypt ##########

function decrypt($data)
{

    $data = base64_decode($data);
    for($i = 0, $key = 27, $c = 48; $i <= 255; $i++)
    {
        $c = 255 & ($key ^ ($c << 1));
        $table[$c] = $key;
        $key = 255 & ($key + 1);
    }
    $len = strlen($data);
    for($i = 0; $i < $len; $i++)
    {
        $data[$i] = chr($table[ord($data[$i])]);
    }
    return $data;
}