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"
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