36
Steganography Copyright © Software Carpentry 2010 This work is licensed under the Creative Commons Attribution License See http://software-carpentry.org/license.html for more information. Multimedia Programming Multimedia Programming Steganography Data is 1's and 0's

Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

  • Upload
    others

  • View
    26

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Steganography

Copyright © Software Carpentry 2010

This work is licensed under the Creative Commons Attribution License

See http://software-carpentry.org/license.html for more information.

Multimedia Programming

Multimedia Programming Steganography

Data is 1's and 0's

Page 2: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Data is 1's and 0's

Normally think of them as integers, characters, etc.

Multimedia Programming Steganography

Data is 1's and 0's

Normally think of them as integers, characters, etc.

But sometimes useful to go back to the bits

Page 3: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Data is 1's and 0's

Normally think of them as integers, characters, etc.

But sometimes useful to go back to the bits

Example: hide messages in images

Multimedia Programming Steganography

Data is 1's and 0's

Normally think of them as integers, characters, etc.

But sometimes useful to go back to the bits

Example: hide messages in images

Steganography

Page 4: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Multimedia Programming Steganography

(53, 64, 22)

Page 5: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

(53, 64, 22)

8 bits each

Multimedia Programming Steganography

(53, 64, 22)

8 bits each

8 bits each

56 32 98 105 116 115 32 101 97 99 104

Page 6: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

(53, 64, 22)

8 bits each

8 bits each

Replace color bytes with character bytes

56 32 98 105 116 115 32 101 97 99 104

Multimedia Programming Steganography

Main driver

ifififif sys.argv[1] == '-e':

message = sys.argv[2]

pic = Image.open(sys.argv[3])

encode(message, pic)

pic.save(sys.argv[4])

elifelifelifelif sys.argv[1] == '-d':

pic = Image.open(sys.argv[2])

message = decode(pic)

printprintprintprint message

Page 7: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Main driver

ifififif sys.argv[1] == '-e':

message = sys.argv[2]

pic = Image.open(sys.argv[3])

encode(message, pic)

pic.save(sys.argv[4])

elifelifelifelif sys.argv[1] == '-d':

pic = Image.open(sys.argv[2])

message = decode(pic)

printprintprintprint message

$ steg –e 'ABCDEF' in.jpg out.jpg

Multimedia Programming Steganography

Main driver

ifififif sys.argv[1] == '-e':

message = sys.argv[2]

pic = Image.open(sys.argv[3])

encode(message, pic)

pic.save(sys.argv[4])

elifelifelifelif sys.argv[1] == '-d':

pic = Image.open(sys.argv[2])

message = decode(pic)

printprintprintprint message

$ steg –d out.jpg

Page 8: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Main driver

ifififif sys.argv[1] == '-e':

message = sys.argv[2]

pic = Image.open(sys.argv[3])

encode(message, pic)

pic.save(sys.argv[4])

elifelifelifelif sys.argv[1] == '-d':

pic = Image.open(sys.argv[2])

message = decode(pic)

printprintprintprint message

Multimedia Programming Steganography

Encode

defdefdefdef encode(message, pic):

assertassertassertassert len(message) < 256, 'Message is too long'

set_red(pic, 0, 0, len(message))

i = 1

forforforfor c inininin message:

set_red(pic, 0, i, ord(c))

i += 1

Page 9: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Encode

defdefdefdef encode(message, pic):

assertassertassertassert len(message) < 256, 'Message is too long'

set_red(pic, 0, 0, len(message))

i = 1

forforforfor c inininin message:

set_red(pic, 0, i, ord(c))

i += 1

Multimedia Programming Steganography

Encode

defdefdefdef encode(message, pic):

assertassertassertassert len(message) < 256, 'Message is too long'

set_red(pic, 0, 0, len(message))

i = 1

forforforfor c inininin message:

set_red(pic, 0, i, ord(c))

i += 1

Page 10: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Encode

defdefdefdef encode(message, pic):

assertassertassertassert len(message) < 256, 'Message is too long'

set_red(pic, 0, 0, len(message))

i = 1

forforforfor c inininin message:

set_red(pic, 0, i, ord(c))

i += 1

