Cifrado Compresor [Archivos]

Iniciado por Azav, Enero 29, 2015, 12:33:42 AM

Tema anterior - Siguiente tema

0 Miembros y 1 Visitante están viendo este tema.

Enero 29, 2015, 12:33:42 AM Ultima modificación: Enero 29, 2015, 08:40:48 PM por Azav
Buenas a todos, hace tiempo que he estado adentrándome en el manejo de archivos con python. Lo primero que creé fue una calculadora para hacer cambios de binarios, decimales, octales y hexadecimales (No tienes permitido ver los links. Registrarse o Entrar a mi cuenta), bastante simple a decir verdad. Esta vez traigo algo un poco más elaborado.  Se trata de un algoritmo para cifrar archivos, pero que además comprime el archivo al cifrarlo. Para comprimirlo reduce la cantidad de bytes 0x00 en el archivo. Podría ilustrarse así si lo vemos como en un editor hexadecimal:
Código: text
Caso 1: A1 00 00 00 00 B2 01 7C > A1 00 03 B2 01 7C          (aquí nos ahorramos dos bytes)
Caso 2: B1 FB 00 CC A2 72 A1 2D > B1 FB 00 00 CC A2 72 A1 2D (aquí aumentamos en un byte)
Caso 3: B1 FB 00 00 A2 72 A1 2D > B1 FB 00 01 A2 72 A1 2D    (aquí no ganamos ni perdimos )

Teóricamente podría suceder que el archivo aumente su tamaño (si el caso 2 se repite mucho y el caso 1 no), pero en la práctica es sumamente extraño que pase, casi siempre el archivo va a reducir al menos unos miles de bytes. No estoy seguro si esta forma de compresión ya existía pero hago el aporte igualmente.

Luego de realizar la compresión viene el cifrado, que vendría siendo un algoritmo simple que cifra byte a byte con un contraseña. El algoritmo fue una invención mía, no es XOR aunque se parece un poco.  Luego para decodificar es el proceso inverso, creo que no es necesario explicarlo.

