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

 更新时间:2022年03月10日 09:03:45   作者:机器学习入坑者  
这篇文章主要介绍了利用python设计图像加密技术(Arnold算法),本文将借助Arnold置乱法,讲解如何用python从头至尾设计出一套图像加密算法,需要的小伙伴可以才参考一下

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

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图像加密内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • python opencv如何实现图片绘制

    python opencv如何实现图片绘制

    这篇文章主要介绍了python opencv如何实现图片绘制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-01-01
  • 用Python的Tornado框架结合memcached页面改善博客性能

    用Python的Tornado框架结合memcached页面改善博客性能

    这篇文章主要介绍了用Python的Tornado框架结合memcached页面改善vLog性能,主要使用到了缓存来提升性能,需要的朋友可以参考下
    2015-04-04
  • python脚本内运行linux命令的方法

    python脚本内运行linux命令的方法

    这篇文章主要介绍了python脚本内运行linux命令的方法,实例分析了Python基于subprocess模块操作Linux命令的相关技巧,需要的朋友可以参考下
    2015-07-07
  • 一文教会你调整Matplotlib子图的大小

    一文教会你调整Matplotlib子图的大小

    Matplotlib的可以把很多张图画到一个显示界面,这就设计到面板切分成一个一个子图,下面这篇文章主要给大家介绍了关于调整Matplotlib子图大小的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-06-06
  • 使用pygame模块编写贪吃蛇的实例讲解

    使用pygame模块编写贪吃蛇的实例讲解

    下面小编就为大家分享一篇使用pygame模块编写贪吃蛇的实例讲解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-02-02
  • 深度学习TextLSTM的tensorflow1.14实现示例

    深度学习TextLSTM的tensorflow1.14实现示例

    这篇文章主要为大家介绍了深度学习TextLSTM的tensorflow1.14实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • 总结用Pdb库调试Python的方式及常用的命令

    总结用Pdb库调试Python的方式及常用的命令

    大家都知道Python是自带Pdb库,使用Pdb调试Python程序还是很方便的。但是远程调试、多线程,Pdb是搞不定的,下面一起来看看用Pdb库调试Python的方式及常用的命令。
    2016-08-08
  • Python中re模块常用方法总结分析

    Python中re模块常用方法总结分析

    这篇文章主要为大家介绍了Python中re模块常用方法,并对这些常用方法进行总结分析,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • 通过Python把学姐照片做成拼图游戏

    通过Python把学姐照片做成拼图游戏

    马上就到毕业季了,你心中的那个学姐,你真的放下了吗?本文将用pygame为你的学姐,定制开发一个拼图游戏,感兴趣的快跟随小编一起学习一下
    2022-02-02
  • TensorFlow实现卷积神经网络

    TensorFlow实现卷积神经网络

    这篇文章主要为大家详细介绍了TensorFlow实现卷积神经网络,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05

最新评论