Advertisement
Sepheus

ONI.rb

Nov 26th, 2012
696
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 7.12 KB | None | 0 0
  1. require 'base64'
  2. require 'chunky_png'
  3.  
  4.  
  5. class ChunkyPNG::Image
  6.     def to_red_stream
  7.         self.to_rgb_stream.unpack('axx'*(self.to_rgb_stream.length/3)).join
  8.     end
  9.    
  10.     def to_green_stream
  11.         self.to_rgb_stream.unpack('xax'*(self.to_rgb_stream.length/3)).join
  12.     end
  13.    
  14.     def to_blue_stream
  15.         self.to_rgb_stream.unpack('xxa'*(self.to_rgb_stream.length/3)).join
  16.     end
  17.    
  18.     def to_argb_stream
  19.         rgba = self.to_rgba_stream.split("")
  20.         (0..rgba.length-1).step(4).map { |n| "#{rgba[n+3]}#{rgba[n]}#{rgba[n+1]}#{rgba[n+2]}" }.join
  21.     end
  22.    
  23.     def get_bytes(stream,type)
  24.         if stream == "alpha" then stream = "alpha_channel" end
  25.         values = self.send("to_#{stream}_stream".to_sym).each_byte.map { |n| (n >> type) & 1 }
  26.         values.fill(0,values.length..(8*(values.length/8.0).ceil)-1)
  27.         (0..(values.length)-1).step(8).map { |n| (values[n] << 7 | values[n+1] << 6 | values[n+2] << 5 | values[n+3] << 4 | values[n+4] << 3 | values[n+5] << 2 | values[n+6] << 1 | values[n+7] ).chr  }.join
  28.     end
  29.    
  30.     [:get_alpha_lsb_bytes,:get_red_lsb_bytes,:get_green_lsb_bytes,:get_blue_lsb_bytes,:get_alpha_msb_bytes,:get_red_msb_bytes,:get_green_msb_bytes,:get_blue_msb_bytes].each { |method|
  31.         define_method(method) {
  32.             method.to_s.split("_")[2] == "lsb" ? self.get_bytes(method.to_s.split("_")[1],0) : self.get_bytes(method.to_s.split("_")[1],7)
  33.         }
  34.     }
  35.    
  36.    
  37. end
  38.  
  39. class String
  40.     def rev_n
  41.         self.each_byte.map { |n| ((n & 0x0F) << 4 | (n & 0xF0) >> 4).chr}.join
  42.     end
  43.     def rev_b
  44.         self.rev_n.reverse
  45.     end
  46.     def decode64
  47.         Base64.decode64(self)
  48.     end
  49.     def encode64
  50.         Base64.strict_encode64(self)
  51.     end
  52.     def reverse64
  53.         Base64.reverse64(self)
  54.     end
  55.     def decrypt(key)
  56.         Toolkit.decrypt(key,self)
  57.     end
  58.     def unmunge(key)
  59.         Toolkit.unmunge(key,self)
  60.     end
  61.     def lookahead(key)
  62.         Toolkit.lookahead(key,self)
  63.     end
  64.     def to_b(mode='b')
  65.         case mode.downcase
  66.         when 'b'
  67.             self.split("").map { |n| n.to_i }.to_b
  68.         when 'h'
  69.             self.to_bin
  70.         end
  71.     end
  72.     def shift_c(value)
  73.         self.each_byte.map { |n| ((n+value)&0xFF).chr }.join
  74.     end
  75.     def shift_k(key)
  76.         key = key.unpack("C*")
  77.         data = self.unpack("C*")
  78.         data.length.times.map { |n| ((data[n] - key[n%key.size])&0xFF) }.pack("C*")
  79.     end
  80.     def shift_p(key)
  81.         data = self.unpack("C*")
  82.         data.length.times.map { |n| ((data[n] - key[n%key.size])&0xFF) }.pack("C*")
  83.     end
  84.     def save(filename)
  85.         IO.binwrite(filename,self)
  86.     end
  87.     def interleave(second)
  88.         self.split("").zip(second.split("")).join
  89.     end
  90.     def to_bin
  91.         Toolkit.to_bin(self)
  92.     end
  93.     def calendar
  94.         Toolkit.calendar(self)
  95.     end
  96. end
  97.  
  98. class Array
  99.     def to_b
  100.         self.fill(0,self.length..(8*(self.length/8.0).ceil)-1)
  101.         (0..(self.length)-1).step(8).map { |n| (self[n] << 7 | self[n+1] << 6 | self[n+2] << 5 | self[n+3] << 4 | self[n+4] << 3 | self[n+5] << 2 | self[n+6] << 1 | self[n+7] ).chr  }.join
  102.     end
  103. end
  104.  
  105. module Base64
  106.     def self.analyze(b64)
  107.         (Set.new(b64.split("")) ^ Set.new([*('A'..'Z'),*('a'..'z'),*('0'..'9')]+"+/?=".split("")))
  108.     end
  109.     def self.reverse64(b64)
  110.         Base64.decode64(Base64.encode64(b64).reverse)
  111.     end
  112. end
  113.  
  114. module Toolkit
  115.     def self.mergeB64(*args)
  116.         (0..args.length-2).each.inject(args[0].split("")) { |n,i| n.zip(args[i+1].split("")) }.map { |n| n.flatten.group_by { |e| e }.values.max_by(&:size).first }.join
  117.     end
  118.     def self.to_bin(hexcode)
  119.         hexcode.scan(/[[:xdigit:]]{2}/).map { |n| n.to_i(16) }.pack("C*")
  120.     end
  121.    
  122.     def self.calendar(data)
  123.         deltas = [31,59,90,120,151,181,212,243,273,304,334,365]
  124.         out = ""
  125.         count = data.length
  126.         offset = 31
  127.         n = 1
  128.         until offset >= count
  129.             out << data[offset]
  130.             offset = deltas[n%12]+n+(n/12)*365
  131.             n+=1
  132.         end
  133.         return out
  134.     end
  135.    
  136.     def self.unmunge(key,datanode)
  137.         key = key.split("").map { |n| (n.ord % 10) }
  138.         key += key.reverse[0,key.length-1]
  139.         return (0..(datanode.length/10)-1).each.map { |row| datanode[10*row+key[row % key.size]] }.join
  140.     end
  141.    
  142.     def self.lookahead(key,datanode)
  143.         size = (datanode.length>>1)
  144.         a = b = k = 0
  145.         key = key.unpack("C*")
  146.         s = key.size
  147.         datanode = datanode.unpack("C*")
  148.         output = []
  149.         out_byte = Hash.new(lambda { |b,key_byte| ((b-key_byte)&0xFF) })
  150.         out_byte[1] = lambda { |b,key_byte| ((b+key_byte)&0xFF) }
  151.         size.times { |i|
  152.             k = key[i % s]
  153.             a = datanode[(i<<1)]
  154.             b = datanode[(i<<1)+1]
  155.             output << out_byte[a&1].call(b,k)
  156.         }
  157.         return output.pack("C*")
  158.     end
  159.  
  160.     def self.decrypt(key,datanode)
  161.         size = (datanode.length>>1)
  162.         a = b = k = d = 0
  163.         s = key.size
  164.         key = key.unpack("C*")
  165.         datanode = datanode.unpack("C*")
  166.         output = ""
  167.         size.times { |i|
  168.             k = key[i % s]
  169.             d = datanode[(i<<1)]
  170.             a = k & 1
  171.             b = datanode[(i<<1)+1] & 1
  172.             output << (((d + a)<<1)-b-k) % 256
  173.         }
  174.         return output
  175.     end
  176.    
  177.     def self.encrypt(key,datanode)
  178.         output = ""
  179.         a = b = d = k = 0
  180.         s = key.size
  181.         first_byte = Hash.new(lambda { |byte,b,key_byte| ((byte+b)+(key_byte)>>1) % 256 })
  182.         first_byte[1] =  lambda { |byte,b,key_byte| ((byte-b)+(key_byte)>>1) % 256 }
  183.         second_byte = Hash.new(lambda { (Random.rand(255) & 0xFE) })
  184.         second_byte[1] = lambda { (Random.rand(255) | 1) }
  185.         key = key.unpack("C*")
  186.         datanode = datanode.unpack("C*")
  187.         datanode.length.times { |i|
  188.             k = key[i % s]
  189.             d = datanode[i]
  190.             a = k & 1
  191.             b = d & 1
  192.             output << first_byte[a&b].call(d,b,k) << second_byte[a^b].call
  193.         }
  194.         return output
  195.     end
  196.     def self.combine(*args)
  197.         (0..args.length-2).each.inject(args[0]) { |n,i| n.zip(args[i+1]).map { |x,y| (x.ord|y.ord).chr} }.join
  198.     end
  199.    
  200.     def self.map(map,values)
  201.         map.each_key { |n| values.gsub!(n,map[n]) }
  202.         if map.max_by { |k,v| v }.last.ord > 1 then
  203.             values = values.unpack("C*")
  204.             (0..(values.length)-1).step(2).map { |n| ((values[n] << 4) | values[n+1]).chr }.join
  205.         else
  206.             values = values.ljust((8*(values.length/8.0).ceil),0x00.chr)
  207.             values = values.unpack("C*")
  208.             (0..(values.length)-1).step(8).map { |n| (values[n] << 7 | values[n+1] << 6 | values[n+2] << 5 | values[n+3] << 4 | values[n+4] << 3 | values[n+5] << 2 | values[n+6] << 1 | values[n+7] ).chr  }.join
  209.         end
  210.     end
  211.    
  212.     def self.freqs(values)
  213.         counts = Hash.new(0)
  214.         values.each { |n| counts[n] += 1 }
  215.         counts.sort_by { |k,v| v }.reverse
  216.     end
  217.    
  218.     def self.get_lsb_bytes(values)
  219.         values = values.each_byte.map { |n| n & 1 }
  220.         values.fill(0,values.length..(8*(values.length/8.0).ceil)-1)
  221.         (0..(values.length)-1).step(8).map { |n| (values[n] << 7 | values[n+1] << 6 | values[n+2] << 5 | values[n+3] << 4 | values[n+4] << 3 | values[n+5] << 2 | values[n+6] << 1 | values[n+7] ).chr  }.join
  222.     end
  223.     def self.get_msb_bytes(values)
  224.         values = values.each_byte.map { |n| (n>>7) & 1 }
  225.         values.fill(0,values.length..(8*(values.length/8.0).ceil)-1)
  226.         (0..(values.length)-1).step(8).map { |n| (values[n] << 7 | values[n+1] << 6 | values[n+2] << 5 | values[n+3] << 4 | values[n+4] << 3 | values[n+5] << 2 | values[n+6] << 1 | values[n+7] ).chr  }.join
  227.     end
  228. end
  229.  
  230. module Morse
  231.     @@m = [".-","-...","-.-.","-..",".","..-.","--.","....","..",".---","-.-",".-..","--","-.","---",".--.","--.-",".-.","...","-","..-","...-",".--","-..-","-.--","--..","-----",".----","..---","...--","....-",".....","-....","--...","---..","----."]
  232.     @@morse = Hash[*(@@m.zip([*('A'..'Z'),*('0'..'9')])).flatten]
  233.     def self.decode(s)
  234.         s.split(" ").map { |n| @@morse[n] }.join
  235.     end
  236. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement