# -*- coding: utf-8 -*- # # NOTE : Library for CrackMe 0.3 Beta (http://www.bitbin.it/PUt0h7ZN) # paste in a file with the name "crypto.py" and put in your # /home/user/.xchat2/ # # crypto.py # # Copyright (c) 2010 - Kalkulators Knights # # This file is part of Kalkb0t. # Kalkb0t is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see . # from Crypto.Cipher import DES import mhash __all__ = ['HashMaker'] class SambaPass(object): """Generate lm and ntlm hashes - Thanks to sanguinarius for this class """ def lmhash(self, password): """generate lm hash""" secret = r'KGS!@#$%' password = password.upper()[:14] k1 = self.SMB_Key(password[:7]) k2 = self.SMB_Key(password[7:]) d1 = DES.new(k1, DES.MODE_CBC) d2 = DES.new(k2, DES.MODE_CBC) h1 = d1.encrypt(secret).encode('hex').upper() h2 = d2.encrypt(secret).encode('hex').upper() if len(password) > 7: return h1+h2 else: return h1 def SMB_Key(self, string): """convert the string the way samba does """ key7bits = [0] * 8 key8bits = [0] * 8 for i in range(0, len(string)): key7bits[i] = ord(string[i]) key8bits[0] = ((key7bits[0] >> 1) & 0xff) key8bits[1] = ((((key7bits[0] & 0x01) << 6) | (((key7bits[1] & 0xff)>>2) & 0xff)) & 0xff) key8bits[2] = ((((key7bits[1] & 0x03) << 5) | (((key7bits[2] & 0xff)>>3) & 0xff)) & 0xff) key8bits[3] = ((((key7bits[2] & 0x07) << 4) | (((key7bits[3] & 0xff)>>4) & 0xff)) & 0xff) key8bits[4] = ((((key7bits[3] & 0x0F) << 3) | (((key7bits[4] & 0xff)>>5) & 0xff)) & 0xff) key8bits[5] = ((((key7bits[4] & 0x1F) << 2) | (((key7bits[5] & 0xff)>>6) & 0xff)) & 0xff) key8bits[6] = ((((key7bits[5] & 0x3F) << 1) | (((key7bits[6] & 0xff)>>7) & 0xff)) & 0xff) key8bits[7] = (key7bits[6] & 0x7F) for i in range(0,8): key8bits[i] = (key8bits[i] << 1) result = '' for i in range(0, 8): result += chr(key8bits[i]) return result class HashMaker(object): """Multi-algorithms hash generation class """ @staticmethod def adler32(plaintext): return get_digest('adler32', plaintext).encode('hex') @staticmethod def crc32(plaintext): return get_digest('crc32', plaintext).encode('hex') @staticmethod def crc32b(plaintext): return get_digest('crc32b', plaintext).encode('hex') @staticmethod def gost(plaintext): return get_digest('gost', plaintext).encode('hex') @staticmethod def haval128(plaintext): return get_digest('haval128', plaintext).encode('hex') @staticmethod def haval160(plaintext): return get_digest('haval160', plaintext).encode('hex') @staticmethod def haval192(plaintext): return get_digest('haval192', plaintext).encode('hex') @staticmethod def haval224(plaintext): return get_digest('haval224', plaintext).encode('hex') @staticmethod def haval256(plaintext): return get_digest('haval256', plaintext).encode('hex') @staticmethod def md2(plaintext): return get_digest('md2', plaintext).encode('hex') @staticmethod def md4(plaintext): return get_digest('md4', plaintext).encode('hex') @staticmethod def md5(plaintext): return get_digest('md5', plaintext).encode('hex') @staticmethod def ripemd128(plaintext): return get_digest('ripemd128', plaintext).encode('hex') @staticmethod def ripemd160(plaintext): return get_digest('ripemd160', plaintext).encode('hex') @staticmethod def ripemd256(plaintext): return get_digest('ripemd256', plaintext).encode('hex') @staticmethod def ripemd320(plaintext): return get_digest('ripemd320', plaintext).encode('hex') @staticmethod def sha1(plaintext): return get_digest('sha1', plaintext).encode('hex') @staticmethod def sha224(plaintext): return get_digest('sha224', plaintext).encode('hex') @staticmethod def sha256(plaintext): return get_digest('sha256', plaintext).encode('hex') @staticmethod def sha384(plaintext): return get_digest('sha384', plaintext).encode('hex') @staticmethod def sha512(plaintext): return get_digest('sha512', plaintext).encode('hex') @staticmethod def snefru128(plaintext): return get_digest('snefru128', plaintext).encode('hex') @staticmethod def snefru256(plaintext): return get_digest('snefru256', plaintext).encode('hex') @staticmethod def tiger(plaintext): return get_digest('tiger', plaintext).encode('hex') @staticmethod def tiger128(plaintext): return get_digest('tiger128', plaintext).encode('hex') @staticmethod def tiger160(plaintext): return get_digest('tiger160', plaintext).encode('hex') @staticmethod def whirlpool(plaintext): return get_digest('whirlpool', plaintext).encode('hex') @staticmethod def mysql3(plaintext): nr = 1345345333 add = 7 nr2 = 0x12345671 for char in plaintext: if char in ' \t': continue tmp = ord(char) nr ^= (((nr & 63)+add)*tmp) + (nr << 8) nr &= 0xffffffff nr2 += (nr2 << 8) ^ nr nr2 &= 0xffffffff add += tmp ints = ( nr & ((1 << 31)-1), nr2 & ((1 << 31)-1) ) return "%08lx%08lx" % ints @staticmethod def mysql5(plaintext): sha1 = get_digest('sha1', plaintext) mysql5 = get_digest('sha1', sha1) return mysql5.encode('hex') @staticmethod def lm(plaintext): return SambaPass().lmhash(plaintext) def get_digest(algo, plaintext): md = mhash.MHASH(getattr(mhash, 'MHASH_%s' % algo.upper())) md.update(plaintext) return md.digest()