利用python设计图像加密技术(Arnold算法)

目录
  • 1、加密算法要求
  • 2、Arnold置乱原理
  • 3、python实现
  • 4、结果分析与总结

下面展示了图像的加密和解密过程(左边是输入图像,中间是加密后的结果,右边是解密后的图像):

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作为控制加密的参数,不同的选择方式可以获得不同的加密效果。

到此这篇关于利用python设计图像加密技术(Arnold算法)的文章就介绍到这了,更多相关python图像加密内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python中hash加密简介及使用方法

    目录 简介 概念 特点 hash有哪些 算法碰撞 加盐防碰撞 加密 hashlib 主要方法 特有方法 使用方法 加盐 crypt 使用说明 应用 密码加密 应用一致性校验 简介 概念 散列算法(Hash Algorithm),又称哈希算法,杂凑算法,是一种从任意文件中创造小的数字「指纹」的方法.与指纹一样,散列算法就是一种以较短的信息来保证文件唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到逆向规律.因此,当原有文件发生改变时,其标志值也会发生改变,从而告诉文件使用者当前的文件已经

  • 如何通过Python3和ssl实现加密通信功能

    一.说明 1. python标准库ssl可实现加密通信 2. ssl库底层使用openssl,做了面向对像化改造和简化,但还是可以明显看出openssl的痕迹 3. 本文先给出python实现的socket通信,在此基础上再给出ssl通信以便读者更方便地看到socket和ssl在python编程中的区别 4. 说到ssl很多人都会想到https,但本质而言ssl是在传输层和应用层之间新插入的一个层,根据不同层无关原则ssl和https并没有任何绑定关系,ssl之上完全可以是其他任何应用层协议(比

  • 用Python制作一个文件加密器

    目录 前言 下载地址 效果预览 加密算法 总结 前言 因为一些懂得都懂的原因,我的父母对于我电脑上的文件内容特别感兴趣.为了防止信息泄露,我连夜用Python做了一个文件加密器,防止我的重要信息被泄露. 下载地址 github:https://github.com/13337356453/FileCipher GitHub上的资源是Python源代码 效果预览 为了方便操作,我用PyQt做了窗口.运行起来是这样的. 加密效果还是很不错了 加密算法 对于我来说,程序中gui的编写算比较简单.困难的

  • 利用20行Python 代码实现加密通信

    目录 一.引言 二.加密技术 三.普通锁:简单的对称加密 四.不可篡改的指纹:哈希函数 五.矛与盾:非对称加密 六.真言:数字签名 七.总结 一.引言 网络上充满了窃听,我们的信息很容易被不怀好意的人获得,给我们造成不好的影响.如果你需要在网络上传输机密或者敏感的隐私信息,为了防备别有用心的人窃听,可能需要加密.而使用在线或者手机上的加密软件,可能不良软件更是泄露信息的温床.所以作为程序员的我们,完全可以自己来实现一个加密系统. 本文用 20 行 Python 代码来演示加密.解密.签名.验证的

  • Python学习之加密模块使用详解

    目录 hashlib 模块 hashlib 模块的介绍 hashlib 模块中的常用加密方法 hashlib模块情景练习 base64 模块 base64 模块的介绍 base64 模块 模块中的常用方法 base64 模块的情景练习 hashlib 模块 hashlib 模块的介绍 hashlib 模块中拥有很多的加密算法,我们并不需要关心加密算法的实现方法.只需要调用我们需要的加密函数,就可以帮助我们对数据进行加密. 它的加密算法有很多,不仅如此,hashlib 中很多加密算法加密难度很大,

  • 用python的哈希函数对密码加密

    今天我将教大家如何用哈希函数将密码加密加密后的密码是很难倒推的~ 普通加密: 首先调用函数hashlib import hashlib 然后使用哈希函数对密码进行加密这里我使用sha256进行加密 再造一个密码出来 password = 'wotemo666' 接着用哈希函数对它进行加密 注意:这里要使用encode对password进行编码格式声明,不然会报错 hash_password = hashlib.sha256(password.encode("utf-8")).hexdi

  • 如何在Python中隐藏和加密密码示例详解

    目录 前言 maskpass() 安装: askpass(): advpass(): base64() 在输入时间内隐藏用户密码 总结 前言 有多种 Python 模块用于隐藏用户输入的密码,其中一个是**maskpass()模块.在 Python 中,借助maskpass()模块和base64()**模块,我们可以在输入时使用星号(*) 隐藏用户的密码,然后借助 base64() 模块可以对其进行加密. maskpass() maskpass() 是一个 Python 模块,可用于在输入期间隐

  • 利用python设计图像加密技术(Arnold算法)

    目录 1.加密算法要求 2.Arnold置乱原理 3.python实现 4.结果分析与总结 下面展示了图像的加密和解密过程(左边是输入图像,中间是加密后的结果,右边是解密后的图像): 1.加密算法要求 (1)加密算法必须是可逆的,拥有配套的解密算法 (2)必须是安全的,拦截者不能轻易的破解加密方式 (3)不能造成数据量剧增,比如一个1kb的图像加密后变为100kb 2.Arnold置乱原理 Arnold置乱又称为猫脸置乱,据说是因为Arnold首先对猫脸图像应用了这个算法.置乱的含义是置换和打乱

  • 利用Python实现RSA加密解密方法实例

    目录 前言 一.安装模块 二.生成密钥对 三.加密 四.解密 五.完整代码 总结 前言 加密技术在数据安全存储,数据传输中发挥着重要作用,能够保护用户隐私数据安全,防止信息窃取.RSA是一种非对称加密技术,在软件.网页中已得到广泛应用.本文将介绍RSA加密解密在python中的实现. 原则:公钥加密,私钥解密 解释:具体过程的解释请见代码前的注释 RSA加密实验基本流程: 一.选取两个大素数p.q,并计算得到n.phi_n 二.选取常用的e = 0x10001,方便将幂运算优化为左移,加快运算速

  • ​​​​​​​如何利用python破解zip加密文件

    目录 前言: 一.破解zip加密文件的思路 二.实例代码演示 0.zip的压缩方式 1.解压zip文件 2.实现密码字符的全排列 三.密码是几位未知,也可以破解密码 总结 前言: 日常工作中,会遇到一些加密的zip文件,但是因为某些原因或者时间过长,密码不知道了.但是zip文件中文件有很重要很必须.那么,我们试一试万能的Python,暴力破解密码. 一.破解zip加密文件的思路 准备一个加密的zip文件. zipfile模块可以解压zip文件. 解压时可以提供密码zfile.extractall

  • 利用Python进行图像的加法,图像混合(附代码)

    一.图像的加法 图像相加可以直接利用numpy模块进行相加,也可以采用opencv里面函数进行相加, 注意事项:相加的图像类型.大小必须相同 具体代码如下: # -*- coding: utf-8 -*- import cv2 import numpy as np img=cv2.imread('4.jfif') x = np.uint8([200]) y = np.uint8([10]) print cv2.add(x,y) # 200+10 = 210 print x+y # 210 二.图

  • 如何利用Opencv实现图像的加密解密

    目录 1.基础:基于异或操作实现图像加密解密 Opencv-python代码实现 效果展示: 2.进阶:基于混沌序列构成异或模板实现图像加密解密 结果展示: 总结 1.基础:基于异或操作实现图像加密解密 一般情况下,图像的加密和解密过程是通过按位异或运算实现的.将原始图像与密钥图像进行按位异或,可以实现加密,将加密后的图像与密钥图像再进行按位异或可以实现解密过程. Opencv-python代码实现 import cv2 import numpy as np demo = cv2.imread(

  • Python设计实现的计算器功能完整实例

    本文实例讲述了Python设计实现的计算器功能.分享给大家供大家参考,具体如下: 通过利用PYTHON 设计处理计算器的功能如: 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 ))- (-4*3)/(16-3*2)) 我的处理计算基本思路是: 解题思路是,需要优先处理内层括号运算--外层括号运算--先乘除后加减的原则: 1.正则处理用户输入的字符串,然后对其进行判断,判断计算公式是否有括号,有就先将计算公式进

  • MySQL数据库设计之利用Python操作Schema方法详解

    弓在箭要射出之前,低声对箭说道,"你的自由是我的".Schema如箭,弓似Python,选择Python,是Schema最大的自由.而自由应是一个能使自己变得更好的机会. Schema是什么? 不管我们做什么应用,只要和用户输入打交道,就有一个原则--永远不要相信用户的输入数据.意味着我们要对用户输入进行严格的验证,web开发时一般输入数据都以JSON形式发送到后端API,API要对输入数据做验证.一般我都是加很多判断,各种if,导致代码很丑陋,能不能有一种方式比较优雅的验证用户数据呢

  • python实现RSA加密(解密)算法

    RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密标准. 今天只有短的RSA钥匙才可能被强力方式解破.到2008年为止,世界上还没有任何可靠的攻击RSA算法的方式.只要其密钥的长度足够长,用RSA加密的信息实际上是不能被解破的.但在分布式计算和量子计算机理论日趋成熟的今天,RSA加密安全性受到了挑战. RSA算法基于一个十分简单的数论事实:将两个大素数相乘十分容易,但是想要对其乘积进行因式分解却极其困难,因此可以将乘积公开作为加密密钥.

  • Python基于pycrypto实现的AES加密和解密算法示例

    本文实例讲述了Python基于pycrypto实现的AES加密和解密算法.分享给大家供大家参考,具体如下: 一 代码 # -*- coding: UTF-8 -*- import string import random from Crypto.Cipher import AES def keyGenerater(length): '''''生成指定长度的秘钥''' if length not in (16, 24, 32): return None x = string.ascii_lette

随机推荐