Multimedia Programming Steganography

Encode

defdefdefdef encode(message, pic):

assertassertassertassert len(message) < 256, 'Message is too long'

set_red(pic, 0, 0, len(message))

i = 1

forforforfor c inininin message:

set_red(pic, 0, i, ord(c))

i += 1

Page 11: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Encode

defdefdefdef encode(message, pic):

assertassertassertassert len(message) < 256, 'Message is too long'

set_red(pic, 0, 0, len(message))

i = 1

forforforfor c inininin message:

set_red(pic, 0, i, ord(c))

i += 1

Multimedia Programming Steganography

Encode

defdefdefdef encode(message, pic):

assertassertassertassert len(message) < 256, 'Message is too long'

set_red(pic, 0, 0, len(message))

i = 1

forforforfor c inininin message:

set_red(pic, 0, i, ord(c))

i += 1

defdefdefdef set_red(pic, x, y, val):

r, g, b = pic.getpixel((x, y))

pic.putpixel((x, y), (val, g, b))

Page 12: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Encode

defdefdefdef encode(message, pic):

assertassertassertassert len(message) < 256, 'Message is too long'

set_red(pic, 0, 0, len(message))

i = 1

forforforfor c inininin message:

set_red(pic, 0, i, ord(c))

i += 1

defdefdefdef set_red(pic, x, y, val):

r, g, b = pic.getpixel((x, y))

pic.putpixel((x, y), (val, g, b))

Multimedia Programming Steganography

Decode

defdefdefdef decode(pic):

num_chars = get_red(pic, 0, 0)

message = ''

forforforfor i inininin range(1, num_chars+1):

message += chr(get_red(pic, 0, i))

i += 1

returnreturnreturnreturn message

Page 13: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Decode

defdefdefdef decode(pic):

num_chars = get_red(pic, 0, 0)

message = ''

forforforfor i inininin range(1, num_chars+1):

message += chr(get_red(pic, 0, i))

i += 1

returnreturnreturnreturn message

Multimedia Programming Steganography

Decode

defdefdefdef decode(pic):

num_chars = get_red(pic, 0, 0)

message = ''

forforforfor i inininin range(1, num_chars+1):

message += chr(get_red(pic, 0, i))

i += 1

returnreturnreturnreturn message

Page 14: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Decode

defdefdefdef decode(pic):

num_chars = get_red(pic, 0, 0)

message = ''

forforforfor i inininin range(1, num_chars+1):

message += chr(get_red(pic, 0, i))

i += 1

returnreturnreturnreturn message

Multimedia Programming Steganography

Decode

defdefdefdef decode(pic):

num_chars = get_red(pic, 0, 0)

message = ''

forforforfor i inininin range(1, num_chars+1):

message += chr(get_red(pic, 0, i))

i += 1

returnreturnreturnreturn message

Why not str?

Page 15: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Decode

defdefdefdef decode(pic):

num_chars = get_red(pic, 0, 0)

message = ''

forforforfor i inininin range(1, num_chars+1):

message += chr(get_red(pic, 0, i))

i += 1

returnreturnreturnreturn message

defdefdefdef get_red(pic, x, y):

r, g, b = pic.getpixel((x, y))

returnreturnreturnreturn r

Multimedia Programming Steganography

Result

'ABCDEF'

Page 16: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Result

'ABCDEF'

Multimedia Programming Steganography

Result

'ABCDEF'

Page 17: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Result

'ABCDEF'

Multimedia Programming Steganography

Result

'ABCDEF'

Page 18: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Result

?

'ABCDEF'

Multimedia Programming Steganography

JPEG is a lossy format

Page 19: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

JPEG is a lossy format

Throw away some information to improve compression

Multimedia Programming Steganography

JPEG is a lossy format

Throw away some information to improve compression

Human eye can't tell the difference…

Page 20: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

JPEG is a lossy format

Throw away some information to improve compression

Human eye can't tell the difference…

…but uncompressed image is not identical to original

Multimedia Programming Steganography

JPEG is a lossy format

Throw away some information to improve compression

Human eye can't tell the difference…

…but uncompressed image is not identical to original

Not very good for hiding messages…

Page 21: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

