Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/246.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 需要帮助确保文本移位';x';空格的数量转换为字母,而不是随机符号_Php_String_Encryption_Ascii_Caesar Cipher - Fatal编程技术网

Php 需要帮助确保文本移位';x';空格的数量转换为字母,而不是随机符号

Php 需要帮助确保文本移位';x';空格的数量转换为字母,而不是随机符号,php,string,encryption,ascii,caesar-cipher,Php,String,Encryption,Ascii,Caesar Cipher,我正在写一篇关于密码学的文章,我决定加入一个凯撒密码,一种将字母“X”左右移动的方法。示例:使用移位参数2加密字母“A”。A=>C 下面的代码工作得有点得体。它能够对我输入的文本进行加密/解密,只要它在某些ASCII值之间 ASCII中的值65-90为大写字母,97-122为小写字母。我的问题是,如果我的移位参数太大,以至于我超过了这些间隔 假设我有字母“A”,我想用移位参数100加密它。如果我尝试这样做,字母“A”将变成这个字符(),它无法显示在我的浏览器中,并被转换成一个奇怪的问号 我的问题

我正在写一篇关于密码学的文章,我决定加入一个凯撒密码,一种将字母“X”左右移动的方法。示例:使用移位参数2加密字母“A”。A=>C

下面的代码工作得有点得体。它能够对我输入的文本进行加密/解密,只要它在某些ASCII值之间

ASCII中的值65-90为大写字母,97-122为小写字母。我的问题是,如果我的移位参数太大,以至于我超过了这些间隔

假设我有字母“A”,我想用移位参数100加密它。如果我尝试这样做,字母“A”将变成这个字符(),它无法显示在我的浏览器中,并被转换成一个奇怪的问号

我的问题是,我有什么选择来避免这些奇怪的符号?有没有可能使它只包含字母(大写和小写)以及数字

我希望你能帮助我。我将整天在线,所以如果您需要更多信息,请询问:-)

我的表单字段:

<form method="post">
<input type="text" name="textCaesarEncrypt" autocomplete="off" placeholder="Indtast tekst">
<input type="number" name="shiftCaesarEncrypt" autocomplete="off">
<label>Krypter</label>
<input type="radio" name="caesarEncryptOrDecrypt" value="caesarEncrypt">
<label>Dekrypter</label>
<input type="radio" name="caesarEncryptOrDecrypt" value="caesarDecrypt">
<input type="submit" name="submitCaesarEncrypt" value="Videre">

氪星
氪星

我的PHP:

    <?php
        $caesarEncryptOrDecrypt = $_POST ["caesarEncryptOrDecrypt"];

     if (!empty($_POST['textCaesarEncrypt']) AND 
     !empty($_POST['shiftCaesarEncrypt'])){

$string = $_POST['textCaesarEncrypt'];
$shift = $_POST['shiftCaesarEncrypt'];
$shiftedString = "";


if($caesarEncryptOrDecrypt == "caesarEncrypt") {
    for ($i = 0; $i < strlen($string); $i++) {
        $ascii = ord($string[$i]);
        $shiftedChar = chr($ascii + $shift);

        $shiftedString .= $shiftedChar;
    }
    echo $shiftedString;
}

if($caesarEncryptOrDecrypt == "caesarDecrypt") {
    for ($i = 0; $i < strlen($string); $i++) {
        $ascii = ord($string[$i]);
        $shiftedChar = chr($ascii - $shift);

        $shiftedString .= $shiftedChar;
    }
    echo $shiftedString;


}

}   
?>

首先,重要的是,它太弱,,弱,太弱,很容易被破坏

当然,你不想使用2000多年前使用过的加密系统

凯撒大帝:公元前100年7月13日至公元前44年3月15日)


但是,这里的密钥在上一个公式中-在加密情况下-:

要解密加密数据,您需要使用下一个公式:

$shiftedChar = chr((($ascii - $shift) % 26) + $range);
//                          ^ notice this

其中En(x)表示加密字符,x=字符,n=移位值


然而,这个公式对人类来说很好,但对计算机来说不一样,人类只有26个拉丁字符,而计算机有ASCII,由128表示,我们也不关心字母的大小写,所以Hello=Hello对我们来说,而对于代表as 97和as 65的计算机来说,它是不一样的

因此,您需要将ASCII转换为简单的1-26字符范围

在这里,我将在加密部分实现一个简单的编辑,我希望这能帮助您实现代码其余部分的解密

for ($i = 0, $n = strlen($string); $i < $n; $i++) {
    $char = $string[$i];
    // here we are checking the character type
    // to set the range which will be used later
    if (ctype_upper($char)) {
        $range = 65;
    } else if (ctype_lower($char)) {
        $range = 97;
    }
    // convert the ascii indexed chars into alphabetic indexed chars
    $ascii = ord($char) - $range;
    // the caesar folrmula based on alphabetic indexed chars
    $shiftedChar = chr((($ascii + $shift) % 26) + $range);
    $shiftedString .= $shiftedChar;
}
echo $shiftedString;
还可以按如下方式更改您的范围:

if (ctype_upper($char)) {
    $range = 90; // start with Z
} else if (ctype_lower($char)) {
    $range = 122; // start with z
}


另一个非常有用的资源,这是一个Caesar cipher C教程,但它的概念相同。

谢谢,我来看看。我知道它不是很安全,我这样做只是为了演示它是如何工作的。我还举了一个RSA的例子(它也已经过时了),但更多的是为了演示它是如何工作的,我并没有将它用于其他任何事情:)我想我在解密部分找到了它。我颠倒了范围,所以A不是65,A是97,Z是90,Z是122。我还更改了$shiftedChar=chr((($ascii+$shift)%26)+$range);,所以它现在显示$ascii-$shift。这似乎有效,但想知道您是否也会这样做?:)不客气,如果我明白了你的意思,我认为在Caesar密码上下文中使用ctype_alpha可以避免非字母符号问题“我认为我必须将消息拆分为一个数组”你不必这么做,基本上字符串是一个字符序列-数组,所以在for循环中,像这样做
$string[$i]
您将字符串视为基本正确的数组。array\u walk&array\u map相当于foreach或for循环