herrDeng網內搜尋

自訂搜尋

Ads

2022年5月27日 星期五

AES python實作圖檔加密



 print('安裝密碼學套件pycryptodome,使用AES256加密圖檔opencv處理')

!pip install pycryptodome

from Crypto.Cipher import AES


import cv2
import numpy as np
from google.colab import files
from google.colab.patches import cv2_imshow

x=files.upload()
for f in x.keys():
  s=f
  print(s)

"""因AES的block_size=128/8=16(bytes),圖檔也要根據(w,h)
pad使得修改後的w, h為4的倍數

"""

def pad(im):
  global h,w
  h2=(h+3)//4*4
  w2=(w+3)//4*4
  print('改圖使其(w,h)為4的倍數',(w2,h2))
  im2 = np.zeros((h2, w2, 3), dtype=np.uint8)
  im2[0:h, 0:w, 0:3]=im
  h,w=(h2, w2)
  im=im2
  return im

"""不是整個圖檔加密,而是針對圖檔內容每個pixel加密,如果h, w非4倍數,就要pad

"""

im=cv2.imread(s)
sz=im.shape
print(sz)
h, w, _=sz
if h%4!=0 or w%4!=0:
  im=pad(im)  
cv2_imshow(im)

"""把圖檔內容轉成1D array"""

ss=h*w*3
data=im.reshape(ss, order='C')
data

"""轉成bytes"""

m=data.tobytes('C')
m

"""輸入passphrase透過hash產生密鑰secret key與iv"""

import getpass
p = getpass.getpass('輸入passphrase:')

import hashlib
x=hashlib.sha256()
x.update(p.encode())
key=x.digest()
print("sha256長度256 bits產生key:\n",key.hex())

x=hashlib.md5()
x.update(p.encode())
iv=x.digest()
print("md5長度128 bits產生iv:\n",iv.hex())

"""ECB或是CBC

"""

aes = AES.new(key, AES.MODE_CBC, iv)
#aes =AES.new(key, AES.MODE_ECB)

"""加密"""
cc=aes.encrypt(m)

"""將bytes資料秀圖並存成'cipher.png'"""

def bytes_image(b):
  im0=np.frombuffer(b, dtype=np.uint8)
  im=im0.reshape(h, w, 3)
  cv2_imshow(im)
  cv2.imwrite('cipher.png', im)

bytes_image(cc)

files.download('cipher.png')

沒有留言:

Related Posts Plugin for WordPress, Blogger...

熱門文章