JPEG is a lossy format

Throw away some information to improve compression

Human eye can't tell the difference…

…but uncompressed image is not identical to original

Not very good for hiding messages…

Use a lossless format like PNG instead

Multimedia Programming Steganography

Try program on a square white PNG

Page 22: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Try program on a square white PNG

$ steg -e 'ABCDEF' white.png encoded.png

ValueError: too many values to unpack

Multimedia Programming Steganography

Try program on a square white PNG

$ steg -e 'ABCDEF' white.png encoded.png

ValueError: too many values to unpack

def set_red(pic, x, y, val):

r, g, b = pic.getpixel((x, y))

pic.putpixel((x, y), (val, g, b))

Page 23: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Try program on a square white PNG

$ steg -e 'ABCDEF' white.png encoded.png

ValueError: too many values to unpack

def set_red(pic, x, y, val):

r, g, b = pic.getpixel((x, y))

pic.putpixel((x, y), (val, g, b))

Pixel at (0, 0) is (255, 255, 255, 255)

Multimedia Programming Steganography

Try program on a square white PNG

$ steg -e 'ABCDEF' white.png encoded.png

ValueError: too many values to unpack

def set_red(pic, x, y, val):

r, g, b = pic.getpixel((x, y))

pic.putpixel((x, y), (val, g, b))

Pixel at (0, 0) is (255, 255, 255, 255)

alpha (transparency)

Page 24: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Try program on a square white PNG

$ steg -e 'ABCDEF' white.png encoded.png

ValueError: too many values to unpack

def set_red(pic, x, y, val):

r, g, b = pic.getpixel((x, y))

pic.putpixel((x, y), (val, g, b))

Pixel at (0, 0) is (255, 255, 255, 255)

Easy to fix…alpha (transparency)

Multimedia Programming Steganography

Result

size (6)

characters

'ABCDEF'

Page 25: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Result

size (6)

characters

Not very well hidden…

'ABCDEF'

Multimedia Programming Steganography

Solution: only use the least significant bit of

the color in each pixel

Page 26: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Solution: only use the least significant bit of

the color in each pixel

Human eye cannot see difference between

(140, 37, 200) and (141, 36, 201)

Multimedia Programming Steganography

Solution: only use the least significant bit of

the color in each pixel

Human eye cannot see difference between

(140, 37, 200) and (141, 36, 201)

'A' = 6510 = 010000012

Page 27: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Solution: only use the least significant bit of

the color in each pixel

Human eye cannot see difference between

(140, 37, 200) and (141, 36, 201)

'A' = 6510 = 010000012

(8 bits/character) / (3 bytes/pixel) = 3 pixels/character

Multimedia Programming Steganography

Solution: only use the least significant bit of

the color in each pixel

Human eye cannot see difference between

(140, 37, 200) and (141, 36, 201)

'A' = 6510 = 010000012

(8 bits/character) / (3 bytes/pixel) = 3 pixels/character

(With one bit unused)

Page 28: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Extract bits

defdefdefdef get_bits(char):

num = ord(char)

result = [0] * 8

forforforfor i inininin range(8):

ifififif (num % 2) != 0:

result[i] = 1

num /= 2

returnreturnreturnreturn result

Multimedia Programming Steganography

Extract bits

defdefdefdef get_bits(char):

num = ord(char)

result = [0] * 8

forforforfor i inininin range(8):

ifififif (num % 2) != 0:

result[i] = 1

num /= 2

returnreturnreturnreturn result

Page 29: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Extract bits

defdefdefdef get_bits(char):

num = ord(char)

result = [0] * 8

forforforfor i inininin range(8):

ifififif (num % 2) != 0:

result[i] = 1

num /= 2

returnreturnreturnreturn result

Multimedia Programming Steganography

Extract bits

defdefdefdef get_bits(char):

num = ord(char)

result = [0] * 8

forforforfor i inininin range(8):

ifififif (num % 2) != 0:

result[i] = 1

num /= 2

returnreturnreturnreturn result

Page 30: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Extract bits

char 'A'

num 6510 = 010000012

result [1,0,0,0,0,0,0,0]

i 0

defdefdefdef get_bits(char):

