2

この関数に問題があります。何も返されません。文字列 ` の両方の xor を取得したい原因がわかりません

<?php
if ($_SERVER['REQUEST_METHOD'] == "POST") {
    if (array_key_exists("back", $_POST)) {
        header('Location: index.php');
        exit;
    }
}
function xor_this($string) {

// Let's define our key here
 $key = ('ma');

 // Our plaintext/ciphertext
 $text =$string;

 // Our output text
 $outText = '';

 // Iterate through each character
 for($i=0;$i<strlen($text);)
 {
     for($j=0;$j<strlen($key);$j++,$i++)
     {
         $outText .= $text{$i} ^ $key{$j};
         echo 'i='.$i.', '.'j='.$j.', '.$outText{$i}.'<br />'; //for debugging
         echo $outText;
     }
 }  
 return $outText;
}
?>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <form name="confirm" action="index.php" method="POST">

            <table>
                <tr>
                    <td>La chaine a chiffrer :</td>
                    <td><?php echo $_POST['chaine']; ?></td>
                </tr>
                <tr>
                    <td>La cle de meme taille :</td>
                    <td><?php echo $_POST['cle']; ?></td>
                </tr>
                <tr>
                    <td>Le XOR :</td>
                    <td><?php  echo xor_this($_POST['chaine']); ?></td>
                </tr>
            </table>     
            <input type="submit" name="back" value="retour"/>

        </form>

    </body>
</html>
`

この問題について何か考えはありますか、事前に感謝します

- - - - - - - - - - 編集 - - - - - - - - - - - - -

私はあなたの答えを考慮しましたが、同じ問題があります:関数によって返された文字列には何も表示されません。ここに新しいコードがあります:

    <?php
session_start();
$flag = false;

function xor_this($chaine, $cle) {
 $chiffre = '';
 // Iterate through each character
 for($i=0;$i<strlen($chiffre);)
 {
         $chiffre .= $chaine{$i} ^ $cle{$i};         
         echo $chiffre;     
 }  
 return $chiffre;
}

?>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <?php
        if ($_SERVER["REQUEST_METHOD"] == "POST") {
            $data = array("chaine" => $_POST["chaine"], "cle" => $_POST["cle"]);
        }
        ?>
        <form name="logon" action="index.php" method="POST" >
            <table>
                <tr>
                    <td>La chaine a chiffrer :</td>
                    <td><input type="text" name="chaine" value="<?php if (!empty($data["chaine"])) echo $data["chaine"]; else echo ""; ?>" ></td>
                </tr>
                <tr>
                    <td>La cle de meme taille :</td>
                    <td><input type="text" name="cle" value="<?php if (!empty($data["cle"])) echo $data["cle"]; else echo ""; ?>" ></td>
                    <td>
                        <?php
                        if ($_SERVER["REQUEST_METHOD"] == "POST") {                            
                                if (strlen($_POST['chaine']) <> strlen($_POST['cle']))
                                    echo "la chaine et la cle sont de taille differente";
                        }
                        ?>
                    </td>
                </tr>
            </table>                                   
            <input type="submit" value="Chiffrer">
            <table>
                <tr>
                    <td>La chaine chiffre : </td>
                    <td>                        
                        <?php
                        if ($_SERVER["REQUEST_METHOD"] == "POST") {                            
                                if (strlen($_POST['chaine']) == strlen($_POST['cle']))
                                    echo bin2hex(xor_this($_POST["chaine"],$_POST["cle"]));
                        }
                        ?>
                    </td>
                </tr>
            </table>
        </form>  
    </body>
</html>

他に何か考えはありますか、ありがとう

4

1 に答える 1

1

あなたのコードはほぼ正しいです。主な問題は、すべての小文字が印刷可能な範囲外になることです。

bin2hex()結果を16進数で確認するために使用できます。

bin2hex(xor_this($string));

小文字のみを考慮すると、ASCII範囲は次のとおりです。[97, 122]またはバイナリ:

0110_0001
0111_1010

これが意味するのは、1つの小文字の場合、結果は常に次のようになるということです000x_xxxx

取得できる最大数は次のとおりです。 0001_1111、つまり31すべての小文字は印刷不可能な文字にマップされます。

より良いforループ

$textが$keyより短い場合に、Jonが指摘したように、内側のループに追加の条件を導入することで、エッジケースを修正できます。

ただし、次の代替案を検討してください。

$key = str_pad("", strlen($text), "ma");
for($i = 0; $i < strlen($text); $i++) {
    $outText .= $text[i] ^ $key[$i];
}
于 2012-11-12T12:25:38.840 に答える