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
|
from PIL import Image
import numpy as np
img = Image.open("stegg.jpg")
width, height = img.size
ImgArray = np.zeros((height, width, 3), dtype=np.uint8) #initialise tableau de la taille de l'image
for columns in range(width): #rempli tableau avec pixel image (1e plan pour r, 2e pour v, 3e pour b)
for lines in range(height):
r,v,b = img.getpixel((columns,lines)) #(x, y)
ImgArray[lines, columns, 0] = r
ImgArray[lines, columns, 1] = v
ImgArray[lines, columns, 2] = b
def encrypt_text():
message = "je m'appelle test"
message = "#/#/#"+message+"#/#/#"
BinMessage = []
for i in message: #transforme chaque lettre en octet
BinMessage.append(format(ord(i), "08b")) #formatage
BinMessage = ''.join(BinMessage)#transforme la liste des octets, en (une suite sans espaces)
return BinMessage
def encrypt_into_image():
BinMessage = encrypt_text()
if len(BinMessage) <= ImgArray.size:
messageIndex = 0 #compteur
messageSize = len(BinMessage)
for dim in range(3): #parcours tableau
for columns in range(width): #parcours tableau
for lines in range(height): #parcours tableau
value = ImgArray[lines, columns, dim] #récupère valeur du pixel
value = format(int(value), "08b") #transforme en binaire
value = (int(value[:-1] + BinMessage[messageIndex], 2)) #enlève dernier bit et remplace par celui de BinMessage
#print(value)
ImgArray[lines, columns, dim] = value
if messageIndex == messageSize - 1: #quand tout texte caché dans image:
print(ImgArray[0:16, 0, 0])
print("finished")
pil_image=Image.fromarray(ImgArray) #transformer tableau en image
pil_image.save("stegg.jpg") #save
return "ok" #pour stopper boucle
else:
messageIndex += 1 #sinon ajoute un au compteur et recommence
else:
print("The text couldn't be hidden into the image because the image is too small to contain this text\n Please extend the image")
def decrypt():
text = []
print(ImgArray[0:16, 0, 0])
for dim in range(3): #parcours de la même façon qu'à l'encodage
for columns in range(width):
for lines in range(height):
value = ImgArray[lines, columns, dim] #récupère valeur en chiffre
value = format(int(value), "08b") #la met en bit
last_bit = value[-1] #récupère dernier bit de l'octet
text.append(last_bit) #les met à la suite dans text
i = 0
octet = []
finally_text = []
for num in range(len(text)): #pour trancher tout les 8 bits et faire des octets
if i != 8:
bit = text[num]
#print(bit)
octet.append(bit)
i += 1
else:
octet = "".join(octet)
ascii = int(octet, 2) #met octet en int
character = chr(ascii) #récupère caractère qui correspond au nombre
finally_text.append(character) #ajoute à liste de caractère
i = 0 # on remet le compteur de bit à 0
octet = [] #on retransforme octet en liste
#transforme liste en str
finally_text = "".join(finally_text)
ask = input("What do you want to do ?\n[0] encrypt\n[1] decrypt\n")
if int(ask) == 0:
encrypt_into_image()
elif int(ask) == 1:
decrypt()
else:
print("Please enter a good value") |
Partager