有没有办法在 PHP 中对字符串使用 Caeser 加密?我来自.net,所以我不太了解。
举个例子:
original
aaaaaa
after ceaser encryption
bbbbbb
下一个例子:
original
abcd
after ceaser encryption
bcde
任何人都可以用echo $output;
有没有办法在 PHP 中对字符串使用 Caeser 加密?我来自.net,所以我不太了解。
举个例子:
original
aaaaaa
after ceaser encryption
bbbbbb
下一个例子:
original
abcd
after ceaser encryption
bcde
任何人都可以用echo $output;
我想这就是你要找的东西:
<?php
/**
* Rotate each string characters by n positions in ASCII table
* To encode use positive n, to decode - negative.
* With n = 13 (ROT13), encode and decode n can be positive.
*
* @param string $string
* @param integer $n
* @return string
*/
function rotate($string, $n) {
$length = strlen($string);
$result = '';
for($i = 0; $i < $length; $i++) {
$ascii = ord($string{$i});
$rotated = $ascii;
if ($ascii > 64 && $ascii < 91) {
$rotated += $n;
$rotated > 90 && $rotated += -90 + 64;
$rotated < 65 && $rotated += -64 + 90;
} elseif ($ascii > 96 && $ascii < 123) {
$rotated += $n;
$rotated > 122 && $rotated += -122 + 96;
$rotated < 97 && $rotated += -96 + 122;
}
$result .= chr($rotated);
}
return $result;
}
$enc = rotate('string', 6);
echo "Encoded: $enc<br/>\n";
echo 'Decoded: ' . rotate($enc, -6);
?>
这是一个适用于 ASCII 字母的版本:
function caesar($str, $shift) {
$len = strlen($str);
$ord_alpha_upper = ord('A');
$ord_alpha_lower = ord('a');
$shift = $shift % 26 + 26; // takes care of negative shifts
for($i = 0; $i < $len; ++$i) {
$chr = $str[$i];
if (ctype_upper($chr)) {
$str[$i] = chr($ord_alpha_upper + (ord($chr) - $ord_alpha_upper + $shift) % 26);
}
else if (ctype_lower($chr)) {
$str[$i] = chr($ord_alpha_lower + (ord($chr) - $ord_alpha_lower + $shift) % 26);
}
}
return $str;
}
您可以同时使用正位移和负位移,无论位移距离如何,它都能正常工作。
但是,请注意 PHP 没有字符编码的概念(字符串实际上是字节数组),因此如果输入不是单字节编码或 UTF-8,这将无法正常工作。