3

Jon Skeetの面白いことを読んだ後、文字列を見つけました。それはROT13にあると思いました。推測を確認する前に、PHPで復号化してみようと思いました。これが私が持っていたものです:

$string = "Vs lbh nfxrq Oehpr Fpuarvre gb qrpelcg guvf, ur'q pehfu lbhe fxhyy jvgu uvf ynhtu.";
$tokens = str_split($string);
for ($i = 1; $i <= sizeof($tokens); $i++) {
    $char = $tokens[$i-1];
    for ($c = 1; $c <= 13; $c++) {
        $char++;
    }
    echo $char;
}

私の文字列はとして戻ってきますAIaf you aasakaead ABruacae Sacahnaeaiaer to adaeacrypt tahais, ahae'ad acrusah your sakualal waitah ahais alaauagah.

私の論理はかなり近いように見えますが、それは明らかに間違っています。手伝ってくれませんか。

4

5 に答える 5

8

試してみてくださいstr_rot13

http://us.php.net/manual/en/function.str-rot13.php

自分で作る必要はありません、それは内蔵されています。

于 2012-05-04T17:10:18.823 に答える
3

これは、ネストされたループを使用せずに機能する実装です。また、PHPの文字列を含む配列と同じように個々の文字にインデックスを付けることができるため、文字列を配列に分割する必要はありません。

ASCII大文字の範囲は65〜99であり、小文字の範囲は97〜122であることを知っておく必要があります。現在の文字がこれらの範囲のいずれかにある場合は、ASCII値に13を追加します。次に、アルファベットの先頭にロールオーバーする必要があるかどうかを確認します。ロールオーバーする必要がある場合は、26を引きます。

$string = "Vs lbh nfxrq Oehpr Fpuarvre gb qrpelcg guvf, ur'q pehfu lbhe fxhyy jvgu uvf ynhtu.";

for ($i = 0, $j = strlen( $string); $i < $j; $i++) 
{
    // Get the ASCII character for the current character
    $char = ord( $string[$i]); 

    // If that character is in the range A-Z or a-z, add 13 to its ASCII value
    if( ($char >= 65  && $char <= 90) || ($char >= 97 && $char <= 122)) 
    {
        $char += 13; 

        // If we should have wrapped around the alphabet, subtract 26
        if( $char > 122 || ( $char > 90 && ord( $string[$i]) <= 90)) 
        {
            $char -= 26;
        }
    }
    echo chr( $char);
}

これにより、次のものが生成されます。

ブルース・シュナイアーにこれを解読するように頼んだら、彼は笑いながらあなたの頭蓋骨を押しつぶします。

于 2012-05-04T17:31:12.167 に答える
2

これを自分で行いたい場合は、既存のソリューションを使用する代わりに、各文字がアルファベットの前半か後半かを確認する必要があります。各キャラクターに13を単純に追加することはできません(また、なぜループを使用して13を追加するのですか?!)。AMに13を加算し、NZから13を減算する必要があります。また、スペースなどの他の文字を変更してはなりません。

コードを変更して、変更する前に各文字が何であるかを確認します。これにより、変更するかどうか、および変更する方法がわかります。

于 2012-05-04T17:18:16.907 に答える
2

z ++はaaであるため、これは機能しません

$letter = "z";
$letter++;
echo($letter);

aaではなくaaを返します

編集:組み込みを使用しない可能な代替ソリューションは

$string = "Vs lbh nfxrq Oehpr Fpuarvre gb qrpelcg guvf, ur'q pehfu lbhe fxhyy jvgu uvf ynhtu.";
$tokens = str_split($string);

foreach($tokens as $char)
{
    $ord = ord($char);
    if (($ord >=65 && $ord <=90 ) || ($ord >= 97 && $ord <= 122))
    $ord = $ord+13;
    if (($ord > 90 && $ord < 110) || $ord > 122)
        $ord = $ord - 26;
    echo (chr($ord));
}
于 2012-05-04T17:32:58.407 に答える
0

パーティーに数年遅れましたが、私はあなたにこれを行うための別のオプションを与えると思いました

function rot13($string) {
    // split into array of ASCII values
    $string = array_map('ord', str_split($string));

    foreach ($string as $index => $char) {
        if (ctype_lower($char)) {
            // for lowercase subtract 97 to get character pos in alphabet
            $dec = ord('a');
        } elseif (ctype_upper($char)) {
            // for uppercase subtract 65 to get character pos in alphabet
            $dec = ord('A');
        } else {
            // preserve non-alphabetic chars
            $string[$index] = $char;
            continue;
        }
        // add 13 (mod 26) to the character
        $string[$index] = (($char - $dec + 13) % 26) + $dec;
    }

    // convert back to characters and glue back together
    return implode(array_map('chr', $string));
}
于 2018-01-20T02:16:59.380 に答える