Ruby ruby 用 Des 加密算法,如何生成只有数字和字母的密文。

ruby_new · 2013年08月15日 · 最后由 doitian 回复于 2013年08月15日 · 8516 次阅读

其它加密算法也可以,只要是只有数字和字母的密文。在线等!!!

加密完 base64 一下

2 楼 已删除

#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 了,还是有非数字和英文的字符。

4 楼 已删除

#5 楼 @ruby_new base64 是有 +, / 和 padding 字符 = 的,如果不怕浪费位数,可以转成 hex。

如果想短点,可以自己写个 base62,把字符串按位从 8 进制转到 62 进制。这个效率肯定没 base64 高,因为 64 可以每四位每四位的转。所以可以考虑转成 32 进制。

还可以在 base64 基础上作下 escape。encode 的时候 0 => 00, + => 01, / => 02。padding 的 = 可以删掉,因为是可以算出来的。decode 的时候先换回来再加上 padding

#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,如果换成常用的 \ 其实就是

\\   表示 \ 本身
\1  表示符号 +
\2  表示符号 /
需要 登录 后方可回复, 如果你还没有账号请 注册新账号