其它加密算法也可以,只要是只有数字和字母的密文。在线等!!!
加密完 base64 一下
#1 楼 @doitian def self.encode(str) return '' if str.blank? des = OpenSSL::Cipher::Cipher.new(ALG) des.pkcs5_keyivgen(KEY, DES_KEY) des.encrypt cipher = des.update(str) cipher << des.final return Base64.encode64(cipher) end 现在已经 base64 了,还是有非数字和英文的字符。
#1 楼 @doitian 请教了 谢谢
#5 楼 @ruby_new base64 是有 +, / 和 padding 字符 = 的,如果不怕浪费位数,可以转成 hex。
+
/
=
如果想短点,可以自己写个 base62,把字符串按位从 8 进制转到 62 进制。这个效率肯定没 base64 高,因为 64 可以每四位每四位的转。所以可以考虑转成 32 进制。
还可以在 base64 基础上作下 escape。encode 的时候 0 => 00, + => 01, / => 02。padding 的 = 可以删掉,因为是可以算出来的。decode 的时候先换回来再加上 padding
0 => 00, + => 01, / => 02
#6 楼 @doitian 你说的好深奥 我看不太明白 具体怎么做啊 有源码吗 上边是我的加密算法 谢谢啦
这段密文用二进制表示,就只有 1 和 0,用 4 进制表示就只有 0-3,用 8 进制就只有 0-7,用 16 进制就只有 0-9 和 a-f。任何数据都可以这样表示。base64 就是 64 进制的表示方式的一种 ruby 可以这样转换成 16 进制字符串表示 xxx.each_byte.map{|b| b.to_s(16)}.join 这样转换之后占用空间会翻倍,因为原本 4bit 的数据,要用 8bit 来存了
可以试试 base32,不过占用空间更多 http://en.wikipedia.org/wiki/Base32
#7 楼 @ruby_new 就是进制转换啊。加密出来的东西可以看成是 8 进制数,每个 byte 是一位。62 位就是用所有字母和数字总共 62 个代表 0 ~ 61。
Escape 的方案就像字符串,可以用特殊序列来替代特殊字符,比如 \n 是换行。我举的例子就是用 0 来做 escape char,如果换成常用的 \ 其实就是
\n
\
\\ 表示 \ 本身 \1 表示符号 + \2 表示符号 /