Project1

标题: [解禁] RM 实现 Base64 字符串加密和解密 [打印本页]

作者: hide秀    时间: 2008-9-5 05:18
标题: [解禁] RM 实现 Base64 字符串加密和解密
本帖最后由 后知后觉 于 2009-12-6 17:38 编辑

还是用RM实现了{/wx}

目前我测试下来的速度 Zlib快这个2倍

代码因该还有改进的空间

为什么解禁了呢 因为密钥的关系 可以自己定义 比如颠倒码表顺序

只要没人知道你密钥 就难以解出正确字符串


=begin
  
   Base64加密算法
  
   作者: 秀秀
   
   使用方法:
   
   1.加密

   Base64.encode64(string)
   
     string必须是字符串
   
   2.解密
   
   Base64.decode64(string)
   
     string必须是Base64加密过的字符串
   
   例子:
   
    a = Base64.encode64("张三李四abcd1234")

    p Base64.decode64(a)
   
   
=end


module Base64
  
  module_function
  
  # 码表
  
  CharBase64 = {
  0 => "A", 17 => "R", 34 => "i", 51 => "z",
  1 => "B", 18 => "S", 35 => "j", 52 => "0",
  2 => "C", 19 => "T", 36 => "k", 53 => "1",
  3 => "D", 20 => "U", 37 => "l", 54 => "2",
  4 => "E", 21 => "V", 38 => "m", 55 => "3",
  5 => "F", 22 => "W", 39 => "n", 56 => "4",
  6 => "G", 23 => "X", 40 => "o", 57 => "5",
  7 => "H", 24 => "Y", 41 => "p", 58 => "6",
  8 => "I", 25 => "Z", 42 => "q", 59 => "7",
  9 => "J", 26 => "a", 43 => "r", 60 => "8",
  10 => "K", 27 => "b", 44 => "s", 61 => "9",
  11 => "L", 28 => "c", 45 => "t", 62 => "+",
  12 => "M", 29 => "d", 46 => "u", 63 => "/",
  13 => "N", 30 => "e", 47 => "v", 64 => "=",
  14 => "O", 31 => "f", 48 => "w",
  15 => "P", 32 => "g", 49 => "x",
  16 => "Q", 33 => "h", 50 => "y"
  }

  # 加密
  def encode64(str)
   
    raise "参数不是一个字符串" unless str.kind_of?(String)
   
    tstr = str.unpack("B*")

    size = tstr[0].size/6
    ysize = tstr[0].size%6

    tstr2 = []
    for i in 0...size
      tstr2 << tstr[0][i*6,6]
    end  
   
    # 割断码
    if tstr[0].size%6 != 0
      tstr2 << tstr[0][size*6,ysize] + ("0"*(6-ysize))
      ym = (6- ysize)/2
    end
   
    # 补足码
    tstr2.collect!{|n|CharBase64[eval("0b"+"00"+n)]}

    # 特殊码
    if ysize != 0
      case ym
      when 1
        tstr2 << CharBase64[64]
      when 2
        tstr2 << CharBase64[64]
        tstr2 << CharBase64[64]
      end  
    end  
    return tstr2.join
  end
  
  # 解密
  def decode64(str)
    stra = str.split(//)
   
    t = 0
    stra.each{|n|
    t += 1 if n == CharBase64[64]
    }
   
    t.times{stra.pop}
   
    strb = []
    strc = ""
   
    dbase64 = CharBase64.invert

    stra.each {|n|strb << dbase64[n]}
   
    strb.collect! do |n|   
     n.to_s(2).length != 6 ? "0"*(6 - n.to_s(2).length) + n.to_s(2) : n.to_s(2)
    end  
   
    if t > 0
      tt = strb[strb.size-1]
      t*2.times{tt.slice!(tt.size-1,1)}
      strb[strb.size-1] = tt
    end

    strb.each{|n|strc+=n}

    return [strc].pack("B*").delete("\000")


# 以下是放弃的一些比较慢的算法
=begin
    stra.each do |n|
      for i in CharBase64.soft
        if i[1] == n
          strb << i[0]
          break
        end
      end  
    end

    strb.each do |n|
      if n.to_s(2).length != 6
        l = 6 - n.to_s(2).length
        strc += "0"*l + n.to_s(2)
      else
        strc += n.to_s(2)
      end  
    end

    for i in 0...strc.size/6
      strd << strc[6*i,6]
    end
=end

  end

end  


class Hash < Object
  def soft
    @temp = []
    self.each_pair{|key, value| @temp << [key,value] }
    return @temp
  end  
end
作者: dna_7086    时间: 2008-9-5 08:06
提示: 作者被禁止或删除 内容自动屏蔽
作者: 灼眼的夏娜    时间: 2008-9-5 16:09
呵~··
作者: cmzjbczzf    时间: 2008-9-5 16:52
请问……怎么使用呢?


编程盲飘过~~~
作者: hide秀    时间: 2008-9-5 21:15
不是有使用说明的吗....

有人测试过吗 效率如何?
作者: 龙轩    时间: 2008-9-6 23:11
提示: 作者被禁止或删除 内容自动屏蔽
作者: 越前リョーマ    时间: 2008-9-7 01:07
加密游戏的?
还是干嘛的…… = =
作者: hide秀    时间: 2008-9-7 01:11
a = Base64.encode64("张三李四abcd1234")

   p Base64.decode64(a)

先把以上代码放到脚本里去

a = Base64.encode64("张三李四abcd1234")
p a
p Base64.decode64(a)

这样运行下
就知道了

作者: cmzjbczzf    时间: 2008-9-7 01:14
刚才研究了一下

还是不会加密

我错了~

指点一下好么
作者: 神隐小子    时间: 2008-9-7 01:40
夏娜出现了...
作者: 马甲穿上马甲    时间: 2008-9-7 02:00
提示: 作者被禁止或删除 内容自动屏蔽
作者: 马甲穿上马甲    时间: 2008-9-7 02:03
提示: 作者被禁止或删除 内容自动屏蔽
作者: 轮回者    时间: 2008-9-7 17:34
Ruby原版其实自带一个" Base64 字符串加密和解密"
LZ可以看看
作者: hide秀    时间: 2008-9-7 19:14
Ruby原版其实自带一个" Base64 字符串加密和解密"
LZ可以看看

Ruby自带的那个Base64 其实 就是 string.unpack("m") 和 [string].pack("m")
RM里面也一样可以实现,等于是公开的 直接可以实现Base64加密和解密
我重写了这个目的 可以自定义码表 就不容易破解了 {/wx}
作者: 浩气青天    时间: 2008-9-7 19:28
未了解是干什么的额。
作者: suicaoya123    时间: 2008-9-7 19:48
# 码表

CharBase64 = {
0 => "A", 17 => "R", 34 => "i", 51 => "z",
1 => "B", 18 => "S", 35 => "j", 52 => "0",
2 => "C", 19 => "T", 36 => "k", 53 => "1",
3 => "D", 20 => "U", 37 => "l", 54 => "2",
4 => "E", 21 => "V", 38 => "m", 55 => "3",
5 => "F", 22 => "W", 39 => "n", 56 => "4",
6 => "G", 23 => "X", 40 => "o", 57 => "5",
7 => "H", 24 => "Y", 41 => "p", 58 => "6",
8 => "I", 25 => "Z", 42 => "q", 59 => "7",
9 => "J", 26 => "a", 43 => "r", 60 => "8",
10 => "K", 27 => "b", 44 => "s", 61 => "9",
11 => "L", 28 => "c", 45 => "t", 62 => "+",
12 => "M", 29 => "d", 46 => "u", 63 => "/",
13 => "N", 30 => "e", 47 => "v", 64 => "=",
14 => "O", 31 => "f", 48 => "w",
15 => "P", 32 => "g", 49 => "x",
16 => "Q", 33 => "h", 50 => "y"


不明白这段!难道是输入解码....
作者: yangff    时间: 2008-9-7 21:15
以下引用suicaoya123于2008-9-7 11:48:49的发言:


# 码表

CharBase64 = {
0 => "A", 17 => "R", 34 => "i", 51 => "z",
1 => "B", 18 => "S", 35 => "j", 52 => "0",
2 => "C", 19 => "T", 36 => "k", 53 => "1",
3 => "D", 20 => "U", 37 => "l", 54 => "2",
4 => "E", 21 => "V", 38 => "m", 55 => "3",
5 => "F", 22 => "W", 39 => "n", 56 => "4",
6 => "G", 23 => "X", 40 => "o", 57 => "5",
7 => "H", 24 => "Y", 41 => "p", 58 => "6",
8 => "I", 25 => "Z", 42 => "q", 59 => "7",
9 => "J", 26 => "a", 43 => "r", 60 => "8",
10 => "K", 27 => "b", 44 => "s", 61 => "9",
11 => "L", 28 => "c", 45 => "t", 62 => "+",
12 => "M", 29 => "d", 46 => "u", 63 => "/",
13 => "N", 30 => "e", 47 => "v", 64 => "=",
14 => "O", 31 => "f", 48 => "w",
15 => "P", 32 => "g", 49 => "x",
16 => "Q", 33 => "h", 50 => "y"



不明白这段!难道是输入解码....

Base对字符串进行ASC+转2进制补码到8位之后每六位转成10进制然后再码表里找到相应的编号.
作者: dna_7086    时间: 2008-9-8 19:29
提示: 作者被禁止或删除 内容自动屏蔽
作者: hide秀    时间: 2008-9-8 20:34
hide兄看看RUBY原配的BASE64,你调试下和你的效率哪个高吧~~~~

这个是ruby库里面的 其实就是string.unpack("m")
测试20000个字节。。。发现要比unpack("m")快不少.....

作者: 轮回者    时间: 2009-6-12 08:00
编码表




欢迎光临 Project1 (https://rpg.blue/) Powered by Discuz! X3.1