Ejemplo n.º 1
0
def steg(containerName, steganingFileName, UseCryptography = False, CryptoPassword =""):

    picture = Container(containerName) # Load picture container
    steganingFile = SteganingFile(steganingFileName) # Load file
    if UseCryptography:
        passwdhash = hashlib.sha256()
        passwdhash.update(CryptoPassword.encode())
        steganingFile.Bytes = cryptXOR(steganingFile.Bytes, passwdhash.hexdigest())

    extensionSizeBitPairs = BitPairs(len(steganingFile.extension))
    extensionBitPairs = BitPairs(bytes(steganingFile.extension, encoding="UTF-8"))
    steganingFileSizeBitPairs = BitPairs(len(steganingFile.Bytes), bytesAmount=4)

    requiredLength = len(extensionSizeBitPairs.bitList) +\
                     len(extensionBitPairs.bitList) +\
                     len(steganingFileSizeBitPairs.bitList) +\
                     len(steganingFile.Bytes) * 4

    if picture.height * picture.width * 3 >= requiredLength:
        steganingFileBitPairs = BitPairs(steganingFile.Bytes)

        picture.initializeByteList(requiredLength)
        extensionSizeBitPairs.write(picture, 0)
        extensionBitPairs.write(picture, len(extensionSizeBitPairs.bitList))
        steganingFileSizeBitPairs.write(picture, len(extensionSizeBitPairs.bitList) + len(extensionBitPairs.bitList))
        steganingFileBitPairs.write(picture, len(extensionSizeBitPairs.bitList) + len(extensionBitPairs.bitList) + len(steganingFileSizeBitPairs.bitList))

        #Write pixels to picture
        k = 0
        i = 0
        while i < picture.width and k < requiredLength:
            j = 0
            while j < picture.height and k < requiredLength:
                picture.draw.point((i, j), (picture.ByteList[k], picture.ByteList[k + 1], picture.ByteList[k + 2]))
                k += 3
                j += 1
            i += 1
        picture.image.save(picture.path[:picture.path.rindex(".")] + "_steg" + ".png")
        return "Encoded as " + picture.path[picture.path.rindex("/") + 1:picture.path.rindex(".")] + "_steg" + ".png"
    else:
        return "Not enough space"
Ejemplo n.º 2
0
def desteg(containerName, UseCryptography = False, CryptoPassword = ""):
    # Load picture container
    picture = Container(containerName)

    byteSize = 8

    # Read service information from file and encoded data
    picture.initializeByteList(int(byteSize / 2))
    extensionSize = picture.readByte(shift=0)

    picture.initializeByteList(int(byteSize / 2) * (extensionSize + 1))
    extension = picture.readString(shift=1, bytesAmount=extensionSize)

    picture.initializeByteList(int(byteSize / 2) * (extensionSize + 1 + 4))
    steganingFileSize = picture.readByte(shift=extensionSize + 1, bytesAmount=4)

    picture.initializeByteList(int(byteSize / 2) * (extensionSize + 1 + 4 + steganingFileSize))
    steganingFile = picture.readString(shift=extensionSize + 1 + 4, bytesAmount=steganingFileSize)

    if extension:
        extension = "." + extension

    steganingFile = bytes(steganingFile, encoding="iso8859-1")

    if UseCryptography:
        passwdhash = hashlib.sha256()
        passwdhash.update(CryptoPassword.encode())
        steganingFile = cryptXOR(steganingFile, passwdhash.hexdigest())

    steganingFile = bytearray(steganingFile)

    try:
        file = open(picture.path[:picture.path.rindex("/") + 1] + "out" + extension, 'wb')
    except ValueError:
        file = open("out" + extension, 'wb')
    file.write(steganingFile)
    file.close()

    return "Decoded as out" + extension