2

好的,我正在尝试在将文件上传到服务器时对其进行加密。我在 stackoverflow 上找到代码,但是我在植入它时遇到了问题。我得到了错误 unexpected '(', expecting ',' or ';' in where/the/file/is.php。它指向const KEY = md5('somesecretcode');线。我知道它是说它期待在 之后的行尾md5,但我不知道为什么?您认为它会接受现在“加密”的字符串作为有效字符串。如果需要,我会上传更多代码。提前感谢您的帮助!我对此很陌生,所以请不要太粗鲁。

这是代码

<?php

class Encryption
{
const CYPHER = MCRYPT_RIJNDAEL_256;
const MODE   = MCRYPT_MODE_CBC;
const KEY    = md5('somesecretcode');

public function encrypt($plaintext)
{
    $td = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
    $iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
    mcrypt_generic_init($td, self::KEY, $iv);
    $crypttext = mcrypt_generic($td, $plaintext);
    mcrypt_generic_deinit($td);
    return base64_encode($iv.$crypttext);
}

public function decrypt($crypttext)
{
    $crypttext = base64_decode($crypttext);
    $plaintext = '';
    $td        = mcrypt_module_open(self::CYPHER, '', self::MODE, '');
    $ivsize    = mcrypt_enc_get_iv_size($td);
    $iv        = substr($crypttext, 0, $ivsize);
    $crypttext = substr($crypttext, $ivsize);
    if ($iv)
    {
        mcrypt_generic_init($td, self::KEY, $iv);
        $plaintext = mdecrypt_generic($td, $crypttext);
    }
    return trim($plaintext);
}
}

?>

我这样称呼它...

$encrypted_string = Encryption::encrypt('this is a test'); // Åž-\Ž“kcþ1ÿ4gî:Xƒã%
$decrypted_string = Encryption::decrypt($encrypted_string); // this is a test
4

3 回答 3

6

您不能将函数调用或数组与const. 您将不得不找到另一种设置常量的方法(或者只是硬编码 的值md5('somesecretcode'))。

于 2012-10-08T20:44:40.350 回答
2

您不能使用“const”,因为它会在编译时解析,此时函数调用尚不可能。

您可以像这样使用定义功能

define('KEY', md5('somesecretcode'));

这是一个函数,在运行时执行并且可以工作。您必须将其放置在可以执行的地方——例如类构造函数。

但是在这种情况下使用 define 并不是一个很好的设计,因为创建类的实例会将一些内容写入全局(或命名空间)范围。

所以你需要重新考虑你的解决方案。如果您坚持保持静态方法调用,也许将秘密作为输入参数传递给函数?

于 2012-10-08T21:03:41.923 回答
1

const您不应该使用函数来初始化constructor.
您可以改为:

class Encryption
{
    const CYPHER = MCRYPT_RIJNDAEL_256;
    const MODE   = MCRYPT_MODE_CBC;
    const KEY    = '';

    public function __construct(){
        $this->KEY = md5('somesecretphrase');
    }
...

更新
这不是真的!
尽管这段代码似乎在工作,但它真正做的是创建另一个名为的对象成员KEY(即使它没有$- 这有点令人困惑)并将其分配给md5('somesecretphrase'). 该成员不是常数,可以随时更改。 可以引用
的类成员保持为空!KEYself::KEY

于 2012-10-08T20:56:56.343 回答