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