需要帮助确保文本移位'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年)
然而,这里的关键是旁边公式 - 在加密病例中:
而解密您加密的数据,则需要使用的下式:
其中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教程,但它有相同的概念。
谢谢,我会看看它。 我知道它不是很安全,我只是这样做来演示它是如何工作的。我也有一个RSA的例子(它也变得过时了),但更多的是演示它的工作原理,我没有真正使用它来做其他任何事情:) – Nico
我想我已经找到了解密部分。我倒过来了范围,所以A不是65,A是97,Z是90,Z是122。我也改变了$ shiftChar = chr((($ ascii + $ shift)%26)+ $ range),所以它现在说$ ascii - $ shift。它似乎工作,但想知道这是否你也会这样做? :) – Nico
@Nico是的,你是对的:-) – hassan