num = ord(char)

result = [0] * 8

forforforfor i inininin range(8):

ifififif (num % 2) != 0:

result[i] = 1

num /= 2

returnreturnreturnreturn result

Multimedia Programming Steganography

Extract bits

char 'A'

num 3210 = 001000002

result [1,0,0,0,0,0,0,0]

i 1

defdefdefdef get_bits(char):

num = ord(char)

result = [0] * 8

forforforfor i inininin range(8):

ifififif (num % 2) != 0:

result[i] = 1

num /= 2

returnreturnreturnreturn result

Page 31: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Extract bits

char 'A'

num 1610 = 000100002

result [1,0,0,0,0,0,0,0]

i 2

defdefdefdef get_bits(char):

num = ord(char)

result = [0] * 8

forforforfor i inininin range(8):

ifififif (num % 2) != 0:

result[i] = 1

num /= 2

returnreturnreturnreturn result

Multimedia Programming Steganography

Extract bits

char 'A'

num 110 = 000000012

result [1,0,0,0,0,0,1,0]

i 6

defdefdefdef get_bits(char):

num = ord(char)

result = [0] * 8

forforforfor i inininin range(8):

ifififif (num % 2) != 0:

result[i] = 1

num /= 2

returnreturnreturnreturn result

Page 32: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Combine with pixels

defdefdefdef combine(pixel, bits):

assertassertassertassert len(pixel) == len(bits), 'Length mismatch'

pixel = list(pixel)

forforforfor i inininin range(len(pixel)):

even = 2 * (pixel[i] / 2)

ifififif bits[i]:

even += 1

pixel[i] = even

returnreturnreturnreturn tuple(pixel)

Multimedia Programming Steganography

Combine with pixels

defdefdefdef combine(pixel, bits):

assertassertassertassert len(pixel) == len(bits), 'Length mismatch'

pixel = list(pixel)

forforforfor i inininin range(len(pixel)):

even = 2 * (pixel[i] / 2)

ifififif bits[i]:

even += 1

pixel[i] = even

returnreturnreturnreturn tuple(pixel)

Page 33: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Combine with pixels

defdefdefdef combine(pixel, bits):

assertassertassertassert len(pixel) == len(bits), 'Length mismatch'

pixel = list(pixel)

forforforfor i inininin range(len(pixel)):

even = 2 * (pixel[i] / 2)

ifififif bits[i]:

even += 1

pixel[i] = even

returnreturnreturnreturn tuple(pixel)

Multimedia Programming Steganography

Combine with pixels

defdefdefdef combine(pixel, bits):

assertassertassertassert len(pixel) == len(bits), 'Length mismatch'

pixel = list(pixel)

forforforfor i inininin range(len(pixel)):

even = 2 * (pixel[i] / 2)

ifififif bits[i]:

even += 1

pixel[i] = even

returnreturnreturnreturn tuple(pixel)

Page 34: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Test

forforforfor (p, b) inininin ((( 0, 0, 0), (0, 1, 0)),

(( 1, 1, 1), (1, 0, 1)),

(( 2, 2, 2), (1, 0, 1)),

((255, 255, 255), (0, 1, 1))):

result = combine(p, b)

printprintprintprint p, '+', b, '=>', result

(0, 0, 0) + (0, 1, 0) => (0, 1, 0)

(1, 1, 1) + (1, 0, 1) => (1, 0, 1)

(2, 2, 2) + (1, 0, 1) => (3, 2, 3)

(255, 255, 255) + (0, 1, 1) => (254, 255, 255)

Multimedia Programming Steganography

Write the other functions

Page 35: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

Multimedia Programming Steganography

Write the other functions

Most important message: bits don't mean anything

Multimedia Programming Steganography

Write the other functions

Most important message: bits don't mean anything

Meaning comes from how we act on them

Page 36: Multimedia Programming · Multimedia Programming Steganography Data is 1's and 0's Normally think of them as integers, characters, etc. Multimedia Programming Steganography Data is

November 2010

created by

Greg Wilson

Copyright © Software Carpentry 2010

This work is licensed under the Creative Commons Attribution License

See http://software-carpentry.org/license.html for more information.