2013-03-06 58 views
1

我有一個圖像文件,並希望使用Python來編輯圖像而不可見地修改圖片,同時仍然更改文件的MD5哈希值。如何在Python中更改圖像的MD5哈希值?

這樣做的最好方法是什麼?

+0

You You d看看你是否可以擺弄標題數據,或者只是改變一個像素。 – 2013-03-06 17:56:22

+0

你想使用什麼圖像格式? (JPEG,PNG,BMP,...) – kay 2013-03-06 17:57:20

+0

@Kay我會使用JPEG。 – user1814016 2013-03-06 17:59:03

回答

1

我結束了使用pyexiv2來修改圖像的元數據,如:

>>> md5sum('photo.jpg') 
'89dd603a0ce14750799a5144a56fbc12' 
>>> image = pyexiv2.ImageMetadata('photo.jpg') 
>>> image.read() 
>>> image['Exif.Image.ImageDescription'] = '%030x' % random.randrange(256**15) 
>>> image.write() 
>>> md5sum('photo.jpg') 
'426cc91835e7f4f5e92c5a48850adc05' 
2

使用@Martijn Pieters的解決方案:只需在標頭或安全的地方更換一個位。

或者更簡單,如果你可以改變文件大小:在文件中附加一個'\0'(以及任何字符都可以)。它仍然是一個有效的JPEG文件,並沒有可見的變化。

echo -n ' ' >> my_image.jpeg 

一個粗溶液是

  • 轉換(的一個顏色平面)中的圖像到傅立葉空間(使用DFT/FFT),
  • 改變在一些像素值低頻率(大部分存儲在二維陣列的右下角),
  • 並將圖像轉換回圖像空間(使用ifft)。

所有像素都會有所不同,幾乎沒有光學變化。

1
import hashlib 
hashlib.md5(open('image.png','rb').read()).hexdigest() # rb = readbyte ,so it will work for text as well as media (image,video) files 

輸出>>> '724c6d87452c3a137ef1499c2d4b6576' #MD5哈希值

file = open('image.png', 'rb').read() 
with open('new_image.png', 'wb') as new_file: 
    new_file.write(file+'\0') #here we are adding a null to change the file content 

hashlib.md5(open('new_image.png','rb').read()).hexdigest() 

輸出>>> 'a345838e8af07b65344e19989c7c5d85'#同一個媒體文件的#新md5散列值