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

问题描述:

我正在加密的页面上工作,并决定包括一个凯撒密码,一种方法, X'左侧或右侧的空间量。示例:使用移位参数2对字母“A”进行加密。A => C.需要帮助确保文本移位'x'的空间量被转换为字母,而不是随机符号

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

ASCII码中的值65-90是大写字母,97-122是小写字母。我的问题是如果我的移位参数太大,我超过了这些间隔。如果我尝试这样做,字母'A'变成这个字符(http://www.theasciicode.com.ar/ascii-codes/spanish-enye-capital-letter-n-tilde-enie-uppercase-ascii-code-165.gif),这个字符不能显示在我的浏览器,并转换成一个奇怪的问号。

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

我希望你能帮助我。我会在网上一整天,所以如果你需要任何详细信息,只问:-)

我的表单字段:

<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; 


} 

} 
?> 

第一值得一提的是,Caesar-Cipher is not recommended,它太弱,,弱,太弱,很容易被打破。

肯定你不想使用那些以前更多的2000年

凯撒使用的加密系统:7月13日在公元前100年 - 3月15日公元前44年)


然而,这里的关键是旁边公式 - 在加密病例中:

enter image description here

而解密您加密的数据,则需要使用的下式:

enter image description here

其中EN(X)是指加密炭,X =炭中,n =移位值;

formulas images source [wikipedia]


但是这个公式是对人类很不错,但不适合计算机,人类只有26个拉丁字符,而计算机有其代表由128个ASCII,也是我们不关心这样的信件,所以你好= heLLo对我们来说,而它与计算机不一样,它代表一个97和A一样的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; 

如果你想确保只有字母字符将被编码,您可以使用ctype_alpha来检查,这是返回true,如果字符是字母字符。

同样重要的是要注意到,在解密凯撒加密法,您需要将之前提到的使用下一个公式:

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

也改变你的范围如下:

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

另一个很有用的来源from cs50,这是一个凯撒密码C教程,但它有相同的概念。

+1

谢谢,我会看看它。 我知道它不是很安全,我只是这样做来演示它是如何工作的。我也有一个RSA的例子(它也变得过时了),但更多的是演示它的工作原理,我没有真正使用它来做其他任何事情:) – Nico

+1

我想我已经找到了解密部分。我倒过来了范围,所以A不是65,A是97,Z是90,Z是122。我也改变了$ shiftChar = chr((($ ascii + $ shift)%26)+ $ range),所以它现在说$ ascii - $ shift。它似乎工作,但想知道这是否你也会这样做? :) – Nico

+1

@Nico是的,你是对的:-) – hassan