opencv-14 图像加密和解密

在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.mzph.cn/news/2219.shtml

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

相关文章

实例019 以图形按钮显示的界面

实例说明 菜单和工具栏虽然能方便用户操作程序的相应功能,但各有缺点。如果采用按钮式功能菜单,不但美观大方,而且操作灵活。当单击按钮时,用户区将显示相应的操作按钮组。下面介绍图形界面式菜单的设计方法。运行本例&#xff0…

【贪心算法Part03】| 1005.K次取反后最大化的数组和、134.加油站、135.分发糖果

目录 🎈LeetCode1005.K次取反后最大化的数组和 🎈LeetCode134.加油站 🎈LeetCode135.分发糖果 🎈LeetCode1005.K次取反后最大化的数组和 链接:1005.K次取反后最大化的数组和 给你一个整数数组 nums 和一个整数 k…

学习背景和学习规划

为什么要学习大数据相关的技术? 随着工作年限的增加,JAVA已经陪伴我五年有余了,这些年的工作中我能够明显感觉到一些web开发领域的变化。刚开始工作时公司做的项目大多是一些功能单一、用户量极少的web应用,这种项目对技术和性能的…

分享一个唯美雪花界面

先看效果&#xff1a; 再看代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>雪</title><meta name"viewport" content"widthdevice-width, initial-scale1&…

TKDE论文,跑的改的,GPSCVULDETECTOR

Combining Graph Neural Networks With Expert Knowledge for Smart Contract Vulnerability Detection 论文代码GitHub https://github.com/Messi-Q/GPSCVulDetectorpaper https://ieeexplore.ieee.org/abstract/document/9477066/参考IJCAI 21中AME的数据集 https://gith…

中国地图使用心得

中国地图使用心得 注册地图是注册在echarts对象上而非 自己构建的echarts dom上、。 请求本地json文件 ​ vue项目的public打包时不会动&#xff0c;所以线上和本地地址直接指向了public同级目录&#xff0c;请求时直接相对路径 绘制中国地图时&#xff0c;如何在各个省会地方…

旅游卡系统加盟代理软件开发

旅游行业的不断发展&#xff0c;越来越多的旅行社开始推出各种优惠卡来吸引游客。而随着智能手机的普及&#xff0c;开发一款旅行社优惠卡APP软件成为了一种必然的趋势。 该软件的主要功能是提供旅行社的各种优惠卡信息&#xff0c;包括优惠卡的种类、价格、使用范围、有效…

img标签的onerror事件

img标签中的src图片加载失败&#xff0c;原来的图片位置会出现一个碎片图标&#xff0c;用户体验会下降。 通过百度&#xff0c;可以给img标签加背景图片&#xff0c;代码如下&#xff1a; .headLogo img{display: block;width: 270px;height: 60px;background: url(../image…

无极低代码,免费工具在线实用工具分享

在当今数字化的时代&#xff0c;我们需要尽可能地减少手动操作&#xff0c;提高工作效率。这就是为什么我们需要一些在线工具来帮助我们完成一些繁琐的任务。以下是一些无极低代码网集成的在线工具&#xff0c;可以帮助您更快、更轻松地完成任务。 项目管理 项目周期计算&…

docker+mongodb设置数据库的账号和密码

1、在docker宿主机构建mongodb数据持久化目录 # 数据文件 mkdir -p /usr/local/mongodb/data# 日志文件 mkdir -p /usr/local/mongodb/log2、拉取镜像, 选择官方版本&#xff08;亲测16.x版本的mongodb不可用&#xff0c;可安装指定版本&#xff09; docker search mongo do…

ARP解析MAC地址的全过程(ARP的工作机制)

目录 ARP解析MAC地址的过程&#xff1a; 源码等资料获取方法 以太网环境下&#xff0c;同一个网段的主机之间需要互相知道对方的MAC地址&#xff0c;才能访问。 TCP/IP协议栈从上层到下层的封装过程中&#xff0c;第三层封装需要知道目的IP&#xff0c;第二层封装需要知道目…

