From 032a0fb21c16d499ca8b7b80547a8d68b1600619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20MARQUET?= Date: Wed, 31 Jan 2024 11:32:00 +0100 Subject: [PATCH] stenographie continue but not end --- TP2/main.py | 22 +++++++- TP2/tp_steganographie.py | 106 ++++++++++++++++++++++++++++++++------- 2 files changed, 109 insertions(+), 19 deletions(-) diff --git a/TP2/main.py b/TP2/main.py index 283abab..936a9a5 100644 --- a/TP2/main.py +++ b/TP2/main.py @@ -1,7 +1,10 @@ from tp2 import * from tp2_optionnel import * +from tp_steganographie import * + def __main__(): + '''x fond_bleu = Image.new("RGB", (450, 300), (0, 0, 255)) fond_bleu.show() drapeau_fr = creer_drapeau_francais() @@ -11,7 +14,7 @@ def __main__(): lena = Image.open("lena.png") lena.show() print(lena.size) - r, g, b = lena.getpixel((0,0)) + r, g, b = lena.getpixel((0, 0)) print(r, g, b) lena_miror = miroir(lena) lena_miror.show() @@ -26,7 +29,22 @@ def __main__(): lena_tournee.show() lena_contours = contours(lena, 50) lena_contours.show() + print(getHiddenTextWithDelimiter(hiddenText1, "\0")) + print(getHiddenTextWithDelimiter(hiddenText2, "\0")) + print(getHiddenTextOfLength(hiddenText3, 4)) + print(getHiddenTextOfLength(hiddenText4, 16)) + ''' + hidden1 = getHiddenImage(hiddenImage1, 8) + hidden1.show() + hidden2 = getHiddenImage(hiddenImage2, 8) + hidden2.show() + ''' + hidden3 = getHiddenImageInLastBits(hiddenImage3, 8, 2) + hidden3.show() + hidden4 = getHiddenImageInLastBits(hiddenImage4, 16, 2) + hidden4.show() + ''' if __name__ == "__main__": - __main__() \ No newline at end of file + __main__() diff --git a/TP2/tp_steganographie.py b/TP2/tp_steganographie.py index 9461ea6..ca8174f 100644 --- a/TP2/tp_steganographie.py +++ b/TP2/tp_steganographie.py @@ -1,21 +1,93 @@ from PIL import Image - -def getHiddenTextWithDelimiter(image, delimiter="\0"): - pixel = list(image.getdata()) - hidden_bits = [] - for i in range(len(pixel)): - hidden_bits.append(str(pixel[i][0] & 1)) - binary_string = ''.join(hidden_bits) - octets = [binary_string[i:i + 8] for i in range(0, len(binary_string), 8)] - ascii_characters = ''.join([chr(int(octet, 2)) for octet in octets]) - hidden_text = ascii_characters.split(delimiter)[0] - return hidden_text.split(delimiter)[0] +hiddenText1 = Image.open("hiddenText1.png") +hiddenText2 = Image.open("hiddenText2.png") +hiddenText3 = Image.open("hiddenText3.png") +hiddenText4 = Image.open("hiddenText4.png") +hiddenImage1 = Image.open("hiddenImage1.png") +hiddenImage2 = Image.open("hiddenImage2.png") +hiddenImage3 = Image.open("hiddenImage3.png") +hiddenImage4 = Image.open("hiddenImage4.png") -print("Image 1") -image = Image.open('hiddenText1.png') -print(getHiddenTextWithDelimiter(image)) -print("Image 2") -image = Image.open('hiddenText2.png') -print(getHiddenTextWithDelimiter(image)) \ No newline at end of file +def imageToArray(image): + array = [] + for pixel in image.getdata(): + array.append(pixel[0]) + array.append(pixel[1]) + array.append(pixel[2]) + return array + + +def getLength(imageArray, nbBitsForLength, index=0): + length, i = 0, nbBitsForLength - 1 + for len in range(index, index + nbBitsForLength): + length += imageArray[len] % 2 * (2 ** i) + i -= 1 + return length + + +def getChar(imageArray, index): + binN, i = 0, 6 + for j in range(index, index + 7): + binN += (imageArray[j] % 2) * (2 ** i) + i -= 1 + return chr(binN) + + +def getHiddenTextWithDelimiter(image, delimiter): + imageArray = imageToArray(image) + hiddenText = "" + i = 0 + while getChar(imageArray, i) != delimiter: + hiddenText += getChar(imageArray, i) + i += 7 + return hiddenText + + +def getHiddenTextOfLength(image, nbBitsForLength): + imageArray = imageToArray(image) + hiddenText = "" + for i in range(nbBitsForLength, ((getLength(imageArray, nbBitsForLength) * 7) + nbBitsForLength), 7): + hiddenText += getChar(imageArray, i) + return hiddenText + + +def getLenghtTuple(imageArray, nbBitsForLength, index=0): + length = 0, nbBitsForLength - 1 + i = nbBitsForLength - 1 + while i >= 0: + length += imageArray[index] % 2 * (2 ** i) + i -= 1 + index += 1 + print(length) + return length + + +def imageToArrayTuple(image): + array = [] + for pixel in image.getdata(): + array.append((pixel[0], pixel[1], pixel[2])) + return array + + +def getHiddenImage(image, nbBitsForSize): + imageArray = imageToArrayTuple(image) + print(imageArray[0:10]) + width = getLenghtTuple(imageArray, nbBitsForSize) + height = getLenghtTuple(imageArray, nbBitsForSize, nbBitsForSize * 2) + print(width) + print(height) + totalPixel = width * height * 3 + hiddenImagePixel = [imageArray[i:i + 3] for i in range(nbBitsForSize * 2, nbBitsForSize * 2 + totalPixel, 3)] + hiddenImagePixel = [value for pixel in hiddenImagePixel for value in pixel] + hiddenImagePixel = [(hiddenImagePixel[i], hiddenImagePixel[i + 1], hiddenImagePixel[i + 2]) for i in + range(0, len(hiddenImagePixel), 3)] + hiddenImage = Image.new("RGB", (width, height)) + hiddenImage.putdata(hiddenImagePixel) + return hiddenImage + + +def getHiddenImageInLastBits(image, nbBitsForSize, nbLastBits): + #To Do + return None