SHOW:
|
|
- or go back to the newest paste.
| 1 | #reddit.com/r/dailyprogrammer | |
| 2 | #intermediate-101 | |
| 3 | ||
| 4 | import sys, Image | |
| 5 | ||
| 6 | #CONSTANTS | |
| 7 | TERMINATION = '11111111' | |
| 8 | ||
| 9 | def steg(image_fn,data_fn): | |
| 10 | #read in our image file and declare variables | |
| 11 | img = Image.open(image_fn) | |
| 12 | pixels = img.load() | |
| 13 | im_width = img.size[0] | |
| 14 | im_height = img.size[1] | |
| 15 | ||
| 16 | #read in our data file and declare variables | |
| 17 | with open(data_fn, 'r') as f: | |
| 18 | data = f.read() | |
| 19 | b_data = "" | |
| 20 | for char in data: | |
| 21 | b_data += '%08d'%int(bin(ord(char))[2:]) | |
| 22 | ||
| 23 | b_data += TERMINATION #used to find end when getting data out | |
| 24 | ||
| 25 | #verify image file is large enough | |
| 26 | pix_needed = len(b_data) / 2 | |
| 27 | if im_width * im_height < pix_needed: | |
| 28 | print 'Image file too small for data' | |
| 29 | sys.exit() | |
| 30 | ||
| 31 | #add data to image file | |
| 32 | for x in range(im_width): | |
| 33 | for y in range(im_height): | |
| 34 | if len(b_data) == 0: | |
| 35 | break | |
| 36 | ||
| 37 | pix = pixels[x,y] | |
| 38 | ||
| 39 | blueBase = bin(pix[2])[2:] #current pixels blue binary value | |
| 40 | newBlue = blueBase[:-2] + b_data[0:2] #create new binary value | |
| 41 | ||
| 42 | b_data = b_data[2:] #remove used bits from b_data | |
| 43 | ||
| 44 | pixels[x,y] = (pix[0],pix[1],int(newBlue,2)) #put new pixel into image file | |
| 45 | else: | |
| 46 | continue | |
| 47 | break | |
| 48 | ||
| 49 | #save new image as png | |
| 50 | new_file = 'steg_' + image_fn[:image_fn.rfind('.')] + '.png'
| |
| 51 | img.save(new_file) | |
| 52 | return 'image saved as ' + new_file | |
| 53 | ||
| 54 | def desteg(image_fn): | |
| 55 | #read in our image file and declare variables | |
| 56 | img = Image.open(image_fn) | |
| 57 | pixels = img.load() | |
| 58 | im_width = img.size[0] | |
| 59 | im_height = img.size[1] | |
| 60 | ||
| 61 | #get bianry data | |
| 62 | b_data = "" | |
| 63 | for x in range(im_width): | |
| 64 | for y in range(im_height): | |
| 65 | pix = pixels[x,y] | |
| 66 | b_data += bin(pix[2])[-2:] | |
| 67 | ||
| 68 | #get actual data | |
| 69 | s_data = "" | |
| 70 | for x in range(0,len(b_data),8): | |
| 71 | chunk = b_data[x:x+8] | |
| 72 | - | if chunk == '11111111': |
| 72 | + | if chunk == TERMINATION: |
| 73 | break #end of steganography data | |
| 74 | ||
| 75 | char = chr(int(chunk,2)) | |
| 76 | s_data += char | |
| 77 | ||
| 78 | return s_data | |
| 79 | ||
| 80 | ||
| 81 | #Process args | |
| 82 | if len(sys.argv) == 1: | |
| 83 | print 'Usage: steganography.py {steg|desteg} {image file} {data file(steg only)}'
| |
| 84 | sys.exit() | |
| 85 | ||
| 86 | if sys.argv[1] == 'steg' and len(sys.argv) == 4: | |
| 87 | i_file = sys.argv[2] | |
| 88 | d_file = sys.argv[3] | |
| 89 | print steg(i_file,d_file) | |
| 90 | elif sys.argv[1] == 'desteg' and len(sys.argv) == 3: | |
| 91 | i_file = sys.argv[2] | |
| 92 | print desteg(i_file) | |
| 93 | else: | |
| 94 | print 'Usage: steganography.py {steg|desteg} {image file} {data file(steg only)}'
| |
| 95 | sys.exit() |