Python
2019.07.17 15:01

Image 기반 Steganography 예제

조회 수 28635 댓글 1
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print
?

단축키

Prev이전 문서

Next다음 문서

+ - Up Down Comment Print


https://www.geeksforgeeks.org/image-based-steganography-using-python/



[Python 3]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
# Python program implementing Image Steganography
 
# PIL module is used to extract
# pixels of image and modify it
from PIL import Image
 
# Convert encoding data into 8-bit binary
# form using ASCII value of characters
def genData(data):
         
        # list of binary codes
        # of given data
        newd = []
         
        for i in data:
            newd.append(format(ord(i), '08b'))
        return newd
         
# Pixels are modified according to the
# 8-bit binary data and finally returned
def modPix(pix, data):
     
    datalist = genData(data)
    lendata = len(datalist)
    imdata = iter(pix)
 
    for i in range(lendata):
         
        # Extracting 3 pixels at a time
        pix = [value for value in imdata.__next__()[:3] +
                                imdata.__next__()[:3] +
                                imdata.__next__()[:3]]
                                     
        # Pixel value should be made
        # odd for 1 and even for 0
        for j in range(0, 8):
            if (datalist[i][j]=='0') and (pix[j]% 2 != 0):
                 
                if (pix[j]% 2 != 0):
                    pix[j] -= 1
                     
            elif (datalist[i][j] == '1') and (pix[j] % 2 == 0):
                pix[j] -= 1
                 
        # Eigh^th pixel of every set tells
        # whether to stop ot read further.
        # 0 means keep reading; 1 means the
        # message is over.
        if (i == lendata - 1):
            if (pix[-1] % 2 == 0):
                pix[-1] -= 1
        else:
            if (pix[-1] % 2 != 0):
                pix[-1] -= 1
 
        pix = tuple(pix)
        yield pix[0:3]
        yield pix[3:6]
        yield pix[6:9]
 
def encode_enc(newimg, data):
    w = newimg.size[0]
    (x, y) = (0, 0)
     
    for pixel in modPix(newimg.getdata(), data):
         
        # Putting modified pixels in the new image
        newimg.putpixel((x, y), pixel)
        if (x == w - 1):
            x = 0
            y += 1
        else:
            x += 1
             
# Encode data into image
def encode():
    img = input("Enter image name(with extension): ")
    image = Image.open(img, 'r')
     
    data = input("Enter data to be encoded : ")
    if (len(data) == 0):
        raise ValueError('Data is empty')
         
    newimg = image.copy()
    encode_enc(newimg, data)
     
    new_img_name = input("Enter the name of new image(with extension): ")
    newimg.save(new_img_name, str(new_img_name.split(".")[1].upper()))
 
# Decode the data in the image
def decode():
    img = input("Enter image name(with extension) :")
    image = Image.open(img, 'r')
     
    data = ''
    imgdata = iter(image.getdata())
     
    while (True):
        pixels = [value for value in imgdata.__next__()[:3] +
                                imgdata.__next__()[:3] +
                                imgdata.__next__()[:3]]
        # string of binary data
        binstr = ''
         
        for i in pixels[:8]:
            if (i % 2 == 0):
                binstr += '0'
            else:
                binstr += '1'
                 
        data += chr(int(binstr, 2))
        if (pixels[-1] % 2 != 0):
            return data
             
# Main Function     
def main():
    a = int(input(":: Welcome to Steganography ::\n"
                        "1. Encode\n 2. Decode\n"))
    if (a == 1):
        encode()
         
    elif (a == 2):
        print("Decoded word- " + decode())
    else:
        raise Exception("Enter correct input")
         
# Driver Code
if __name__ == '__main__' :
     
    # Calling main function
    main()



[Python 2]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# Python program implementing Image Steganography
 
# PIL module is used to extract
# pixels of image and modify it
from PIL import Image
import sys, os
 
# Convert encoding data into 8-bit binary
# form using ASCII value of characters
def genData(data):
    # list of binary codes
    # of given data
    newd = []
 
    for i in data:
        newd.append(format(ord(i), '08b'))
    return newd
 
 
