from PIL import Image, ImageOps image = Image.open("fragment_chiffre.png") key = [0, ] image = ImageOps.grayscale(image) width, height = image.size img = list() #convert image to list of lists for y in range(height): row = list() for x in range(width): row.append(image.getpixel((x,y))) img.append(row) for i in range(0, height-1): min_delta = (width*255*4, width*2) for d in range(width): delta = 0 for x in range(width): delta += abs(img[i][x] - img[i+1][(x+d)%width]) if delta < min_delta[0]: min_delta = (delta, d) print(i, min_delta) d = min_delta[1] img[i+1] = img[i+1][d:] + img[i+1][:d] # key = key + [758, 757, 755, 751, 743, 727, 695, 631, 503, 247, 494, 229, 458, 157, 314, 628, 497, 235, 470, 181, 362, 724, 689, 619, 479, 199, 398, 37, 74, 148, 296, 592, 425, 91, 182, 364, 728, 697, 635, 511, 263, 526, 293, 586, 413, 67, 134, 268, 536, 313, 626, 493, 227, 454, 149, 298, 596, 433, 107, 214, 428, 97, 194, 388, 17, 34, 68, 136, 272, 544, 329, 658, 557, 355, 710, 661, 563, 367, 734, 709, 659, 559, 359, 718, 677, 595, 431, 103, 206, 412, 65, 130, 260, 520, 281, 562, 365, 730, 701, 643, 527, 295, 590, 421, 83, 166, 332, 664, 569, 379, 758, 757, 755, 751, 743, 727, 695, 631, 503, 247, 494, 229, 458, 157, 314, 628, 497, 235, 470, 181, 362, 724, 689, 619, 479, 199, 398, 37, 74, 148, 296, 592, 425, 91, 182, 364, 728, 697, 635, 511, 263, 526, 293, 586, 413, 67, 134, 268, 536, 313, 626, 493, 227, 454, 149, 298, 596, 433, 107, 214, 428, 97, 194, 388, 17, 34, 68, 136, 272, 544, 329, 658, 557, 355, 710, 661, 563, 367, 734, 709, 659, 559, 359, 718, 677, 595, 431, 103, 206, 412, 65, 130, 260, 520, 281, 562, 365, 730, 701, 643, 527, 295, 590, 421, 83, 166, 332, 664, 569, 379, 758, 757, 755, 751, 743, 727, 695, 631, 503, 247, 494, 229, 458, 157, 314, 628, 497, 235, 470, 181, 362, 724, 689, 619, 479, 199, 398, 37, 74, 148, 296, 592, 425, 91, 182, 364, 728, 697, 635, 511, 263, 526, 293, 586, 413, 67, 134, 268, 536, 313, 626, 493, 227, 454, 149, 298, 596, 433, 107, 214, 428, 97, 194, 388, 17, 34, 68, 136, 272, 544, 329, 658, 557, 355, 710, 661, 563, 367, 734, 709, 659, 559, 359, 718, 677, 595, 431, 103, 206, 412, 65, 130, 260, 520, 281, 562, 365, 730, 701, 643, 527, 295, 590, 421, 83, 166, 332, 664, 569, 379, 758, 757, 755, 751, 743] # for i in range(len(key)): # d = width - key[i] # img[i] = img[i][d:] + img[i][:d] #Rebuild image for y in range(height): for x in range(width): image.putpixel((x, y), img[y][x]) image.save("fragment_dechiffre.png") image.show()