class String
def from_hex()
self.chop()
string = self.scan(/[a-fA-F0-9]{2}/).map{|x| x.hex.chr}.join
return string
end
def to_hex()
return self.split("").map{|x| x.unpack('H*')}.join
end
def ^ (key) # Define an xor operator
accum = []
hex_bytes = []
key_bytes = []
key = key.chr if key.is_a? Fixnum and key < 255 #Lets us handle Fixnum or String keys
raise RangeError, "Integer Keys can be only 1 byte" if key.is_a? Fixnum #raise an error if it's too long
raise "Invalid XOR key type #{key.class}" unless key.is_a? String #Else raise an exception
self.to_hex.split("").each_slice(2) {|x| hex_bytes << x.join}
key.to_hex.split("").each_slice(2) {|x| key_bytes << x.join}
hex_bytes.each_with_index{|h,i| accum << (h.to_i(16) ^ key_bytes[i.modulo key_bytes.size].to_i(16)).chr}
return accum.join
end
end
def cribdrag(ciphertext, crib)
ciphertext.length.times{ |x| puts "#{x} : #{ciphertext[x,crib.length] ^ crib}"}
end
fuck = "0f351c71c7654ff251de056ea68920cf2d7d49e53ff9174bd303fc04d74e7e69ad9cb9bf56160c2aea960d002b139b6b8f25982fe2e6e9f158a2451944c3f623d19dc425648beceb621f38768abb4f47ad46176b7b04b3c069a0c4da3b0dd3bea96a54b7e4453989f86b55ba8b635b90f944".from_hex ^ "0829003df52058a155c90553e9cc2cdc646f46a233f34347d542e8159e49713faad9a3a74753116ffb90484937468f6f9525bf28f2aaafe542b317080bc5e970829dc5287c8be8e130176d798bf6445aa34f1539121efbd56fe590d6374acaabbb725486ff4939a2e9394cb6957c56b4fd5798002ecccf00350445bc033eb8d79dc007fb2240f2afbbd3ec2b704f9b".from_hex
cribdrag(fuck, "not")
Y2xhc3MgU3RyaW5nCiAgZGVmIGZyb21faGV4KCkKICAgICAgc2VsZi5jaG9wKCkKICAgICAgc3RyaW5nID0gc2VsZi5zY2FuKC9bYS1mQS1GMC05XXsyfS8pLm1hcHt8eHwgeC5oZXguY2hyfS5qb2luCiAgICAgIHJldHVybiBzdHJpbmcKICBlbmQKCiAgZGVmIHRvX2hleCgpCiAgICAgIHJldHVybiBzZWxmLnNwbGl0KCIiKS5tYXB7fHh8IHgudW5wYWNrKCdIKicpfS5qb2luCiAgZW5kCgogIGRlZiBeIChrZXkpICMgRGVmaW5lIGFuIHhvciBvcGVyYXRvcgogICAgICBhY2N1bSA9IFtdCiAgICAgIGhleF9ieXRlcyA9IFtdCiAgICAgIGtleV9ieXRlcyA9IFtdCgogICAgICBrZXkgPSBrZXkuY2hyIGlmIGtleS5pc19hPyBGaXhudW0gYW5kIGtleSA8IDI1NSAjTGV0cyB1cyBoYW5kbGUgRml4bnVtIG9yIFN0cmluZyBrZXlzCiAgICAgIHJhaXNlIFJhbmdlRXJyb3IsICJJbnRlZ2VyIEtleXMgY2FuIGJlIG9ubHkgMSBieXRlIiBpZiBrZXkuaXNfYT8gRml4bnVtICNyYWlzZSBhbiBlcnJvciBpZiBpdCdzIHRvbyBsb25nCiAgICAgIHJhaXNlICJJbnZhbGlkIFhPUiBrZXkgdHlwZSAje2tleS5jbGFzc30iIHVubGVzcyBrZXkuaXNfYT8gU3RyaW5nICNFbHNlIHJhaXNlIGFuIGV4Y2VwdGlvbgoKICAgICAgc2VsZi50b19oZXguc3BsaXQoIiIpLmVhY2hfc2xpY2UoMikge3x4fCBoZXhfYnl0ZXMgPDwgeC5qb2lufQogICAgICBrZXkudG9faGV4LnNwbGl0KCIiKS5lYWNoX3NsaWNlKDIpIHt8eHwga2V5X2J5dGVzIDw8IHguam9pbn0KICAgICAgaGV4X2J5dGVzLmVhY2hfd2l0aF9pbmRleHt8aCxpfCBhY2N1bSA8PCAoaC50b19pKDE2KSBeIGtleV9ieXRlc1tpLm1vZHVsbyBrZXlfYnl0ZXMuc2l6ZV0udG9faSgxNikpLmNocn0KICAgICAgcmV0dXJuIGFjY3VtLmpvaW4KICBlbmQKZW5kCgoKZGVmIGNyaWJkcmFnKGNpcGhlcnRleHQsIGNyaWIpCgljaXBoZXJ0ZXh0Lmxlbmd0aC50aW1lc3sgfHh8IHB1dHMgIiN7eH0gOiAje2NpcGhlcnRleHRbeCxjcmliLmxlbmd0aF0gXiBjcmlifSJ9CmVuZAoKZnVjayA9ICIwZjM1MWM3MWM3NjU0ZmYyNTFkZTA1NmVhNjg5MjBjZjJkN2Q0OWU1M2ZmOTE3NGJkMzAzZmMwNGQ3NGU3ZTY5YWQ5Y2I5YmY1NjE2MGMyYWVhOTYwZDAwMmIxMzliNmI4ZjI1OTgyZmUyZTZlOWYxNThhMjQ1MTk0NGMzZjYyM2QxOWRjNDI1NjQ4YmVjZWI2MjFmMzg3NjhhYmI0ZjQ3YWQ0NjE3NmI3YjA0YjNjMDY5YTBjNGRhM2IwZGQzYmVhOTZhNTRiN2U0NDUzOTg5Zjg2YjU1YmE4YjYzNWI5MGY5NDQiLmZyb21faGV4IF4gIjA4MjkwMDNkZjUyMDU4YTE1NWM5MDU1M2U5Y2MyY2RjNjQ2ZjQ2YTIzM2YzNDM0N2Q1NDJlODE1OWU0OTcxM2ZhYWQ5YTNhNzQ3NTMxMTZmZmI5MDQ4NDkzNzQ2OGY2Zjk1MjViZjI4ZjJhYWFmZTU0MmIzMTcwODBiYzVlOTcwODI5ZGM1Mjg3YzhiZThlMTMwMTc2ZDc5OGJmNjQ0NWFhMzRmMTUzOTEyMWVmYmQ1NmZlNTkwZDYzNzRhY2FhYmJiNzI1NDg2ZmY0OTM5YTJlOTM5NGNiNjk1N2M1NmI0ZmQ1Nzk4MDAyZWNjY2YwMDM1MDQ0NWJjMDMzZWI4ZDc5ZGMwMDdmYjIyNDBmMmFmYmJkM2VjMmI3MDRmOWIiLmZyb21faGV4CmNyaWJkcmFnKGZ1Y2ssICJub3QiKQ==