# Pixels are modified according to the
# 8-bit binary data and finally returned
def modPix(pix, data):
    datalist = genData(data)
    lendata = len(datalist)
    imdata = iter(pix)
 
    for i in range(lendata):
 
        # Extracting 3 pixels at a time
        pix = [value for value in imdata.next()[:3] +
               imdata.next()[:3] +
               imdata.next()[:3]]
 
        # Pixel value should be made
        # odd for 1 and even for 0
        for j in range(0, 8):
            if (datalist[i][j] == '0') and (pix[j] % 2 != 0):
 
                if (pix[j] % 2 != 0):
                    pix[j] -= 1
 
            elif (datalist[i][j] == '1') and (pix[j] % 2 == 0):
                pix[j] -= 1
 
        # Eigh^th pixel of every set tells
        # whether to stop ot read further.
        # 0 means keep reading; 1 means the
        # message is over.
        if (i == lendata - 1):
            if (pix[-1] % 2 == 0):
                pix[-1] -= 1
        else:
            if (pix[-1] % 2 != 0):
                pix[-1] -= 1
 
        pix = tuple(pix)
        yield pix[0:3]
        yield pix[3:6]
        yield pix[6:9]
 
 
def encode_enc(newimg, data):
    w = newimg.size[0]
    (x, y) = (0, 0)
 
    for pixel in modPix(newimg.getdata(), data):
 
        # Putting modified pixels in the new image
        newimg.putpixel((x, y), pixel)
        if (x == w - 1):
            x = 0
            y += 1
        else:
            x += 1
 
 
# Encode data into image
def encode(orgfilename, msg, outfilename):
    img = orgfilename
    image = Image.open(img, 'r')
 
    data = msg
    if (len(data) == 0):
        raise ValueError('Data is empty')
 
    newimg = image.copy()
    encode_enc(newimg, data)
 
    new_img_name = outfilename
    newimg.save(new_img_name, str(new_img_name.split(".")[1].upper()))
 
 
# Decode the data in the image
def decode(filename):
    img = filename
    image = Image.open(img, 'r')
 
    data = ''
    imgdata = iter(image.getdata())
 
    while (True):
        pixels = [value for value in imgdata.next()[:3] +
                  imgdata.next()[:3] +
                  imgdata.next()[:3]]
        # string of binary data
        binstr = ''
 
        for i in pixels[:8]:
            if (i % 2 == 0):
                binstr += '0'
            else:
                binstr += '1'
 
        data += chr(int(binstr, 2))
        if (pixels[-1] % 2 != 0):
            print data
            return data
 
        # Main Function
 
def printUsage():
    print " This program Encode / Decode hidden message into image."
    print " <Usage>"
    print "   Encode: steg_test.py -a [input_filename] [message] [out_filename]"
    print "   Decode: steg_test.py -b [out_filename]"
 
if __name__ == '__main__':
    if len(sys.argv) < 3:
        printUsage()
        exit(0)
 
    if sys.argv[1] == '-a':
        if len(sys.argv) == 5:
            encode(sys.argv[2], sys.argv[3], sys.argv[4])
        else:
            printUsage()
    elif sys.argv[1] == '-b':
        if len(sys.argv) == 3:
            decode(sys.argv[2])
        else:
            printUsage()
    else:
        printUsage()



Dreamy의 코드 스크랩

내가 모으고 내가 보는

List of Articles
번호 분류 제목 날짜 조회 수 추천 수
466 Pi OP AMP의 활용 2019.08.05 12933 0
» Python Image 기반 Steganography 예제 1 2019.07.17 28635 0
464 업무 Pen Testing 툴 요약 secret 2019.07.16 0 0
463 일반 SQL Injection 우회 정리 2019.07.10 10860 0
462 C C에서 파일 존재여부 체크 (check file exist) 2019.07.02 21478 0
461 LINUX gdb 쓸때 상용구 secret 2019.06.26 0 0
460 Pi 라즈베리파이 내 작업 명령 secret 2019.06.10 0 0
459 일반 범용 레지 스터(eax, ebx, ecx, edx, esi, edi, esp, ebp) 2019.06.03 13120 0
458 Python 디렉토리 없으면 만들기 2019.03.30 8699 0
457 Python 줄 바꿈 없이 출력하는 방법 2019.03.30 10084 0
456 LINUX Ubuntu에서 Python 버전을 변경하는 방법 2019.03.29 15347 0
455 Python Google Colab에서 파일 업로드/다운로드 팁 2019.03.06 40082 0
454 Python pandas, matplot 자주사용하는 코드 2019.03.06 8061 0
453 Python matplot에서 한글이 보이도록 하는 코드 2019.03.06 9023 0
452 일반 OMV (OpenMediaVault) 플러그인들 2019.02.10 11093 0
목록
Board Pagination ‹ Prev 1 2 3 4 5 6 7 8 9 10 ... 35 Next ›
/ 35

나눔글꼴 설치 안내


이 PC에는 나눔글꼴이 설치되어 있지 않습니다.

이 사이트를 나눔글꼴로 보기 위해서는
나눔글꼴을 설치해야 합니다.

설치 취소

Designed by sketchbooks.co.kr / sketchbook5 board skin

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

Sketchbook5, 스케치북5

불러오는 중···