Php 需要帮助确保文本移位';x';空格的数量转换为字母,而不是随机符号
我正在写一篇关于密码学的文章,我决定加入一个凯撒密码,一种将字母“X”左右移动的方法。示例:使用移位参数2加密字母“A”。A=>C 下面的代码工作得有点得体。它能够对我输入的文本进行加密/解密,只要它在某些ASCII值之间 ASCII中的值65-90为大写字母,97-122为小写字母。我的问题是,如果我的移位参数太大,以至于我超过了这些间隔 假设我有字母“A”,我想用移位参数100加密它。如果我尝试这样做,字母“A”将变成这个字符(),它无法显示在我的浏览器中,并被转换成一个奇怪的问号 我的问题是,我有什么选择来避免这些奇怪的符号?有没有可能使它只包含字母(大写和小写)以及数字 我希望你能帮助我。我将整天在线,所以如果您需要更多信息,请询问:-) 我的表单字段: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”将变成这个字符(),它无法显示在我的浏览器中,并被转换成一个奇怪的问号 我的问题
<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循环