opencv-14 图像加密和解密

news2024/10/6 18:25:43

在OpenCV中,图像加密和解密是通过对图像像素进行一系列的变换和操作来实现的
通过按位异或运算可以实现图像的加密和解密。
通过对原始图像与密钥图像进行按位异或,可以实现加密;将加密后的图像与密钥图像再次进行按位异或,可以实现解密。
按位异或运算的基本规则如表 3-15 所示。

在这里插入图片描述
根据上述按位异或运算的规则,假设:
xor(a,b)=c
则可以得到:
xor(c,b)=a
xor(c,a)=b
上述运算的过程如表 3-16 所示

在这里插入图片描述
从上述结果可以看出,如果上述 a、b、c 具有如下关系:
 a:明文,原始数据。
 b:密钥。
 c:密文,通过 xor(a,b)实现。
则可以对上述数据进行如下操作和理解。

 加密过程:将明文 a 与密钥 b 进行按位异或,完成加密,得到密文 c。
 解密过程:将密文 c 与密钥 b 进行按位异或,完成解密,得到明文 a。

位运算是指针对二进制位进行的运算,利用位运算即可实现对像素点的加密。在图像处理中,需要处理的像素点的值通常为灰度值,其范围通常为[0,255]。

例如,某个像素点的值为 216(明文),则可以使用 178(该数值由加密者自由选定)作为密钥对其进行加密,让这两个数的二进制值进行按位异或运算,即完成加密,得到一个密文 106。当需要解密时,将密文 106 与密钥 178 进行按位异或运算,即可得到原始像素点值 216(明文)。具体过程为:
bit_xor(216,178)=106
bit_xor(106,178)=216
以二进制形式表示的具体细节如下。

在这里插入图片描述
对图像内的每一个像素点重复上述操作,即可完成对图像的加密、解密操作。这里以一个原始图像 O 为例,具体说明图像的加密、解密过程。

1.加密过程

假设有需要加密的原始图像 O,其中的像素值为:

在这里插入图片描述
选定的加密密钥图像为 K,其中的像素值为:

在这里插入图片描述
图像 O 所对应的二进制表示 OB 为

在这里插入图片描述
密钥图像 K 所对应的二进制表示 KB 为:

在这里插入图片描述

将 OB 与 KB 进行按位异或运算,即得到图像 O 的加密图像 OSB:

在这里插入图片描述
OSB 转换为十进制形式 OS,如下:
在这里插入图片描述
至此,图像 O 的加密过程完成,得到原始图像 O 的加密图像 OS。

2.解密过程

解密过程需要将加密图像 OS 与密钥图像 K 进行按位异或运算,得到原图像 OR。
将加密图像 OS 的二进制形式 OSB 与密钥图像 K 的二进制形式 KB 进行按位异或运算,
即得到原始图像 OR 的二进制形式 ORB。按照上述运算,得到的 ORB 为:

在这里插入图片描述
ORB 转换为十进制形式,得到解密图像 OR,如下:
在这里插入图片描述
至此,图像的解密过程结束,得到加密图像 OS 的解密图像 OR。

从上述过程可以看到,解密过程所得到的解密图像 OR 与原始图像 O 是一致的。这说明上
述加密、解密过程是正确的。
上述说明过程中,为了方便理解和观察数据的运算,在进行按位运算时,我们都是将十进
制数转换为二进制数后,再进行位运算处理的。实际上,在使用 OpenCV 编写程序时,不需要
这样转换,OpenCV 中位运算函数的参数是十进制数,位运算函数会直接对十进制参数进行按位异或运算。

实验1 - 对图片加密解密:

import cv2
import numpy as np
lena=cv2.imread("lena.png",0)
r,c=lena.shape
#生成密钥,随机生成一个和lena大小一样的矩阵
key=np.random.randint(0,256,size=[r,c],dtype=np.uint8)
#对图片进行加密
encryption=cv2.bitwise_xor(lena,key)

