1. Random Image
官方给出的加密代码如下:
#!/usr/bin/env python
import Image
import random
def get_color(x, y, r):
n = (pow(x, 3) + pow(y, 3)) ^ r
return (n ^ ((n >> 8) << 8 ))
flag_img = Image.open("flag.png")
im = flag_img.load()
r = random.randint(1, pow(2, 256))
print flag_img.size
enc_img = Image.new(flag_img.mode, flag_img.size)
enpix = enc_img.load()
for x in range(flag_img.size[0]):
for y in range(flag_img.size[1]):
t = random.randint(1, pow(2, 256)) % 250
enpix[x,y] = t
for x in range(flag_img.size[0]):
for y in range(flag_img.size[1]):
if im[x,y] < 250 :
s = get_color(x, y, r)
enpix[x,y] = s
enc_img.save('enc' + '.png')
加密后的图片如下(enc.png):
分析加密代码主要就是当原来的像素小于250的时候就经过get_color()来获得相应的像素值。
get_color()这个函数就是取(x**3+y**3)^r的最后8位,虽然不能直接求出r,但是只要知道其最后八位就可以了。可以用暴力从0-255。初始化enc.png的像素的时候都是取250的模的所以应该都是小于250,对于那些大于250的值一定是从get_color()中获得。
(1) 先获得像素点大于250的点
import Image
enc_img=Image.open('enc.png')
im=enc_img.load()
count=0
for x in range(enc_img.size[0]):
for y in range(enc_img.size[1]):
if im[x,y]>=250:
print x,y,im[x,y]
count+=1
print count
一部分的结果如下:
1317 64 251
1323 29 254
1325 27 254
1326 61 251
1330 43 253
1334 44 254
1335 45 250
1344 37 251
1345 54 255
1347 32 253
1347 40 253
1347 48 253
1347 56 253
1350 32 254
1350 56 254
1353 59 250
1366 29 251
1366 59 253
1368 37 251
1372 54 254
在其中随便选中一点来实现暴力求解r
def get_color(x, y, r):
n = (pow(x, 3) + pow(y, 3)) ^ r
return (n ^ ((n >> 8) << 8 ))
for i in range(256):
if get_color(1372,54,i)==254:
print i
break
beyond@beyond ~/下载