0

有没有办法在 PHP 中对字符串使用 Caeser 加密?我来自.net,所以我不太了解。

举个例子:

original
aaaaaa
after ceaser encryption
bbbbbb

下一个例子:

original
abcd
after ceaser encryption
bcde

任何人都可以用echo $output;

4

2 回答 2

0

我想这就是你要找的东西:

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

?>
于 2013-08-16T09:18:31.793 回答
0

这是一个适用于 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,这将无法正常工作。

于 2013-08-16T09:21:27.900 回答