如何利用Opencv实现图像的加密解密
1. Opencv简介
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。OpenCV的语言接口有C++、Python、Java等,可以在不同平台下灵活进行应用程序开发。
2. 图像加密解密
图像加密解密是信息安全领域的重要问题之一,常用于图片的加密保护、音视频加密等场景。本教程主要介绍如何使用OpenCV实现基于AES算法的图像加密解密过程。
3. 加密过程
3.1 准备工作
首先需要安装python和opencv-python库,并且确保已经安装了numpy和pycrypto这两个库。如果没有安装,可以通过如下命令安装:
pip install opencv-python numpy pycrypto
接着,需要准备加密所需的密钥,可以使用随机生成的字符串作为密钥,示例代码如下:
import base64
import os
# 随机生成一个32位的密钥
def generate_key():
"""
生成 256 bits 的随机密钥
"""
if not os.path.exists("key"):
os.makedirs("key")
key_file = os.path.join("key", "key.txt")
if os.path.exists(key_file):
with open(key_file, "r") as f:
key = f.read()
else:
key = base64.b64encode(os.urandom(24))
with open(key_file, "w") as f:
f.write(key.decode())
return key
3.2 加密图片
首先需要读取要加密的图片,并将其转化为numpy数组格式。然后将图片数据按照密钥进行AES加密,代码如下:
import cv2
from Crypto.Cipher import AES
import numpy as np
# 将图片加密
def encrypt_img(img_path, key):
"""
将图片进行加密
"""
img = cv2.imread(img_path)
img_data = np.array(img)
img_str = img_data.tostring()
key = key # 密钥
iv = key # 初始向量,使用密钥作为向量
cryptor = AES.new(key, AES.MODE_CBC, iv)
# 补全字节数,保证按照密钥长度进行加密
padding = AES.block_size - len(img_str) % AES.block_size
img_str += bytes([padding]) * padding
encrypt_data = cryptor.encrypt(img_str)
return encrypt_data
3.3 保存加密数据
将加密后的数据保存为文件,代码如下:
# 保存加密后的数据
def save_data(encrypt_data, output_path):
"""
将加密后的数据保存到文件
"""
with open(output_path, "wb") as f:
f.write(encrypt_data)
4. 解密过程
4.1 解密图片
首先需要读取加密的文件,并将其解密为numpy数组格式图片,这需要使用到与加密中相同的密钥和初始向量,代码如下:
# 解密加密后的数据
def decrypt_img(encrypt_data, key):
"""
解密加密后的图片数据
"""
iv = key # 初始向量,使用密钥作为向量
cryptor = AES.new(key, AES.MODE_CBC, iv)
img_data = cryptor.decrypt(encrypt_data)
# 去除补全的字节
padding = img_data[-1]
if padding > AES.block_size:
raise ValueError("无效的填充字节")
img_data = img_data[:-padding]
# 将字节转化为numpy数组格式
img_arr = np.frombuffer(img_data, np.uint8)
img = cv2.imdecode(img_arr, cv2.IMREAD_COLOR)
return img
4.2 查看解密结果
通过调用上一步解密出来的图片,可以对其进行查看和保存操作,代码如下:
# 保存解密后的图片
def save_img(img, output_path):
"""
将解密后的图片保存到本地
"""
cv2.imwrite(output_path, img)
5. 示例
5.1 示例1:对一张图片进行加密解密
# 对一张图片进行加密解密
key = generate_key()
img_path = "test.jpg"
encrypt_data = encrypt_img(img_path, key)
save_data(encrypt_data, "encrypt.dat")
decrypt_data = open("encrypt.dat", "rb").read()
img = decrypt_img(decrypt_data, key)
save_img(img, "decrypt.jpg")
5.2 示例2:批量加密文件夹内的所有图片
# 批量加密文件夹内的所有图片
key = generate_key()
input_dir = "input"
output_dir = "output"
if not os.path.exists(output_dir):
os.makedirs(output_dir)
for file_name in os.listdir(input_dir):
file_path = os.path.join(input_dir, file_name)
if os.path.isfile(file_path) and file_name.split(".")[-1].lower() in ["png", "jpg", "bmp"]:
encrypt_data = encrypt_img(file_path, key)
save_data(encrypt_data, os.path.join(output_dir, file_name + ".dat"))
至此,由Opencv实现图像加密解密的攻略完整结束。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:如何利用Opencv实现图像的加密解密 - Python技术站