2

このスクリプトを試していますが、文字エンコードが変更され続けています。

    $v1 = "text1";
    $v2 = "text2";
    $v3 = "text3";

    $result = encrypt($v1 . ":" . $v2 . ":" . $v3, SALT);
    $result = decrypt($result , SALT);
    list($v1, $v2, $v3) = explode(":", $result);
    echo mb_detect_encoding($v1); // gives ASCII
    echo mb_detect_encoding($v2); // gives ASCII
    echo mb_detect_encoding($v3); // gives UTF-8 <<<<

しかし、それが与える別の変数を追加することによって:

    $v1 = "text1";
    $v2 = "text2";
    $v3 = "text3";
    $result = encrypt($v1 . ":" . $v2 . ":" . $v3. ":COTROLFLAG", SALT);
    $result = decrypt($result , SALT);
    list($v1, $v2, $v3, $v4) = explode(":", $result);
    echo mb_detect_encoding($v1); // gives ASCII
    echo mb_detect_encoding($v2); // gives ASCII
    echo mb_detect_encoding($v3); // gives ASCII <<<<
    echo mb_detect_encoding($v4); // gives ASCII

誰か助けてもらえますか?

これらは、暗号化および復号化機能です。

    function encrypt($str, $key)
    {
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $block = mcrypt_get_block_size('des', 'ecb');
        if (($pad = $block - (strlen($str) % $block)) < $block) {
            $str .= str_repeat(chr($pad), $pad);
        }
        $result = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, $str, MCRYPT_MODE_ECB, $iv));
        return $result;
    }
    function decrypt($str, $key)
    {
        $str = base64_decode($str);
        $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
        $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
        $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $str, MCRYPT_MODE_ECB, $iv);
        $block = mcrypt_get_block_size('des', 'ecb');
        $pad = ord($str[($len = strlen($str)) - 1]);
        if ($pad && $pad < $block && preg_match('/' . chr($pad) . '{' . $pad . '}$/i', $str)) {
            return substr($str, 0, strlen($str) - $pad);
        }
        return $str;
    }

最初の答えの後、私はどこで解決策を探すべきかを知っていました。

私はこれをパディングしてストリップするのを見つけました:

function addpadding($string, $blocksize = 32){
    $len = strlen($string);
    $pad = $blocksize - ($len % $blocksize);
    $string .= str_repeat(chr($pad), $pad);
    return $string;
}
function strippadding($string){
    $slast = ord(substr($string, -1));
    $slastc = chr($slast);
    $pcheck = substr($string, -$slast);
    if(preg_match("/$slastc{".$slast."}/", $string)){
        $string = substr($string, 0, strlen($string)-$slast);
        return $string;
    } else {
        return false;
    }
}

変更された暗号化および復号化機能:

function encrypt($str, $key)
{   
    global $domain;
    $key = base64_decode($key);
    $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
    $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
    setcookie("IV_CODE", $iv, time()+86400, "/", $domain);//more security

    $enc = base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, addpadding($str), MCRYPT_MODE_CBC, $iv));
    return $enc;
}
function decrypt($str, $key)
{
    $str = base64_decode($str);
    $iv = (isset($_COOKIE['IV_CODE'])) ? base64_decode($_COOKIE['IV_CODE']) : 0;
    if ($iv != 0) {
        $key = base64_decode($key);
        $dec = strippadding(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $str, MCRYPT_MODE_CBC, $iv));    
        return $dec;
    }
    return false;
}

ありがとうございました

4

1 に答える 1

1

これはexplodeとは何の関係もありません、それはあなたの暗号化と復号化機能です。私は推測を危険にさらし、これを言うでしょう

if (($pad = $block - (strlen($str) % $block)) < $block) {
    $str .= str_repeat(chr($pad), $pad);
}

php.netAES_256のこの投稿で言及されたことと関係があります。(おそらくそれが何を言っているかを覚えておくべきです)MCRYPT_RIJNDAEL_128

ただし、decrypt()関数のコードには多くの誤りがあります。たとえば、パディングの長さが。の場合、正規表現パターンは簡単に壊れます27。また、大文字と小文字を区別しないようにする必要があります。==ただし、部分文字列を抽出し、次のように使用して比較する方が、おそらく簡単で確実に高速です。

$substr = substr($str, -$pad);
if ($pad && $pad < $block && $substr == str_repeat(chr($pad), $pad)) {
    return substr($str, 0, -$pad);
}
于 2013-01-17T23:46:37.417 に答える