Advertisement
Guest User

Untitled

a guest
Oct 12th, 2019
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Ruby 2.44 KB | None | 0 0
  1. #!/usr/bin/env ruby
  2. # encoding: ASCII-8BIT
  3.  
  4. require 'base64'
  5. require 'digest'
  6. require 'json'
  7. require 'openssl'
  8. require 'securerandom'
  9. require 'zlib'
  10.  
  11. Dir.chdir(File.dirname(__FILE__))
  12.  
  13. SIZE = 1024
  14. L = SIZE / 4 - 1
  15. CAFE = "\xCA\xFE\x12\x04"
  16.  
  17. class String
  18.   def enhex
  19.     self.unpack('H*')[0]
  20.   end
  21. end
  22.  
  23. def gg(msg)
  24.   puts "\e[1;31mMEOW! #{msg}\e[0m"
  25.   exit 1
  26. end
  27.  
  28. def gen_key
  29.   e = 3.to_bn
  30.   p = OpenSSL::BN::generate_prime(SIZE, false)
  31.   q = OpenSSL::BN::generate_prime(SIZE, false)
  32.   n = p * q
  33.   phi = (p - 1) * (q - 1)
  34.   d = e.mod_inverse(phi)
  35.   [e, d, n]
  36. end
  37.  
  38. def H(m)
  39.   Digest::SHA256.hexdigest(m).to_i(16).to_bn
  40. end
  41.  
  42. def unpad(s)
  43.   gg 'meow zzz' unless s.size == L && s[0, 4] == CAFE
  44.   s[4..-1].gsub(/^\x00*/, '')
  45. end
  46.  
  47. def pad(s)
  48.   zero = L - 4 - s.size
  49.   gg 'meooooooooooooooooow' unless zero >= 0
  50.   CAFE + "\x00" * zero + s
  51. end
  52.  
  53. def sign(m, d, n)
  54.   h = H(m)
  55.   nonce = SecureRandom.base64(6)
  56.   obj = {hash: h.to_i, nonce: nonce}
  57.   num = pad(Zlib.deflate(obj.to_json)).enhex.to_i(16).to_bn
  58.   gg 'meow??' if num >= n
  59.   num.mod_exp(d, n)
  60. rescue
  61.   gg 'meeeeeow'
  62. end
  63.  
  64. def verify(m, sig, e, n)
  65.   num = sig.mod_exp(e, n)
  66.   obj = JSON[Zlib.inflate(unpad(num.to_s(2)))]
  67.   gg 'meow T_T' if obj['hash'] != H(m)
  68.   gg 'meowwww' unless obj['nonce'] && Base64::decode64(obj['nonce']).size == 6
  69.   true
  70. rescue
  71.   false
  72. end
  73.  
  74. def decrypt(m, d, n)
  75.   gg 'meow :(' unless m >= 0 && m < n
  76.   c = m.mod_exp(d, n).to_s(2)
  77.   unpad(c)
  78. rescue
  79.   nil
  80. end
  81.  
  82. FLAG = IO.read('flag')
  83.  
  84. # CATS ARE TRUE COLOR!!!
  85. CATS = Dir.glob('cat/cat*')
  86.  
  87. $stdout.sync = true
  88.  
  89. def main
  90.   e, d, n = gen_key
  91.   loop do
  92.     puts 'meow?'
  93.     cmd = gets.strip
  94.     case cmd
  95.     when 'meow~'
  96.       puts 'meow~'
  97.       msg = gets.strip
  98.       gg 'meow :O' if msg.size > 128
  99.       gg 'meow?!' if msg.include?('meow')
  100.       puts sign(msg, d, n)
  101.     when 'meow!'
  102.       puts 'meow meow~'
  103.       admin_cmd = decrypt(gets.strip.to_i(16).to_bn, d, n)
  104.       gg 'meow?' if admin_cmd.nil?
  105.       case admin_cmd
  106.       when /^meow(.)$/
  107.         # meow? meow!
  108.         meow = $1
  109.         puts 'meow meow meow?'
  110.         sig = gets.strip.to_i(16).to_bn
  111.         if verify(admin_cmd, sig, e, n)
  112.           system(meow)
  113.         else
  114.           gg 'meow!?'
  115.         end
  116.       when 'meow'
  117.         puts IO.read(CATS.sample)
  118.       else
  119.         puts 'meow...!'
  120.       end
  121.     when 'meow.'
  122.       break
  123.     else
  124.       puts 'meow...?'
  125.     end
  126.   end
  127. end
  128.  
  129. main
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement