利用python设计图像加密技术(Arnold算法)
作者:机器学习入坑者 发布时间:2021-09-19 11:24:18
下面展示了图像的加密和解密过程(左边是输入图像,中间是加密后的结果,右边是解密后的图像):
1、加密算法要求
(1)加密算法必须是可逆的,拥有配套的解密算法
(2)必须是安全的,拦截者不能轻易的破解加密方式
(3)不能造成数据量剧增,比如一个1kb的图像加密后变为100kb
2、Arnold置乱原理
Arnold
置乱又称为猫脸置乱,据说是因为Arnold首先对猫脸图像应用了这个算法。置乱的含义是置换和打乱,也就是将原始的图片按照我们设计的规则,进行顺序打乱的操作。
所谓的打乱次序指的是对图像进行“坐标变换”,只不过这种变换不是随意的变换,变换需要具有两个硬性要求:
(1)变换就是加密,那么必须存在对应的逆变换(解密)
(2)变换能保证图像的像素被彻底打乱,观察者看不出加密后图像包含的信息
为此,Arnold发明了下面的变换方式:
其中x和y表示坐标,new
表示变换以后的坐标,ori表示原始的坐标(original缩写),a和b是两个可选的参数,mod为求余数操作,N是图像的长或者宽,这里只考虑长度和宽度相等的图像,上式表示的就是“图像的坐标变换”。
有了加密变换,还需要使用对应的解密变换,也就是逆变换。逆变换就是“求矩阵的逆”,对2x2的矩阵求逆就能得到下面的逆变换矩阵:
根据加密变换和解密变换,就能设计图像加密算法和解密算法了!
实际上,上面的加密和解密也都是常规的矩阵变换,一点都不难!
3、python实现
根据上一节的加密变换公式可知,有几个参数是必须考虑的,比如:打乱的次数,a和b的取值(我觉得这两个值是随便取的,取不同值加密结果不同),N是图像的长度或者宽度所以不需要指定。
加密函数如下:
def arnold_encode(image, shuffle_times, a, b):
""" Arnold shuffle for rgb image
Args:
image: input original rgb image
shuffle_times: how many times to shuffle
Returns:
Arnold encode image
"""
# 1:创建新图像
arnold_image = np.zeros(shape=image.shape)
# 2:计算N
h, w = image.shape[0], image.shape[1]
N = h # 或N=w
# 3:遍历像素坐标变换
for time in range(shuffle_times):
for ori_x in range(h):
for ori_y in range(w):
# 按照公式坐标变换
new_x = (1*ori_x + b*ori_y)% N
new_y = (a*ori_x + (a*b+1)*ori_y) % N
arnold_image[new_x, new_y, :] = image[ori_x, ori_y, :]
return arnold_image
调用加密函数以后可以得到如下的加密结果:
现在,谁还能看出来加密后的图像(左边是原始图,右边是加密后的图)表达什么?
除非你有下面的解密代码:
def arnold_decode(image, shuffle_times, a, b):
""" decode for rgb image that encoded by Arnold
Args:
image: rgb image encoded by Arnold
shuffle_times: how many times to shuffle
Returns:
decode image
"""
# 1:创建新图像
decode_image = np.zeros(shape=image.shape)
# 2:计算N
h, w = image.shape[0], image.shape[1]
N = h # 或N=w
# 3:遍历像素坐标变换
for time in range(shuffle_times):
for ori_x in range(h):
for ori_y in range(w):
# 按照公式坐标变换
new_x = ((a*b+1)*ori_x + (-b)* ori_y)% N
new_y = ((-a)*ori_x + ori_y) % N
decode_image[new_x, new_y, :] = image[ori_x, ori_y, :]
return decode_image
调用解密代码,就能恢复最右边的“decode”了:
4、结果分析与总结
自己还尝试了不同的a和b的值获得的不同加密效果:
男神镇楼!
(1)a = 1, b = 1:
(2)a=1,b=3:
(3)a=1,b=7:
(4) a=7, b=1:
可以看出:a和b作为控制加密的参数,不同的选择方式可以获得不同的加密效果。
来源:https://zhuanlan.zhihu.com/p/90483213


猜你喜欢
- 本文实例讲述了python获取指定目录下所有文件名列表的方法。分享给大家供大家参考。具体实现方法如下:这里python代码实现获取文件名列表
- 一、Tesseract文字识别是ORC的一部分内容,ORC的意思是光学字符识别,通俗讲就是文字识别。Tesseract是一个用于文字识别的工
- 版权所有:Copyright 1997 Netscape Communications Corporation原文链接:Object Hie
- 到目前为止,我们连接的都是两张不同的表,那么能不能对一张表进行自我连接呢?答案是肯定的。有没有必要对一张表进行自我连接呢?答案也是肯定的。
- 导语前段时间不是制作了一款升级版本五子棋的嘛!但是居然有粉丝私信我说:“准备拿到代码玩一下ok过去了!太难了准备放收藏夹落灰q@q~”所噶,
- 在一测试服务器(CentOS Linux release 7.2.1511)上安装MySQL 5.6(5.6.19 MySQL Commun
- swiper的组件<template> <div class="swiper-container&q
- ASP通过XMLDom在服务器端操作XML文件的主要方法和实现对于小数据量,xml文件在检索更新上于ACCESS有很多优势。我曾经测试过不用
- 已经11月了,不知道还有没有人看华强买瓜。。。要把华强卖瓜做成字符视频,总共分为三步读取视频把每一帧转为字符画把字符画表现出来 读
- 本文实例讲述了Python基于socket模块实现UDP通信功能。分享给大家供大家参考,具体如下:一 代码1、接收端import socke
- 前言Logistic回归涉及到高等数学,线性代数,概率论,优化问题。本文尽量以最简单易懂的叙述方式,以少讲公式原理,多讲形象化案例为原则,给
- 使用SQL SERVER的[导入]功能,便可将access数据转换,但要注意原来的'自增字段'需要修改,将相应字段标识修改为
- 如图所示,要处理的数据是一个json数组,而且非常大下图为电脑配置,使用 json.load() 方法加载上述json文件电脑直接卡死解决思
- 引入:通常,钓鱼网站本质是本质搭建一个跟正常网站一模一样的页面,用户在该页面上完成转账功能转账的请求确实是朝着正常网站的服务端提交,唯一不同
- 目录jwt流程:1.token 工具类2. 使用该中间件3. controller部分代码jwtjwt的原理和session有点相像,其目的
- 本文为大家分享了python银行管理系统的具体代码,供大家参考,具体内容如下自己写的练手小程序,练习面向对象的概念,代码中都有注释,刚学的同
- 本文实例讲述了PHP实现的AES双向加密解密功能。分享给大家供大家参考,具体如下:<?php/* * Created on 2018-
- 需求有多个文件地理数据库(gdb),数据库内有多个面要素类图层,每个图层不能有自重叠,也不能和其他图层重叠。所以,需要为每个文件地理数据库(
- 在Python中,当我们有两个字典需要合并的时候,可以使用字典的 update 方法,例如:a = {'a': 1,
- # _*_ coding:utf-8 _*_# name start_qq.pyimport osos.startfile("C: