123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-"
- """
- UFONet - DDoS Botnet via Web Abuse - 2013/2014/2015/2016 - by psy (epsylon@riseup.net)
- You should have received a copy of the GNU General Public License along
- with UFONet; if not, write to the Free Software Foundation, Inc., 51
- Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
- """
- ###################################################################
- # Code extracted from project: AnonTwi (anontwi.03c8.net)
- ###################################################################
- KEY_SIZE = 32
- BLOCK_SIZE = 16
- MAC_SIZE = 20
- from os import urandom
- from hashlib import sha1, sha256
- from Crypto.Cipher import AES
- from base64 import b64encode, b64decode
- trans_5C = "".join([chr (x ^ 0x5c) for x in xrange(256)])
- trans_36 = "".join([chr (x ^ 0x36) for x in xrange(256)])
- def hmac_sha1(key, msg):
- if len(key) > 20:
- key = sha1(key).digest()
- key += chr(0) * (20 - len(key))
- o_key_pad = key.translate(trans_5C)
- i_key_pad = key.translate(trans_36)
- return sha1(o_key_pad + sha1(i_key_pad + msg).digest()).digest()
- def derive_keys(key):
- h = sha256()
- h.update(key)
- h.update('cipher')
- cipher_key = h.digest()
- h = sha256()
- h.update(key)
- h.update('mac')
- mac_key = h.digest()
- return (cipher_key, mac_key)
- def generate_key():
- return b64encode(urandom(KEY_SIZE))
- class Cipher(object):
- def __init__(self, key="", text=""):
- self.block_size = 16
- self.mac_size = 20
- self.key = self.set_key(key)
- self.text = self.set_text(text)
- self.mode = AES.MODE_CFB
-
- def set_key(self, key):
- try:
- key = b64decode(key)
- except TypeError:
- raise ValueError
- self.key = key
- return self.key
- def set_text(self, text):
- self.text = text
- return self.text
- def encrypt(self):
- if BLOCK_SIZE + len(self.text) + MAC_SIZE > 105:
- self.text = self.text[:105 - BLOCK_SIZE - MAC_SIZE]
- (cipher_key, mac_key) = derive_keys(self.key)
- iv = urandom(BLOCK_SIZE)
- aes = AES.new(cipher_key, self.mode, iv)
- ciphertext = aes.encrypt(self.text)
- mac = hmac_sha1(mac_key, iv + ciphertext)
- return b64encode(iv + ciphertext + mac)
- def decrypt(self):
- try:
- iv_ciphertext_mac = b64decode(self.text)
- except TypeError:
- return None
- iv = iv_ciphertext_mac[:BLOCK_SIZE]
- ciphertext = iv_ciphertext_mac[BLOCK_SIZE:-MAC_SIZE]
- mac = iv_ciphertext_mac[-MAC_SIZE:]
- (cipher_key, mac_key) = derive_keys(self.key)
- expected_mac = hmac_sha1(mac_key, iv + ciphertext)
- if mac != expected_mac:
- return None
- aes = AES.new(cipher_key, self.mode, iv)
- return aes.decrypt(ciphertext)
- if __name__ == "__main__":
- print "\nUFONet Crypter (AES256+HMAC-SHA1) -> (140 plain text chars = 69 encrypted chars)\n"
- text = str(raw_input("- Enter text: "))
- input_key = str(raw_input("- Enter key: "))
- key = b64encode(input_key)
- c = Cipher(key, text)
- msg = c.encrypt()
- c.set_text(msg)
- print '\n-> Ciphertext: [', msg, ']'
- print '\nLength:', len(msg)
- print '\n-> Key (share it using SNEAKNET!):', input_key
- print '\nDecryption PoC:', c.decrypt(), "\n"
|