El código puede ser fácilmente traducido a otros lenguajes (tal vez me animo a pasarlo a VB6) y no vendría mal para quienes hacen crypters. Inicialmente el código resultaba ser un poco lento, por eso no lo había publicado, pero optimicé el código y mejoró muchísimo. Sin más, les dejo el source:
Código: python
def CheckReducement(data, byte):
    amount_list = []
    pos = data.find(byte)
    while pos != -1:
        i = 1
        while True:
            if (pos + i) < len(data):
                if data[pos + i:pos + i + 1] == byte:
                    i += 1
                else:
                    amount_list.append(i)
                    pos = data.find(byte, pos + i)
                    break
                else:
                    amount_list.append(i)
                    pos = -1
                    break
    bytes_reducidos = 0
    for amount in amount_list:
        if amount == 1:
            bytes_reducidos -= 1
        elif amount >= 3 and amount <= 256:
            ahorro = amount - 2
            bytes_reducidos += ahorro
        elif amount > 256:
            ahorro = (((amount // 256) * 254) + ((amount % 256) - 2))
            bytes_reducidos += ahorro
    return bytes_reducidos

def DoReducement(inputfile, outputfile, password):
    f = open(inputfile, "br")
    data = f.read()
    f.close()       
    reduccion = CheckReducement(data, b"\x00")
    porcentaje = (reduccion * 100) / len(data)
    byte_list = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF"
    pos = data.find(b"\x00")
    pos2 = 0
    nueva_data = b""
    while pos != -1:
        i = 1
        while True:
            if (pos + i) < len(data):
                if data[pos + i:pos + i + 1] == b"\x00":
                    i += 1
                else:
                    if i <= 256:
                        nueva_data += data[pos2:pos + 1] + byte_list[i - 1:i]
                        pos2 = pos + i
                        pos = data.find(b"\x00", pos2)
                    else:
                        nueva_data += data[pos2:pos + 1] + b"\xFF"
                        pos2 = pos + 256
                        pos = data.find(b"\x00", pos2)
                    break
            else:
                if i <= 256:
                    nueva_data += data[pos2:pos + 1] + byte_list[i - 1:i]
                    pos2 = pos + i
                    pos = data.find(b"\x00", pos2)
                else:
                    nueva_data += data[pos2:pos + 1] + b"\xFF"
                    pos2 = pos + 256
                    pos = data.find(b"\x00", pos2)
                break
    nueva_data += data[pos2:]
    nueva_data = EncodeBytes(nueva_data, password)
    f = open(outputfile, "bw")
    f.write(nueva_data)
    f.close()
    return "El archivo fue cifrado con éxito y su peso se redujo en un " + str(porcentaje)[:4] + "% (" + str(reduccion) + " bytes reducidos)."

       
def DoIncrement(inputfile, outputfile, password):
    f = open(inputfile, "br")
    data = f.read()
    f.close()       
    data = DecodeBytes(data, password)
    byte_list = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF"
    zero_list = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    pos = data.find(b"\x00")
    pos2 = 0
    nueva_data = b""
    while pos != -1:
        amount = byte_list.find(data[pos + 1:pos + 2])
        zero_bytes = zero_list[:amount]
        nueva_data += data[pos2:pos + 1] + zero_bytes
        pos2 = pos + 2
        pos = data.find(b"\x00", pos2)
    nueva_data += data[pos2:]
    f = open(outputfile, "bw")
    f.write(nueva_data)
    f.close()       
    return "El archivo fue decifrado con éxito."

def EncodeBytes(bytes_data, password): 
    return b''.join(chr((bytes_data[i] + ord(password[i % len(password)])) % 256).encode('iso8859-1') for i in range(len(bytes_data)))
               
def DecodeBytes(bytes_data, password):
    return b''.join(chr((bytes_data[i] - ord(password[i % len(password)])) % 256).encode('iso8859-1') for i in range(len(bytes_data)))
       
print(DoReducement("archivo.exe", "cifrado.exe", "contraseña"))
print(DoIncrement("cifrado.exe", "archivo_original.exe", "contraseña"))

Para quienes quieran estudiar mejor el algoritmo les dejo el source no optimizado, que hace exactamente lo mismo que el código de arriba pero es más fácil de entender.

Código: python
def CheckReducement(data, byte):
    amount_list = []
    pos = data.find(byte)
    while pos != -1:
        i = 1
        while True:
            if (pos + i) < len(data):
                if data[pos + i:pos + i + 1] == byte:
                    i += 1
                else:
                    amount_list.append(i)
                    pos = data.find(byte, pos + i)
                    break
            else:
                amount_list.append(i)
                pos = -1
                break
    bytes_reducidos = 0
    for amount in amount_list:
        if amount == 1:
            bytes_reducidos -= 1
        elif amount >= 3 and amount <= 256:
            ahorro = amount - 2
            bytes_reducidos += ahorro
        elif amount > 256:
            ahorro = (((amount // 256) * 254) + ((amount % 256) - 2))
            bytes_reducidos += ahorro
    return bytes_reducidos

def DoReducement(inputfile, outputfile, password):
    f = open(inputfile, "br")
    data = f.read()
    f.close()       
    reduccion = CheckReducement(data, b"\x00")
    porcentaje = (reduccion * 100) / len(data)
    byte_list = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF"
    pos = data.find(b"\x00")
    while pos != -1:
        i = 1
        while True:
            if (pos + i) < len(data):
                if data[pos + i:pos + i + 1] == b"\x00":
                   i += 1
                else:
                    if i <= 256:
                        data = data[:pos + 1] + byte_list[i - 1:i] + data[pos + i:]
                    else:
                        data = data[:pos + 1] + byte_list[255:] + data[pos + 256:]
                    pos = data.find(b"\x00", pos + 2)
                    break
            else:
                    if i <= 256:
                        data = data[:pos + 1] + byte_list[i - 1:i] + data[pos + i:]
                    else:
                        data = data[:pos + 1] + byte_list[255:] + data[pos + 256:]
                    pos = data.find(b"\x00", pos + 2)
                    break
    data = EncodeBytes(data, password)
    f = open(outputfile, "bw")
    f.write(data)
    f.close()       
    return "El archivo fue cifrado con éxito y su peso se redujo en un " + str(porcentaje)[:4] + "% (" + str(reduccion) + " bytes reducidos)."

       
def DoIncrement(inputfile, outputfile, password):
    f = open(inputfile, "br")
    data = f.read()
    f.close()       
    data = DecodeBytes(data, password)
    byte_list = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF"
    zero_list = b"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
    pos = data.find(b"\x00")
    while pos != -1:
        amount = byte_list.find(data[pos + 1:pos + 2])
        zero_bytes = zero_list[:amount]
        data = data[:pos + 1] + zero_bytes + data[pos + 2:]
        pos = data.find(b"\x00", pos + len(zero_bytes) + 1)
    f = open(outputfile, "bw")
    f.write(data)
    f.close()       
    return "El archivo fue decifrado con éxito."

def EncodeBytes(bytes_data, password):
    byte_list = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF"
    i = 0
    nueva_data = b''
    while i < len(bytes_data):
        j = i % len(password)
        suma = bytes_data[i] + ord(password[j])
        if suma > 255:
            suma = suma % 256
        nueva_data += byte_list[suma:suma + 1] 
        i += 1
    return nueva_data
               
def DecodeBytes(bytes_data, password):
    byte_list = b"\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF"
    nueva_data = b''
    i = 0
    while i < len(bytes_data):
        j = i % len(password)
        resta = bytes_data[i] - ord(password[j])
        if resta < 0:
            resta = resta % 256
        nueva_data += byte_list[resta:resta + 1]       
        i += 1
    return nueva_data
       
print(DoReducement("archivo.exe", "cifrado.exe", "contraseña"))
print(DoIncrement("cifrado.exe", "archivo_original.exe", "contraseña"))


Espero alguien pueda darle buen uso, saludos a todos.

Excelente aporte Azav! Qué bueno ver material de esta calidad por esta sección.

Espero que sigas así! Gracias por compartir!

Saludos!
WhiZ

P.D.: De ahora en más, intenta indentar con 4 espacios, por favor ;)


HOLA!!!

Osea, en definitiva quita los 00 del archivo original los cuenta y los coloca como 00 [cantidad de 00].

Esta interesante :D

GRACIAS POR LEER!!!
"Algunos creen que soy un bot, puede que tengan razon"
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

*Shadow Scouts Team*                                                No tienes permitido ver los links. Registrarse o Entrar a mi cuenta


Siempre es bueno (y necesario), leer aportes de esta entidad.
El ejercicio de compartir, despierta doblemente el interés por su lectura.

Gracias-

Gabi.
Tú te enamoraste de mi valentía, yo me enamoré de tu oscuridad; tú aprendiste a vencer tus miedos, yo aprendí a no perderme en tu abismo.

Excelente brother, gracias por traerlo. Esto es Python 3 verdad?

PD: No quiero sonar muy pesado, pero intenta usar cuatro espacios para identar; sino a veces se vuelve un poco tedioso seguir el código.

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

Muchas gracias a todos por sus comentarios.
No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
HOLA!!!

Osea, en definitiva quita los 00 del archivo original los cuenta y los coloca como 00 [cantidad de 00].

Esta interesante :D

GRACIAS POR LEER!!!
Exactamente eso 79137913.

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Excelente brother, gracias por traerlo. Esto es Python 3 verdad?

PD: No quiero sonar muy pesado, pero intenta usar cuatro espacios para identar; sino a veces se vuelve un poco tedioso seguir el código.

Saludos!
Sí, es python 3.4. Con respecto a la indentación, puedo cambiarlo pero.. no entiendo el problema de hacerlo con TAB. ¿Qué ventaja tiene usar los 4 espacios?¿Porqué se hace tedioso seguir el código?

Aprovecho de aclarar, ya que me preguntaron, que el código que está abajo hace exactamente lo mismo que el de arriba pero es bastante más lento. Lo publiqué igual porque se hace más fácil entender el código. Lo otro es que en la linea 94 del primer código había un error (salía print en vez de return) pero ya lo arreglé.

¡Saludos!

Enero 29, 2015, 10:28:12 PM #6 Ultima modificación: Enero 29, 2015, 10:30:16 PM por Once
Hola brother,

El interprete de Python es muy permisivo en ciertos aspectos, por eso está la PEP8 (No tienes permitido ver los links. Registrarse o Entrar a mi cuenta) no digo que hay que seguirla al pie de la letra, pero está hecha para intentar estandarizar todos los códigos y así no hayan problemas en especial cuando se programa en equipo (lo digo por experiencia propia). El tema con las identaciones es que todos los IDES las pueden tomar distinto, lo que ves en tu IDE configurado para usar tabuladores no es lo mismo que ve alguien con el IDE configurado para usar espacios. Así veo yo parte de un método de tu código de un post anterior.


Pero el verdadero problema empieza cuando quieres editar el código porque a veces las identaciones no coinciden y tienes que eliminarlas por completo y arreglarlas a mano (imagínate el trabajo para un script de 500 líneas).

Identar con cuatro espacios no cuesta mucho y creéme que los que leémos los códigos y a veces los editamos agradecemos infinitamente que lo hagan.

Si todos identaran con cuatro espacios el mundo sería un lugar mejor.

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Hola brother,

El interprete de Python es muy permisivo en ciertos aspectos, por eso está la PEP8 (No tienes permitido ver los links. Registrarse o Entrar a mi cuenta) no digo que hay que seguirla al pie de la letra, pero está hecha para intentar estandarizar todos los códigos y así no hayan problemas en especial cuando se programa en equipo (lo digo por experiencia propia). El tema con las identaciones es que todos los IDES las pueden tomar distinto, lo que ves en tu IDE configurado para usar tabuladores no es lo mismo que ve alguien con el IDE configurado para usar espacios. Así veo yo parte de un método de tu código de un post anterior.


Pero el verdadero problema empieza cuando quieres editar el código porque a veces las identaciones no coinciden y tienes que eliminarlas por completo y arreglarlas a mano (imagínate el trabajo para un script de 500 líneas).

Identar con cuatro espacios no cuesta mucho y creéme que los que leémos los códigos y a veces los editamos agradecemos infinitamente que lo hagan.

Si todos identaran con cuatro espacios el mundo sería un lugar mejor.

Saludos!

Vale, la verdad es que había escuchado harto lo de indentar con cuatro espacios, pero en los IDE que uso (son dos distintos) siempre se me ha visto bien así. Python 3 no permite que el código esté indentado de las dos formas, o TAB's o espacios, con ambos lanza error. Cuando partí programando y supe de las dos opciones me quedé con los TAB's pues se me hacía más cómodo pero tienes tu punto. De ahora en más haré el esfuerzo de cambiarme  :).

No tienes permitido ver los links. Registrarse o Entrar a mi cuenta
Vale, la verdad es que había escuchado harto lo de indentar con cuatro espacios, pero en los IDE que uso (son dos distintos) siempre se me ha visto bien así. Python 3 no permite que el código esté indentado de las dos formas, o TAB's o espacios, con ambos lanza error. Cuando partí programando y supe de las dos opciones me quedé con los TAB's pues se me hacía más cómodo pero tienes tu punto. De ahora en más haré el esfuerzo de cambiarme  :).

Tampoco es que tengas que poner los cuatro espacios a mano, si es lo que estás pensando, NO. Simplemente busca bien que por lo general todos los IDE permiten configurar el editor para que cuando pulses la tecla TAB se escriban los cuatro espacios y no el tabulador \t. Por eso digo que tabular con cuatro espacios no cuesta mucho, sólo es configurar bien el IDE.

Saludos!







No tienes permitido ver los links. Registrarse o Entrar a mi cuenta