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'));

これは関数であり、実行時に実行され、機能します。クラスコンストラクターなど、実行できる場所に配置する必要があります。

しかし、このコンテキストで定義を使用するのはあまり良い設計ではありません。クラスのインスタンスを作成すると、グローバル (または名前空間) スコープに何かが書き込まれるからです。

したがって、ソリューションを再考する必要があります。静的メソッド呼び出しを保持することを主張する場合は、シークレットを入力パラメーターとして関数に渡すことができますか?

于 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 に答える