diff --git a/setup.py b/setup.py index 803aa7b..7a1ac17 100644 --- a/setup.py +++ b/setup.py @@ -34,7 +34,7 @@ setup( **kw ) -print "Installing binaries" +print("Installing binaries") shutil.copy2("./bin/slsb-set", "/bin/slsb-set") shutil.copymode("./bin/slsb-set", "/bin/slsb-set") diff --git a/stegano/basic.py b/stegano/basic.py index be875c8..3e16916 100755 --- a/stegano/basic.py +++ b/stegano/basic.py @@ -105,4 +105,4 @@ if __name__ == '__main__': elif sys.argv[1] == "reveal": img = Image.open(options.input_image_file) - print reveal(img) + print(reveal(img)) diff --git a/stegano/exif/minimal_exif_reader.py b/stegano/exif/minimal_exif_reader.py index 5f5794a..ab711c3 100644 --- a/stegano/exif/minimal_exif_reader.py +++ b/stegano/exif/minimal_exif_reader.py @@ -177,20 +177,20 @@ class MinimalExifReader: if __name__ == '__main__': import sys if len(sys.argv) == 1: - print "Pass jpgs to process." + print("Pass jpgs to process.") sys.exit(1) for filename in sys.argv[1:]: try: f = MinimalExifReader(filename) - print filename - print "description: '%s'" % f.imageDescription() - print "copyright: '%s'" % f.copyright() - print "dateTimeOriginal: '%s'" % f.dateTimeOriginal() - print "dateTimeOriginal: '%s'" % f.dateTimeOriginal('%B %d, %Y %I:%M:%S %p') - print - except ExifFormatException, ex: + print(filename) + print("description: '%s'" % f.imageDescription()) + print("copyright: '%s'" % f.copyright()) + print("dateTimeOriginal: '%s'" % f.dateTimeOriginal()) + print("dateTimeOriginal: '%s'" % f.dateTimeOriginal('%B %d, %Y %I:%M:%S %p')) + print() + except ExifFormatException as ex: sys.stderr.write("Exif format error: %s\n" % ex) except: sys.stderr.write("Unable to process %s\n" % filename) diff --git a/stegano/exif/minimal_exif_writer.py b/stegano/exif/minimal_exif_writer.py index 11c8be3..ed0d198 100644 --- a/stegano/exif/minimal_exif_writer.py +++ b/stegano/exif/minimal_exif_writer.py @@ -43,7 +43,7 @@ if VERBOSE: import mmap import sys -import minimal_exif_reader +from . import minimal_exif_reader #--------------------------------------------------------------------- class ExifFormatException(Exception): @@ -91,7 +91,7 @@ class MinimalExifWriter: self.getExistingExifInfo() if VERBOSE: - print self + print(self) import os try: @@ -105,7 +105,7 @@ class MinimalExifWriter: # We only add app0 if all we're doing is removing the exif section. justRemovingExif = self.description is None and self.copyright is None and self.removeExifSection - if VERBOSE: print 'justRemovingExif=%s' % justRemovingExif + if VERBOSE: print('justRemovingExif=%s' % justRemovingExif) self.removeExifInfo(addApp0 = justRemovingExif) if justRemovingExif: self.m.close() @@ -114,7 +114,7 @@ class MinimalExifWriter: # Get here means we are adding new description and/or copyright. self.removeApp0() - totalTagsToBeAdded = len(filter(None, (self.description, self.copyright, self.dateTimeOriginal))) + totalTagsToBeAdded = len([_f for _f in (self.description, self.copyright, self.dateTimeOriginal) if _f]) assert(totalTagsToBeAdded > 0) # Layout will be: firstifd|description|copyright|exififd|datetime. @@ -199,9 +199,9 @@ class MinimalExifWriter: appMarker = self.m.read(2) # See if there's an APP0 section, which sometimes appears. if appMarker == self.APP0_MARKER: - if VERBOSE: print 'app0 found' + if VERBOSE: print('app0 found') app0DataLength = ord(self.m.read(1)) * 256 + ord(self.m.read(1)) - if VERBOSE: print 'app0DataLength: %s' % app0DataLength + if VERBOSE: print('app0DataLength: %s' % app0DataLength) # Back up 2 bytes to get the length bytes. self.m.seek(-2, 1) existingApp0 = self.m.read(app0DataLength) @@ -212,14 +212,14 @@ class MinimalExifWriter: return exifHeader = self.m.read(8) - if VERBOSE: print 'exif header: %s' % binascii.hexlify(exifHeader) + if VERBOSE: print('exif header: %s' % binascii.hexlify(exifHeader)) if (exifHeader[2:6] != 'Exif' or exifHeader[6:8] != '\x00\x00'): self.m.close() raise ExifFormatException("Malformed APP1") app1Length = ord(exifHeader[0]) * 256 + ord(exifHeader[1]) - if VERBOSE: print 'app1Length: %s' % app1Length + if VERBOSE: print('app1Length: %s' % app1Length) originalFileSize = self.m.size() @@ -240,7 +240,7 @@ class MinimalExifWriter: if app0DataLength: count -= app0DataLength + len(self.APP0_MARKER) - if VERBOSE: print 'self.m.move(%s, %s, %s)' % (dest, src, count) + if VERBOSE: print('self.m.move(%s, %s, %s)' % (dest, src, count)) self.m.move(dest, src, count) if addApp0: @@ -259,13 +259,13 @@ class MinimalExifWriter: header = self.m.read(6) if (header[0:2] != self.SOI_MARKER or header[2:4] != self.APP0_MARKER): - if VERBOSE: print 'no app0 found: %s' % binascii.hexlify(header) + if VERBOSE: print('no app0 found: %s' % binascii.hexlify(header)) return originalFileSize = self.m.size() app0Length = ord(header[4]) * 256 + ord(header[5]) - if VERBOSE: print 'app0Length:', app0Length + if VERBOSE: print('app0Length:', app0Length) # Shift stuff to overwrite app0. # Start at app0 length bytes in + other bytes not incl in app0 length. @@ -273,7 +273,7 @@ class MinimalExifWriter: dest = len(self.SOI_MARKER) count = originalFileSize - app0Length - len(self.SOI_MARKER) - len(self.APP0_MARKER) self.m.move(dest, src, count) - if VERBOSE: print 'm.move(%s, %s, %s)' % (dest, src, count) + if VERBOSE: print('m.move(%s, %s, %s)' % (dest, src, count)) self.m.resize(originalFileSize - app0Length - len(self.APP0_MARKER)) #--------------------------------------------------------------------------- @@ -347,10 +347,10 @@ def usage(error = None): """Print command line usage and exit""" if error: - print error - print + print(error) + print() - print """This program will remove exif info from an exif jpg, and can optionally + print("""This program will remove exif info from an exif jpg, and can optionally add the ImageDescription exif tag and/or the Copyright tag. But it will always remove some or all existing exif info (depending on options--see below)! So don't run this on your original images without a backup. @@ -379,7 +379,7 @@ Options: The image description and copyright must be > 4 characters long. - This software courtesy of Megabyte Rodeo Software.""" + This software courtesy of Megabyte Rodeo Software.""") sys.exit(1) @@ -448,7 +448,7 @@ if __name__ == '__main__': f.removeExif() f.process() - except ExifFormatException, ex: + except ExifFormatException as ex: sys.stderr.write("Exif format error: %s\n" % ex) except SystemExit: pass diff --git a/stegano/exifHeader.py b/stegano/exifHeader.py index 60bf33f..ec5af24 100644 --- a/stegano/exifHeader.py +++ b/stegano/exifHeader.py @@ -35,7 +35,7 @@ def hide(img, img_enc, copyright="http://bitbucket.org/cedricbonhomme/stegano", from zlib import compress from zlib import decompress from base64 import b64encode - from exif.minimal_exif_writer import MinimalExifWriter + from .exif.minimal_exif_writer import MinimalExifWriter if secret_file != None: with open(secret_file, "r") as f: @@ -51,7 +51,7 @@ def hide(img, img_enc, copyright="http://bitbucket.org/cedricbonhomme/stegano", try: shutil.copy(img, img_enc) except Exception as e: - print("Impossible to copy image:", e) + print(("Impossible to copy image:", e)) return f = MinimalExifWriter(img_enc) @@ -66,13 +66,13 @@ def reveal(img): """ from base64 import b64decode from zlib import decompress - from exif.minimal_exif_reader import MinimalExifReader + from .exif.minimal_exif_reader import MinimalExifReader try: g = MinimalExifReader(img) except: print("Impossible to read description.") return - print(b64decode(decompress(g.imageDescription()))) + print((b64decode(decompress(g.imageDescription())))) print(("\nCopyright " + g.copyright())) #print g.dateTimeOriginal()s diff --git a/stegano/generators.py b/stegano/generators.py index b13cecb..25a3cc4 100644 --- a/stegano/generators.py +++ b/stegano/generators.py @@ -50,7 +50,7 @@ def OEIS_A000217(): """ n = 0 while True: - yield (n*(n+1))/2 + yield (n*(n+1))//2 n += 1 def fermat(): @@ -152,4 +152,4 @@ if __name__ == "__main__": # Point of entry in execution mode. f = fibonacci() for x in range(13): - print f.next(), # 0 1 1 2 3 5 8 13 21 34 55 89 144 + print(next(f), end=' ') # 0 1 1 2 3 5 8 13 21 34 55 89 144 diff --git a/stegano/slsb.py b/stegano/slsb.py index 5e06e9e..7ca12c0 100755 --- a/stegano/slsb.py +++ b/stegano/slsb.py @@ -48,8 +48,8 @@ def hide(input_image_file, message): if len(message_bits) > npixels * 3: raise Exception("""The message you want to hide is too long (%s > %s).""" % (len(message_bits), npixels * 3)) - for row in xrange(height): - for col in xrange(width): + for row in range(height): + for col in range(width): if index + 3 <= len(message_bits) : @@ -78,8 +78,8 @@ def reveal(input_image_file): buff, count = 0, 0 bitab = [] limit = None - for row in xrange(height): - for col in xrange(width): + for row in range(height): + for col in range(width): # color = [r, g, b] for color in img.getpixel((col, row)): @@ -103,9 +103,9 @@ def write(image, output_image_file): """ try: image.save(output_image_file) - except Exception, e: + except Exception as e: # If hide() returns an error (Too long message). - print e + print(e) if __name__ == '__main__': # Point of entry in execution mode. @@ -149,9 +149,9 @@ if __name__ == '__main__': img_encoded = hide(options.input_image_file, secret) try: img_encoded.save(options.output_image_file) - except Exception, e: + except Exception as e: # If hide() returns an error (Too long message). - print e + print(e) elif options.reveal: secret = reveal(options.input_image_file) @@ -160,4 +160,4 @@ if __name__ == '__main__': with open(options.secret_binary, "w") as f: f.write(data) else: - print secret \ No newline at end of file + print(secret) diff --git a/stegano/slsbset.py b/stegano/slsbset.py index f41e4cd..da8024d 100644 --- a/stegano/slsbset.py +++ b/stegano/slsbset.py @@ -52,7 +52,7 @@ def hide(input_image_file, message, generator_function): generator = getattr(generators, generator_function)() while index + 3 <= len(message_bits) : - generated_number = generator.next() + generated_number = next(generator) (r, g, b) = img_list[generated_number] # Change the Least Significant Bit of each colour component. @@ -90,7 +90,7 @@ def reveal(input_image_file, generator_function): generator = getattr(generators, generator_function)() while True: - generated_number = generator.next() + generated_number = next(generator) # color = [r, g, b] for color in img_list[generated_number]: buff += (color&1)<<(7-count) @@ -113,9 +113,9 @@ def write(image, output_image_file): """ try: image.save(output_image_file) - except Exception, e: + except Exception as e: # If hide() returns an error (Too long message). - print e + print(e) if __name__ == '__main__': # Point of entry in execution mode. @@ -165,19 +165,19 @@ if __name__ == '__main__': img_encoded = hide(options.input_image_file, secret, options.generator_function) try: img_encoded.save(options.output_image_file) - except Exception, e: + except Exception as e: # If hide() returns an error (Too long message). - print e + print(e) elif options.reveal: try: secret = reveal(options.input_image_file, options.generator_function) except IndexError: - print "Impossible to detect message." + print("Impossible to detect message.") exit(0) if options.secret_binary != "": data = tools.base642binary(secret) with open(options.secret_binary, "w") as f: f.write(data) else: - print secret + print(secret) diff --git a/stegano/steganalysisStatistics.py b/stegano/steganalysisStatistics.py index 2cb0c5c..acc4359 100644 --- a/stegano/steganalysisStatistics.py +++ b/stegano/steganalysisStatistics.py @@ -43,15 +43,15 @@ def steganalyse(img): colours[r] += 1 most_common = colours.most_common(10) - dict_colours = OrderedDict(sorted(colours.items(), key=lambda t: t[1])) + dict_colours = OrderedDict(sorted(list(colours.items()), key=lambda t: t[1])) colours = 0 - for colour in dict_colours.keys(): + for colour in list(dict_colours.keys()): colours += colour colours = colours / len(dict_colours) #return colours.most_common(10) - return dict_colours.keys()[:30], most_common + return list(dict_colours.keys())[:30], most_common if __name__ == '__main__': # Point of entry in execution mode. diff --git a/stegano/tools.py b/stegano/tools.py index 08094f6..c43843a 100755 --- a/stegano/tools.py +++ b/stegano/tools.py @@ -25,6 +25,7 @@ __date__ = "$Date: 2010/10/01 $" __license__ = "GPLv3" import base64 +from functools import reduce def a2bits(chars): """