要求:
1.加密后的长度和加密前的长度一样长
2.加密后的字符串中只允许出现a到z中的字母和0到9的数字
3.根据秘钥可以再算回来
加密前的字符串也都是字母和数字的组合
如加密前的字符串:us3kqvu

解决方案 »

  1.   

    凯撒密码$key = '3ae';
    $s = caesar_encode('us3kqvu', $key);
    echo "$s\n";
    echo caesar_decode($s, $key);function caesar_encode($s, $k) {
      $k = "$k";
      for($i=0; $i<strlen($k); $i++) {
        $d = base_convert($k{$i}, 36, 10);
        $t = '';
        for($j=0; $j<strlen($s); $j++)
          $t .= base_convert((base_convert($s{$j}, 36, 10)+$d)%36, 10, 36);
        $s = $t;
      }
      return $t;
    }
    function caesar_decode($s, $k) {
      $k = "$k";
      for($i=0; $i<strlen($k); $i++) {
        $d = 36 - base_convert($k{$i}, 36, 10);
        $t = '';
        for($j=0; $j<strlen($s); $j++)
          $t .= base_convert((base_convert($s{$j}, 36, 10)+$d)%36, 10, 36);
        $s = $t;
      }
      return $t;
    }
    密文:ljubhml
    原文:us3kqvu
      

  2.   

    凯撒密码 通过移动字符表映射来实现的,理论上不存在重复的可能性所谓 移动字符表映射 就是例如
    原文 abcd
    移动距离 4
    密文 efgh
      

  3.   

    一个字节有8位(bit),6位则有2^6=64种可能,字母+数字合计62个
    所以有个映射表就能压缩到6位内6位转6位的位运算就多的是了,任君选择,再反向映射为字母数字上面的过程都是可逆的