class Sakide

Public Class Methods

new(keyfile) click to toggle source
# File lib/sakide.rb, line 17
def initialize(keyfile)
  f = File.open keyfile, "r"
  keyinfo = f.read(38)
  f.close
  k1 = keyinfo[14,8]
  k2 = keyinfo[22,8] 
  @iv = keyinfo[30,8]
  @key = k1+k2+k1
end

Public Instance Methods

decode(crypto) click to toggle source
# File lib/sakide.rb, line 58
def decode(crypto)
  arr = crypto.split '&'
  outs = ''
  pid = ''
  arr.count.times do |i|
    outs += arr[i][5..-1] if arr[i][0,5].upcase == 'DATA='
    pid = arr[i].upcase[4,7] if arr[i].upcase[0,4] == 'PID='
  end
  outs = CGI.unescape outs
  outs = Base64.strict_decode64 outs
  lastc = outs[-1].ord
  validpad = 1
  lastc.times do |i|
    validpad = 0 if outs[(outs.size-1-i),1].ord != lastc
  end
  outs = outs[0,(outs.size-lastc)] if validpad == 1
  td = Mcrypt.new(:tripledes, :cbc, @key, @iv, '')
  outs = td.decrypt outs
  lastc = outs[-1].ord
  validpad = 1
  lastc.times do |i|
    validpad = 0 if outs[(-1-i)].ord != lastc
  end
  outs = outs[0,(outs.size-lastc)] if validpad == 1
  crc = outs[(outs.size-4)..-1]
  crch = ''
  4.times do |i|
    crch += crc[i].ord.to_s(16).rjust(2, '0')
  end
  outs = outs[0,(outs.size-4)]
  crc = Zlib::crc32(outs).to_s(16).rjust(8, '0')
  if crch != crc
    ''
  else
    outs.gsub!('&', '%26')
    outs.gsub!('=', '%3D')
    outs = CGI.unescape(outs)
    "CRYPTO=1&#{outs}"
  end
end
encode(plaintext) click to toggle source
# File lib/sakide.rb, line 27
def encode(plaintext)
  arr = plaintext.split '&'
  outs = ''
  pid = ''
  arr.count.times do |i|
    outs += "&#{arr[i]}" if arr[i].upcase != 'CRYPTO=1'
    pid = arr[i].upcase[4,7] if arr[i].upcase[0,4] == 'PID='
  end
  outs = outs[1..-1]
  outs = CGI.escape outs
  outs.gsub!('%3D', '=')
  outs.gsub!('%26', '&')
  crc = Zlib::crc32(outs).to_s(16).rjust(8, '0')
  4.times do |i|
    outs += crc[i*2,2].to_i(16).chr
  end
  pad = 8 - (outs.length % 8)
  pad.times do |i|
    outs += pad.chr
  end
  td = Mcrypt.new(:tripledes, :cbc, @key, @iv, '')
  outs = td.encrypt outs
  pad = 3 - (outs.length % 3)
  pad.times do |i|
    outs += pad.chr
  end
  outs = Base64.strict_encode64 outs
  outs = CGI.escape(outs) # no clue why we need strip, without that we get an extra new line
  "PID=#{pid}&CRYPTO=1&DATA=#{outs}"
end