Java 设计模式——迭代器模式

目录 1.概述2.结构3.案例实现3.1.抽象迭代器3.2.具体迭代器3.3.抽象聚合3.4.具体聚合3.5.测试 4.优缺点5.使用场景6.JDK 源码解析——Iterator 1.概述 迭代器模式 (Iterator Pattern) 是一种行为型设计模式&#xff0c;它提供一种顺序访问聚合对象&#xff08;如列表、集合等&…

使用亚马逊(AWS)云服务在S3上实现图片缩放功能(CloudFront/S3[AccessPoint/LambdaAccessPoint])

亚马逊云服务中的S3对象存储功能和国内阿里云的oss对象存储使用基本一致。但是涉及到存储内容处理时&#xff0c;两家有些差别。 比如&#xff1a;对于云存储中的图片资源&#xff0c;阿里云比较人性化对于基本的缩放裁剪功能已经帮我们封装好了&#xff0c;只需要在url地址后…

python正则+多线程(代理)+线程池+协程

正则表达式 常用元字符 . 匹配除换行符以外的任意字符 \w 匹配字幕或数字或下划线 \s 匹配任意空白字符 \d 匹配数字 \n 匹配一个换行符 \t 匹配一个制表符 ^ 匹配字符串的开始 # 开发常用 $ 匹配字符串的结尾\W 匹配非字母或数字或下划线 \D 匹配非数字 \S 匹配非空白符 a|b …

【Express.js】全局变量与配置文件

全局变量与配置文件 通常我们会将一些项目的配置信息写在一个文件内&#xff0c;然后读入内存并使用。在 express 中使用全局变量有多种方案&#xff0c;我们一起看看有哪些常用的方案 准备工作 拷贝第一节的HelloWorld项目 准备一个Resp.js模块&#xff1a; module.expor…

Mongodb 对嵌套文档数组进行查询操作

查询非嵌套文档数组 非嵌套文档的数组&#xff0c;数组由数字、字符串等元素组成。 以下方法对数组字段进行查询操作的示例&#xff0c;包括对数组匹配查询&#xff0c;元素的增、删、改操作&#xff0c;空数组、非空数组查询等。 测试数据 连接到 mongodb 数据库&#xff0…

Bean 作用域与生命周期

Bean 作用域与生命周期 ​ 对于 Spring 来说&#xff0c;核心操作对象就是存和取 Bean &#xff0c;接下来就 Bean 的作用域与生命周期进行探讨。 文章目录 Bean 作用域与生命周期一、作用域的定义1.1、Bean 的6种作用域1.2、Bean作用域设置方法 二、Bean 的生命周期2.1、Bean…

postgresql还原bak

1、第一步肯定是要新建自己还原的目标数据库&#xff0c;例如&#xff1a; 2、进入postgresql的安装目录下的bin目录下 然后地址栏输入cmd进入命令 输入以下 psql -h localhost -U postgres -p 5432 -d SamsinoYardStandard_karamay -f "D:\desktop\zk\20230628.bak&quo…

verilog实现数码管静态显示

文章目录 verilog实现数码管静态显示一、任务要求二、实验代码三、仿真代码四、仿真结果五、总结 verilog实现数码管静态显示 一、任务要求 六个数码管同时间隔0.5s显示0-f。要求&#xff1a;使用一个顶层模块&#xff0c;调用计时器模块和数码管静态显示模块。 二、实验代码…

将Spring Boot项目打包部署到阿里云linux服务器

首先 你要保证自己的服务器上有java环境 如果没有可以参考我的文章 linux服务器中安装java JDK1.8版本 然后 我们打开我们的Spring Boot项目 双击 package 生命周期进行打包 打包完成之后 我们找到 target 下面会有一个jar包 然后 我们右键它 如下图操作 系统就会帮你打开它所…