#对图片进行解密
decryption=cv2.bitwise_xor(encryption,key)
cv2.imshow("lena",lena)
cv2.imshow("key",key)
cv2.imshow("encryption",encryption)
cv2.imshow("decryption",decryption)
cv2.waitKey()
cv2.destroyAllWindows()

运行效果:

在这里插入3图片描述

本例的各个图像关系如下。
 图像 lena 是明文(原始)图像,是需要加密的图像,从当前目录下读入。
 图像 key 是密钥图像,是加密和解密过程中所使用的密钥,该图像是由随机数生成的。
 图像 encryption 是加密图像,是明文图像 lena 和密钥图像 key 通过按位异或运算得到的。
 图像 decryption 是解密图像,是加密图像 encryption 和密钥图像 key 通过按位异或运算
得到的。
运行上述程序,结果如图所示,其中:
 图(a)是原始图像 lena。
 图(b)是密钥图像 key。
 图©是原始图像 lena(图(a))借助密钥 key(图(b))加密得到的加密图像 encryption。
 图(d)是对加密图像 encryption(图©)使用密钥图像 key(图(b))解密得到的解密图像
decryption。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/768670.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MFC第十八天 非模式对话框、对话框颜色管理、记事本项目(查找替换、文字和背景色、Goto(转到)功能的开发)

文章目录 非模式对话框非模式对话框的特点非模式对话框与QQ聊天窗口开发非模态对话框(Modeless Dialog)和模态对话框(Modal Dialog)区别 记事本开发CFindReplaceDialog类的成员查找替换(算法分析)使用RichEdit控件 开发Goto(转到)…

Django实现接口自动化平台(十三)接口模块Interfaces序列化器及视图【持续更新中】

相关文章: Django实现接口自动化平台(十二)自定义函数模块DebugTalks 序列化器及视图【持续更新中】_做测试的喵酱的博客-CSDN博客 本章是项目的一个分解,查看本章内容时,要结合整体项目代码来看: pytho…

3.13 Bootstrap 页面标题(Page Header)

文章目录 Bootstrap 页面标题(Page Header) Bootstrap 页面标题(Page Header) 页面标题(Page Header)是个不错的功能,它会在网页标题四周添加适当的间距。当一个网页中有多个标题且每个标题之间…

MotionBert论文解读及详细复现教程

MotionBert:统一视角学习人体运动表示 通过学习人体运动表征,论文原作者提出了处理以人为中心的视频任务的统一方法。使用双流时空transformer(DSTformer)网络实现运动编码器,能够全面、自适应地捕获骨骼关节之间的远…

数据结构——六大排序 (插入,选择,希尔,冒泡,堆,快速排序)

1. 插入排序 1.1基本思路 把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 我们熟知的斗地主就是一个插入排序 1.2 代码实现 我们这里将一个无序数组变成有序数组 插入排序时…

CVE-2017-15715

CVE-2017-15715 一、环境搭建二、漏洞原理三、漏洞复现 一、环境搭建 如下介绍kali搭建的教程 cd ~/vulhub/httpd/CVE-2017-15715 // 进入指定环境 docker-compose build // 进行环境编译 docker-compose up -d // 启动环境docker-compose ps使用这条命令查看当前正在…

放射显影多肽1778691-88-5,DOTA Methyltetrazine ,四甲基四嗪修饰大环配体

资料编辑|陕西新研博美生物科技有限公司小编MISSwu​ 中文名称:四甲基四嗪修饰大环配体 英文名称:FOLATE-NOTA, Methyltetrazine-DOTA 规格标准:1g、5g、10g CAS:1778691-88-5 分子式:C37H52N12O12 分子量…

学习opencv.js之基本使用方法(读取,显示,灰度化,边缘检测,特征值点检测)

opencv.js是什么 OpenCV.js 是 OpenCV(Open Source Computer Vision Library)的 JavaScript 版本。OpenCV 是一个广泛使用的计算机视觉和图像处理库,提供了一系列功能强大的算法和工具,用于处理图像、视频、特征提取、对象识别等…

