求高手,一个可逆的字符串加密算法

dz215136304 2013-09-11 11:19:41
要求支持汉字(非硬性要求),字母数字,小数点等,加密后的字符串由数字和字符组成,最好加密后和加密前的长度一样
如加密前的“www.qq.com”字符串
...全文
592 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
cnaaa8 2013-09-30
  • 打赏
  • 举报
回复
移位算法可以实现
dz215136304 2013-09-12
  • 打赏
  • 举报
回复
引用 13 楼 vvkl 的回复:
base64转换的还带了/和= 需替换成-_ 但是base64可以转换汉字等任意数据,每3个字符变4个,长了1/3。估计楼主认为太浪费了。 应该改成只转换指定的字符. 至少要能转换a-zA-Z0-9-_. 共65个合法字符。 而输出不能带点. 共64个合法字符,理论上至少会变长1/64。
理论上长1/64也可以 求算法
dz215136304 2013-09-11
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
如果不考虑汉字的话,只用凯撒加密就可以了
$s = 'www.qq.com~';

$k = 13;

//加密
for($i=0; $i<strlen($s); $i++) {
  $n = ord($s{$i}) + $k;
  if($n > 126) $n = ($n + 32) & 0x7f;
  $s{$i} = chr($n);
}
echo $s, PHP_EOL; //$$$;~~;p|z+

//解密
for($i=0; $i<strlen($s); $i++) {
  $n = ord($s{$i}) - $k;
  if($n < 32) $n = ($n - 32) & 0x7f;
  $s{$i} = chr($n);
}
echo $s; //www.qq.com~
此方法是不错,但是没达到我的要求,就是加密后的字符串只能有数字,字母
xuzuning 2013-09-11
  • 打赏
  • 举报
回复
如果不考虑汉字的话,只用凯撒加密就可以了
$s = 'www.qq.com~';

$k = 13;

//加密
for($i=0; $i<strlen($s); $i++) {
  $n = ord($s{$i}) + $k;
  if($n > 126) $n = ($n + 32) & 0x7f;
  $s{$i} = chr($n);
}
echo $s, PHP_EOL; //$$$;~~;p|z+

//解密
for($i=0; $i<strlen($s); $i++) {
  $n = ord($s{$i}) - $k;
  if($n < 32) $n = ($n - 32) & 0x7f;
  $s{$i} = chr($n);
}
echo $s; //www.qq.com~
dz215136304 2013-09-11
  • 打赏
  • 举报
回复
引用 1 楼 wfstock 的回复:
一样的话可以考虑置换算法,最简单的了;置换规则可以自己定义,
有代码吗
暖冬_WarmWinter 2013-09-11
  • 打赏
  • 举报
回复
一样的话可以考虑置换算法,最简单的了;置换规则可以自己定义,
vvkl 2013-09-11
  • 打赏
  • 举报
回复
base64转换的还带了/和= 需替换成-_ 但是base64可以转换汉字等任意数据,每3个字符变4个,长了1/3。估计楼主认为太浪费了。 应该改成只转换指定的字符. 至少要能转换a-zA-Z0-9-_. 共65个合法字符。 而输出不能带点. 共64个合法字符,理论上至少会变长1/64。
xuzuning 2013-09-11
  • 打赏
  • 举报
回复
一个字节只能表示 256 种状态 所有的压缩算法都是将连续相同的片段以: 计数 + 片段 的方式存储 所以压缩并不是总是能减少尺寸的
ImN1 2013-09-11
  • 打赏
  • 举报
回复
你了解一下字节的位(bit)知识就知道base64算是可视化非压缩加密的极限了 再想缩短就只能用压缩算法了
引用 9 楼 dz215136304 的回复:
[quote=引用 7 楼 xuzuning 的回复:] 把一个超出字母数字范围的字符非要用字母数字表示,还要不改变长度 “把大象放进冰箱里”不过是笑话而已,你也当真?
base64不就可以将'abcdefghijklmnopqrstuvwxyz1234567890_-.'转换成纯数字和字母的吗?就算长度稍微长点 也可以的 就是感觉base64太长了[/quote]
dz215136304 2013-09-11
  • 打赏
  • 举报
回复
引用 8 楼 snmr_com 的回复:
生成串只有字母数字的话,依据你红字部分的条件,不可能实现蓝字的要求 [quote=引用 楼主 dz215136304 的回复:] 要求支持汉字(非硬性要求),字母数字,小数点等,加密后的字符串由数字和字符组成,最好加密后和加密前的长度一样 如加密前的“www.qq.com”字符串
[/quote] 长度稍微长点 也可以
dz215136304 2013-09-11
  • 打赏
  • 举报
回复
引用 7 楼 xuzuning 的回复:
把一个超出字母数字范围的字符非要用字母数字表示,还要不改变长度 “把大象放进冰箱里”不过是笑话而已,你也当真?
base64不就可以将'abcdefghijklmnopqrstuvwxyz1234567890_-.'转换成纯数字和字母的吗?就算长度稍微长点 也可以的 就是感觉base64太长了
ImN1 2013-09-11
  • 打赏
  • 举报
回复
生成串只有字母数字的话,依据你红字部分的条件,不可能实现蓝字的要求
引用 楼主 dz215136304 的回复:
要求支持汉字(非硬性要求),字母数字,小数点等,加密后的字符串由数字和字符组成,最好加密后和加密前的长度一样 如加密前的“www.qq.com”字符串
xuzuning 2013-09-11
  • 打赏
  • 举报
回复
把一个超出字母数字范围的字符非要用字母数字表示,还要不改变长度 “把大象放进冰箱里”不过是笑话而已,你也当真?
xuzuning 2013-09-11
  • 打赏
  • 举报
回复
我没看错的话,你的要求是“加密后的字符串由数字和字符组成” 我不知道这个“字符”你又会作何解释
dz215136304 2013-09-11
  • 打赏
  • 举报
回复
引用 3 楼 xuzuning 的回复:
如果不考虑汉字的话,只用凯撒加密就可以了
$s = 'www.qq.com~';

$k = 13;

//加密
for($i=0; $i<strlen($s); $i++) {
  $n = ord($s{$i}) + $k;
  if($n > 126) $n = ($n + 32) & 0x7f;
  $s{$i} = chr($n);
}
echo $s, PHP_EOL; //$$$;~~;p|z+

//解密
for($i=0; $i<strlen($s); $i++) {
  $n = ord($s{$i}) - $k;
  if($n < 32) $n = ($n - 32) & 0x7f;
  $s{$i} = chr($n);
}
echo $s; //www.qq.com~
如'abcdefghijklmnopqrstuvwxyz1234567890_-.'这个字符串加密后,只能由字符串和数字、-、_组成,小数点被转换成其他的了

20,359

社区成员

发帖
与我相关
我的任务
社区描述
“超文本预处理器”,是在服务器端执行的脚本语言,尤其适用于Web开发并可嵌入HTML中。PHP语法利用了C、Java和Perl,该语言的主要目标是允许web开发人员快速编写动态网页。
phpphpstorm 技术论坛(原bbs)
社区管理员
  • 开源资源社区
  • phpstory
  • xuzuning
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