暗号化と暗号化の原則
XOR演算を使用して画像の暗号化および復号化機能を実現します。
XOR 演算規則 (同じ場合は 0、異なる場合は 1)
- オペランドが同じ場合、結果は 0 になり、オペランドが異なる場合、結果は 1 になります。
- 任意の数値 (0/1) と 0 の XOR を実行しても、結果はそのままになります
- 任意の数値 (0/1) と 1 の XOR をとります。結果は別の数値になります。つまり、0 は 1 になり、1 は 0 になります。
- 任意の数値とそれ自体の XOR を実行すると、結果は 0 になります
画像の暗号化と復号化についても同様です
- 暗号化プロセス: 平文 a と鍵 b の XOR 演算により暗号文 c を取得
- 復号化プロセス: 暗号文 c と鍵 b の XOR 演算を実行し、平文 a を取得します。
コードを実行する
import cv2 as cv
import numpy as np
lena = cv.imread("lena.jpg")
row, colm,count = lena.shape
print(row)
print(colm)
key = np.random.randint(0, 256, size=[row, colm,count], dtype=np.uint8)
encryption = cv.bitwise_xor(lena, key)
decryption = cv.bitwise_xor(encryption, key)
cv.imshow("lena", lena)
cv.imshow("key", key)
cv.imshow("encryption",encryption)
cv.imshow("decryption",decryption)
cv.waitKey()
cv.destroyAllWindows()
次のように実行します。
顔の暗号化と復号化
顔の暗号化と復号化は、実際には画像の一部の領域を暗号化および復号化するプロセスです。
顔コーディングの機能は、マスク + np XOR 演算の組み合わせに似ており、顔コーディングには 2 つの方法があり、1 つはマスク手法によるもの、もう 1 つは ROI 手法によるものです。
マスクメソッド
暗号化プロセス:
復号化プロセス:
具体的なコードは次のように実装されます。
import cv2 as cv
import numpy as np
# 读取原始图
lena = cv.imread("lena.png", 0)
cv.imshow("lena", lena)
r, c = lena.shape
# 得到掩码模板
mask = np.zeros((r, c), dtype=np.uint8)
mask[220:400, 250:350] = 1
# 得到加密解密的密钥图像
key = np.random.randint(0, 256, size=[r, c], dtype=np.uint8)
# ========================获取加密的脸===================
# step1 使用密钥key对原始图片lena进行加密
lenaXorKey = cv.bitwise_xor(lena, key)
# step2 获取已经加密的脸部位置信息(整个加密图像与mask做与运算)
encryptFace = cv.bitwise_and(lenaXorKey, mask * 255)
# step3 另外再对lena图像进行处理 通过使用 反mask,得到没有人脸信息的lena图像
noFace = cv.bitwise_and(lena, (1 - mask) * 255)
# step4 把获取的已经加密的只有人脸的图像加到被扣掉人脸信息的lena图像上,得到人脸加密的lena图像
maskFace = encryptFace + noFace
cv.imshow("maskFace", maskFace)
# ========================开始人脸解密===================
# step5 将脸部加密的lena与密钥key进行异或,这样人脸区域会解密,其他区域会被加密(不重要)
extractOriginal = cv.bitwise_xor(maskFace, key)
# step6 提取解密后的人脸,其他区域是0
extractFace = cv.bitwise_and(extractOriginal, mask * 255)
# step7 从打码的lena图像中提取没有人脸信息的lena图像(人脸区域为0)
noface2 = cv.bitwise_and(maskFace, (1 - mask) * 255)
cv.imshow("nofaceee", noface2)
# step8 在扣掉人脸的lena图像中加入已经解密后的人脸
extractLena = noface2 + extractFace
cv.imshow("extractLena", extractLena)
cv.waitKey()
cv.destroyAllWindows()
プログラムは次のように実行されます。
ROI法
ROI 法は顔領域の処理に重点を置いています。
顔の暗号化プロセスは次のとおりです。
顔の復号化プロセスは次のとおりです。
ROI 法で顔を暗号化および復号化するプロセスは、不正なプロセスのように感じられます。
コードは以下のように表示されます。
import cv2 as cv
import numpy as np
# 读取原始图
lena = cv.imread("lena.png", 0)
cv.imshow("lena", lena)
r, c = lena.shape
# 得到掩码模板
mask = np.zeros((r, c), dtype=np.uint8)
mask[220:400, 250:350] = 1
# 得到加密解密的密钥图像
key = np.random.randint(0, 256, size=[r, c], dtype=np.uint8)
# ========================获取加密的脸===================
# step1 使用密钥key对原始图片lena进行加密
lenaXorKey = cv.bitwise_xor(lena, key)
# step2 得到加密的人脸区域
secretFace = lenaXorKey[220:400, 250:350]
# step3 把加密的人脸区域贴到lena原始图上
lena[220:400, 250:350] = secretFace
cv.imshow("lena_secretface", lena)
# ========================开始人脸解密===================
# step4 将脸部加密的lena与密钥key进行异或,这样人脸区域会解密,其他区域会被加密(不重要)
extractOriginal = cv.bitwise_xor(lena, key)
# step5 扣下已经解密的人脸图像
face = extractOriginal[220:400, 250:350]
# step6 把扣下的人脸贴到加密的lena上,这样,解密后的脸就把加密的人的区域覆盖了
lena[220:400, 250:350] = face
cv.imshow("enFace", lena)
cv.waitKey()
cv.destroyAllWindows()
プログラムは次のように実行されます。
概要: 画像の暗号化と復号化は XOR 演算とマスクに似ており、ROI の包括的な使用は全体的には難しくありません。