php裁剪图片,并给图片加上水印

本次以裁剪四个图片为例,图片如下 代码如下 public function cutImg($imgUrl){try{// 读取原始图片$src_img imagecreatefromjpeg($imgUrl);// 获取原始图片的宽度和高度$src_width imagesx($src_img);$src_height imagesy($src_img);// 计算每个部分的宽度和高…

【C语言督学训练营 第十九天】关于C语言语法的一些补充

文章目录 1.条件运算符与逗号运算符2.自增自减运算符3.位运算4.switch do-while补充5.二维数组&二级指针6.总结 1.条件运算符与逗号运算符 条件运算符是C语言中唯一的一种三目运算符。三目运算符代表有三个操作数;双目运算符代表有两个操作数,如逻辑与运算符就是双目运算符…

传统工厂不再使用蓝牙LoRa而选择使用星斗1号之原因详解

物联网技术在不断发展的同时,化工企业对安全生产的重视也在逐渐增强。 在传统工厂进行安全管理数字化转型前,蓝牙Lora是其最为常用的化工人员定位技术,也曾广泛应用于工厂设备监控、数据传输、人员管理等。 然而,定位技术升级&a…

linux driver probe deferral 机制

1. 背景介绍 在偶然的一次实验中(具体是pinctrl实验),我发现有些平台的pincontroller驱动起得很晚,而pinctrl client驱动却起得很早,在设备驱动模型中probe之前又会进行管脚复用的相关设置,按照常理来讲,这就产生了某…

前端工程中的设计模式应用

本文旨在系统性介绍一下23种设计模式,给出通俗易懂的案例、结构图及代码示例,这也是我自身学习理解的过程。或许其中的几种设计模式写的并不是很清晰明了易懂,更详细的可根据提到的参考文献进行深入学习。 什么是设计模式 设计模式这个概念是…

Python 算法基础篇之字符串操作:索引、切片、常用方法

Python 算法基础篇之字符串操作:索引、切片、常用方法 引言 1. 字符串的概念和创建2. 字符串的索引3. 字符串的切片4. 字符串的常用方法 a ) 查找子字符串 b ) 替换子字符串 c ) 拆分和连接字符串 总结 引言 字符串是一种常见的数据类型,在 Python 中对…

又整新活,新版 IntelliJ IDEA 有点东西!

作为一个经常使用IntelliJ IDEA来写代码的老用户,每次对于JetBrains软件的更新都是非常关注的。 这不最近这段时间,JetBrains连发了多个软件的EAP版本: 同时JetBrains的官博中也宣布了一个重要的新特性,那就是: 在所…

X.509数字证书的基本原理

一、前言 数字证书是现代互联网中个体间相互信任的基石。 如果没有了数字证书,那么也就没有了各式各样的电商平台以及方便的电子支付服务。 数字证书是网络安全中的一个非常重要组成部分。如果要学好网络安全,那么必须充分理解它的原理。 目前我们所…

keepalived 实现双机热备

文章目录 一、说明二、概念解释三、环境准备四、操作过程五、验证 一、说明 我们经常听说 nginx keepalived 双机热备,其实在这里,双机热备只是利用 keepalived 实现两个节点的故障切换,当主节点挂了,备用节点顶上,保…

深入浅出关于网易邮箱开启smtp服务教程

各平台邮箱开启SMTP服务教程 一、QQ邮箱 (服务器地址:smtp.qq.com) 第一步:复制https://mail.qq.com/ 登录QQ邮箱后电击左上角设置,如图: 第二步:点击进入“帐户”页面 ,如图&…

CodeLocator简单使用(AndroidStudio中点击布局元素确认对应view信息)快速接手陌生项目利器

对于陌生项目的一些改动或重构需求时,如果可以在APP点点就能确定知道当前管理哪个activity或fragment必然是省去了很多去代码里搜来搜去的时间。在社群讨论中发现这款AS插件:CodeLocator ,虽然有2年没更新了 今天也试一试看看是否有帮助。 首先下载最新版本的插件&…