0

URL でプライベート データを送信するための小さなクラスを作成しました (Cookie/セッションなどは使用できません)。PHPのmcryptで暗号化/復号化し、URLで使用するためにbase64-en/decodeしました。

残念ながら、私はまだ時々間違った結果になってしまいます。これは、少なくとも a+が URL に含まれている場合に常に発生することに気付きました。私もrawurlencodeurlencode/urldecodeをいじってみましたが、成功しませんでした。strtr()暗号化されたデータも試しましたが、どういうわけか+まだ表示されます。誰でもアイデアを得ましたか?

これが私のクラスです:

class crypto 
{
    public function __construct()
    {
        $this->iv_size = mcrypt_get_iv_size(MCRYPT_BLOWFISH, MCRYPT_MODE_ECB);
        $this->iv = mcrypt_create_iv($this->iv_size, MCRYPT_RAND);
        $this->llave = 'da332sdf9'; 
    }

    public function make_crypt($string)
    {   
        $crypt = mcrypt_encrypt(MCRYPT_BLOWFISH, $this->llave, $string, MCRYPT_MODE_ECB, $this->iv);
        $crypt = rawurlencode(base64_encode($crypt));
        $crypt = strtr($crypt, '+/', '-_');     
        return $crypt;
    }

    public function get_crypt($data)
    {   
        $crypt = strtr($crypt, '-_', '+/');     
        $data = base64_decode($data);
        $decrypted = mcrypt_decrypt (MCRYPT_BLOWFISH, $this->llave, $data, MCRYPT_MODE_ECB, $this->iv);
        return $decrypted;
    }
}
4

2 に答える 2

1

「成功せずに」URLエンコードを試したとはどういう意味ですか?値をエンコードするURLは機能します。そうでないと、関数が機能しなくなります。フレームワークで使用していますが、エラーはありません。

暗号化された値をエンコードしていますか?URL全体をエンコードしないでください。

于 2012-04-24T11:37:18.917 に答える
1

観察

$crypt = strtr($crypt, '-_', '+/');?? どこでcrypt定義されていますか?

rawurlencodeデコードはどこにありますか...。

安全なキャラクターHEXを気にする必要がないように、私はいつも好きですurl

現在のクラスが失敗するサンプルテスト

$crypt = new Crypto ();
echo "<pre>";
for($i = 0; $i < 10; $i ++) {
    $pass = generatePassword ( mt_rand ( 5, 10 ) );
    $test = $crypt->make_crypt ( $pass );
    $output = $crypt->get_crypt ( $test );

    if ($pass == $output) {
        echo " $pass ($test) = $output \n";
    } else {
        var_dump ( $pass, $output );
        echo " $pass ($test) != $output \n";
    }
}

解決

class Crypto {

    private $iv_size;
    private $iv;
    private $llave;

    public function __construct() {
        $this->iv_size = mcrypt_get_iv_size ( MCRYPT_BLOWFISH, MCRYPT_MODE_ECB );
        $this->iv = mcrypt_create_iv ( $this->iv_size, MCRYPT_RAND );
        $this->llave = 'da332sdf9';
    }

    public function make_crypt($string) {
        $crypt = mcrypt_encrypt ( MCRYPT_BLOWFISH, $this->llave, $string, MCRYPT_MODE_ECB, $this->iv );
        return bin2hex ( $crypt );
    }

    public function get_crypt($data) {
        $data = pack ( "H*", $data );
        $decrypted = mcrypt_decrypt ( MCRYPT_BLOWFISH, $this->llave, $data, MCRYPT_MODE_ECB, $this->iv );
        return trim ( $decrypted );
    }
}

ソリューションの出力

 tXHhC8fk4 (b929695d39555523348051a72d15baaf) = tXHhC8fk4 
 drKH9 (909994926fe5cd30) = drKH9 
 mNwh6K (10af1bb381338943) = mNwh6K 
 CJZvqwGX (aa705c290759b18d) = CJZvqwGX 
 Jt4W7j (bc7ee842041b9860) = Jt4W7j 
 tgCHXyPvm (9f46b74ef59ee70da1dda30b3e52fe92) = tgCHXyPvm 
 LYxhVj (9e2079cff9d54007) = LYxhVj 
 kR8WLwh3T (3e4606d65defc74f3c82af5fb095f41d) = kR8WLwh3T 
 Z8NqWM6RHj (1d9eea2358674d78cc43e024cba5ba48) = Z8NqWM6RHj 
 TtqRf7M (09ef38114bb729c4) = TtqRf7M 

データの生成に使用される関数

function generatePassword($length = 8) {
    $password = "";
    $possible = "2346789bcdfghjkmnpqrtvwxyzBCDFGHJKLMNPQRTVWXYZ";
    $maxlength = strlen ( $possible );
    if ($length > $maxlength) {
        $length = $maxlength;
    }
    $i = 0;
    while ( $i < $length ) {
        $char = substr ( $possible, mt_rand ( 0, $maxlength - 1 ), 1 );
        if (! strstr ( $password, $char )) {
            $password .= $char;
            $i ++;
        }

    }
    return $password;

}
于 2012-04-24T12:14:04.843 に答える