Arnold置乱变换的代码实现与置乱度分析

2023-11-13

1. 传统Arnold置乱变换算法简介

Arnold置乱变换(又称为cat映射)是一种基于古典密码体制的图像加密算法,本质上是对长宽相等的图像进行拉伸与折叠操作以改变空间中像素点的位置,从而破坏图像相邻像素点之间的相关性,它的安全性较低,易利用像素值统计特性攻击,常用作其它加密算法的预处理。

传统的Arnold置乱变换可表示为:
[ x n + 1 y n + 1 ] = [ 1 1 1 2 ] [ x n y n ] m o d ( N ) \begin{bmatrix} x_{n+1} \\ y_{n+1} \end{bmatrix}= \begin{bmatrix} 1&1\\ 1&2 \end{bmatrix} \begin{bmatrix} x_n \\ y_n \end{bmatrix} mod(N) [xn+1yn+1]=[1112][xnyn]mod(N)

图像的恢复可表示为:
[ x n y n ] = [ 1 1 1 2 ] − 1 [ x n + 1 y n + 1 ] m o d ( N ) \begin{bmatrix} x_n \\ y_n \end{bmatrix}= \begin{bmatrix} 1&1\\ 1&2 \end{bmatrix}^{-1} \begin{bmatrix} x_{n+1} \\ y_{n+1} \end{bmatrix} mod(N) [xnyn]=[1112]1[xn+1yn+1]mod(N)

2. 传统Arnold置乱变换的代码实现与置乱度分析

2.1 编程环境

  • 编程语言:Python
  • 包:cv2, matplotlib, numpy, math, time

2.2 代码实现

2.2.1 传统Arnold置乱变换

"""
function: 对图像进行r轮Arnold置乱变换,并录入每一轮变换后的图像数据信息
params: 
    img: 输入的图片
    r: 置乱轮数
    length: 图像尺寸信息
return:
    data: 置乱变换后的图像数据信息(snr/time)
"""
def arnold(img, r, length):
    cnt = 0

    ori_img = np.copy(img)
    new_img = np.copy(img)

    snr = {}
    snr[0] = 100.0
    t = {}
    t[0] = 0
    data = {}

    start = time.time()
    while cnt <= r:
        for i in range(img.shape[0]):
            for j in range(img.shape[1]):
                new_i = (i + j) % length
                new_j = (i + 2 * j) % length
                new_img[new_i][new_j] = img[i][j] 
  		# 第cnt轮置乱变换的时间信息
        end = time.time()
        t[cnt] = end - start

        cnt = cnt + 1
		# 第cnt轮置乱变换的SNR值计算
        signal = np.sum(new_img) ** 2
        # print(signal)
        noise = (ori_img - new_img) ** 2
        noise = np.sum(noise)
        if noise != 0:
            snr[cnt] = 10 * math.log10(signal * 1.0 / noise)
        else:
            snr[cnt] = 100.0
        # print(snr[cnt])
        # cv2.imshow("image", new_img)
        # cv2.waitKey(50)
        print(cnt)

        img = np.copy(new_img)
    #置乱变换的相关信息录入
    data[0] = snr
    data[1] = t
    return data

2.2.2 传统Arnold置乱变换的置乱度分析

  • 基于距离
    设置乱前像素点坐标为 ( x n , y n ) (x_n, y_n) (xn,yn),置乱后像素点坐标为 ( x n + 1 , y n + 1 ) (x_{n+1}, y_{n+1}) (xn+1,yn+1),则:

    像素点移动的距离为:
    d e l t a ( x , y ) = ( x n + 1 − x n ) 2 + ( y n + 1 − y n ) 2 delta(x,y)=\sqrt{(x_{n+1}-x_n)^2+(y_{n+1}-y_n)^2} delta(x,y)=(xn+1xn)2+(yn+1yn)2

    全体像素点移动距离的期望为:
    E = 1 M ∗ N ∑ x = 1 M ∑ y = 1 N d e l t a ( x , y ) E=\frac 1 {M*N}\sum_{x=1}^M\sum_{y=1}^Ndelta(x,y) E=MN1x=1My=1Ndelta(x,y)

    """
    function: 计算基于距离的置乱度
    params: 
        r: 置乱轮数
        length: 图像尺寸信息
    return:
        delta: 0~r次Arnold置乱变换后的置乱度
    """
    def calc_scrambling(r, length):
        cnt = 0
        delta = {}
        delta[0] = 0
        pos = np.ones((length, length))
        pos = init(pos, length)
        pos_r = np.copy(pos)
    
        while cnt <= r:
            s = 0.0
            # Arnold置乱变换
            for i in range(0, length):
                for j in range(0, length):
                    new_i = (i + j) % length
                    new_j = (i + 2 * j) % length
                    pos_r[new_i][new_j] = pos[i][j]
    
            cnt = cnt + 1
            # print(cnt)
            # 置乱度计算
            for i in range(1, length + 1):
                x = math.ceil(i / length * 1.0)
                y = i - length * math.floor(i / length * 1.0) - 1
    
                seq = np.where(pos == i)[0][0]
                xx = math.ceil(seq / length * 1.0)
                yy = seq - length * math.floor(seq / length * 1.0) - 1
    
                s += math.sqrt((x-xx) ** 2 + (y - yy) ** 2)
    		# 置乱度信息录入
            delta[cnt] = s / (length * length)
            # print(delta)
            pos = np.copy(pos_r)
            
        return delta
    
    """
    function: 初始化矩阵
    params: 
        matrix: 输入矩阵
        length: 矩阵尺寸
    return:
        matrix: 初始化后的矩阵
    """
    def init(matrix, length):
        n = 1
        for i in range(0, length):
            for j in range(0, length):
                matrix[i][j] = n
                n = n + 1
    
        return matrix
    
    """
    function: 绘制基于距离的置乱度折线图
    params: 
        d: 0~r次Arnold置乱变换后的置乱度
    """
    def paint_curve(d):
        plt.title("Scrambling")
        plt.ylabel("Average scrambling")
        plt.xlabel("Round")
        plt.grid(True)
        keys = d.keys()
        values = d.values()
        plt.plot(tuple(keys), tuple(values))
        plt.savefig("scrambling.png")
        plt.show()
    
  • 基于均方信噪比
    信噪比(SNR)表示的是信号与噪声之比,若设原始图像为I,经Arnold置乱后的图像为I’,则均方信噪比可表示为:
    S N R = ∑ x = 1 M ∑ y = 1 N I ′ 2 ( x , y ) ∑ x = 1 M ∑ y = 1 N ( I ( x , y ) − I ′ ( x , y ) ) 2 SNR=\cfrac {\sum_{x=1}^M\sum_{y=1}^NI'^2(x,y)}{\sum_{x=1}^M\sum_{y=1}^N(I(x,y)-I'(x,y))^2} SNR=x=1My=1N(I(x,y)I(x,y))2x=1My=1NI2(x,y)

    """
    function: 绘制图像信噪比折线图
    params: 
        snr: 0~r次Arnold置乱变换后的信噪比
    """
    def curve2(snr):
        plt.title("SNR")
        plt.ylabel("SNR/dB")
        plt.xlabel("Round")
        plt.grid(True)
        keys = snr.keys()
        values = snr.values()
        plt.plot(tuple(keys), tuple(values))
        plt.savefig("SNR.png")
        plt.show()
    

3. 参考文献

  • 方毅,Arnold置乱变换图像加密算法研究[学位论文],2018
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arnold置乱变换的代码实现与置乱度分析 的相关文章

随机推荐

  • 【Linux】文件权限

    权限分为 r 读 w 写 x 执行 文件可以属于某个人也可以属于某个群体 由此可划分出三种 文件所有者 所属用户组 其他人 其他人指的是 既不是文件所有者且也不所属用户组中的用户 liuquan localhost ls l 总用量 0 r
  • CH8-HarmonyOS流转架构解析

    文章目录 前言 目标 核心概念 流转架构特性 Ability的调度 流转应用场景 流转架构 核心模块 跨端迁移关键流程 多端协同关键流程 分布式任务调度 连接远程PA 启动远程FA PA 迁移FA 接口IAbilityContinuatio
  • Android强大的图表开源——MPAndroidChart

    介绍 在APP开发中遇到图表的样式 一般我们要先查询GitHub上比较火的开源框架 这种图标应用广泛 统计 游戏统计 人际关系图等等 用到今天的这个框架MPAndroidChart 点击查看GitHub 一个可以拖动缩放的图表库 包含曲线图
  • 求整数的位数及各位数字之和 (15 分)

    7 5 求整数的位数及各位数字之和 15 分 对于给定的正整数N 求它的位数及其各位数字之和 输入格式 输入在一行中给出一个不超过10 9 的正整数N 输出格式 在一行中输出N的位数及其各位数字之和 中间用一个空格隔开 输入样例 321 输
  • 【Docker】Docker API的使用

    1 通过实训平台进入到操作系统界面 在 后输入vi usr lib systemd system docker service命令 进入编译模式 然后按i 小写 键 修改代码 usr bin dockerd current H tcp 0
  • 创建一维数组,长度为20,元素索引值为索引的二倍,奇数为负偶数为正,然后对数组排序

    import java util Arrays public class ArrayCreate public static void main String args int a new int 20 for int i 0 i lt 2
  • 单屏播放asf和vga文件的教学视频

    在自己的电脑上播放三分屏教学视频时 总觉得左边那两个小屏幕太占位置 还有右上方的小屏幕的播放进度条太短而无法精确拖放 虽然不是很懂HTML 但修改一下代码 还是单屏能播放的 下面是单屏播放asf和vga文件的设置 1 文件夹结构 index
  • CSS 实现七彩圆环loading动画

    前言 CSS 实现七彩圆环loading动画 速速来Get吧 1 实现效果 2 实现步骤 定义父容器宽度为 w 每个圆环之间的gap间距为 gap 圆环的border边框宽为 border root border 5px gap 30px
  • Java小练习——图书管理系统

    目录 一 图书管理系统应具备的功能 二 简单分析如何实现该系统 三 框架图 四 代码实现过程及简析 1 Book类 简析 2 BookShelf类 简析 3 IOperation接口 3 1 AddOperation类 3 2 Borrow
  • 离散事件模型

    离散事件模型通常需要用到队列和线性表 典型的例子是银行业务的模拟 本文参考的是严蔚敏的 数据结构 过程如下 用四个队列表示银行的四个窗口 用一个有序链表存储到达事件和离开事件 在初始化函数里面先初始化四个队列和一个链表 并且产生一个到达事件
  • 解决Eclipse添加新server时无法选择Tomcat7.0

    解决Eclipse添加新server时无法选择Tomcat7 0 新添加tomcat时 出现如下图情况 解决方法 这时打开工作空间目录下的 metadata plugins org eclipse core runtime settings
  • 面试题13. 机器人的运动范围(java+python)

    地上有一个m行n列的方格 从坐标 0 0 到坐标 m 1 n 1 一个机器人从坐标 0 0 的格子开始移动 它每次可以向左 右 上 下移动一格 不能移动到方格外 也不能进入行坐标和列坐标的数位之和大于k的格子 例如 当k为18时 机器人能够
  • 高级快速读入

    namespace fastIO define BUF SIZE 100000 fread gt read bool IOerror 0 inline char nc static char buf BUF SIZE p1 buf BUF
  • 考勤系统需求分析(软件工程)

    前言 随着企业人事管理的日趋复杂和企业人员的增多 企业的考勤管理变得越来越复杂 有一个比较完善的考勤管理系统显得是如此的重要 考勤管理系统是使用计算机管理方式代替以前手工处理的工作 应用计算机技术和通信技术建立一个高效率的 无差错的考勤管理
  • javascript 算法_JavaScript中的算法

    javascript 算法 The word Algorithms or Algo would impact fear in anyone who isn t really strong in maths like me Well toda
  • 2023年无人航空系统与航空航天国际会议(ICUASA 2023)

    2023年无人航空系统与航空航天国际会议 ICUASA 2023 重要信息 会议网址 www icuasa org 会议时间 2023年2月18 20日 召开地点 中国广州 截稿时间 2023年12月30日 录用通知 投稿后2周内 收录检索
  • 事物有哪些特性 ?MySQL 如何保证事物的四大特性 ?

    目录 1 事物有哪些特性 2 MySQL 如何保证事物的四大特性 3 事物的隔离级别 1 事物有哪些特性 1 1 何为事物 事物就是把一件事情的多个步骤 多个操作 打包成一个步骤 一个操作 其中任意一个步骤执行失败 都会进行回退 使影响降到
  • Linux df -h 显示磁盘空间满,但实际未占用满——问题分析

    问题现象 工作中遇到一个问题 在 TX2 系统上 告警提示磁盘空间不够 如图所示 wohu wohu df h Filesystem Size Used Avail Use Mounted on dev root 28G 28G 0 100
  • 关于个人vs调试时“字符串中字符无效“的处理办法

    一开始选中要监视的字符串那一行开始调试时出现字符串中字符无效 后来瞎猫碰到死耗子 选中被监视的下一行时竟然就可以了 希望对大家有帮助 不过原理我不太懂我也是个小白 希望评论区有大佬给我提点提点背后的原理是啥
  • Arnold置乱变换的代码实现与置乱度分析

    1 传统Arnold置乱变换算法简介 Arnold置乱变换 又称为cat映射 是一种基于古典密码体制的图像加密算法 本质上是对长宽相等的图像进行拉伸与折叠操作以改变空间中像素点的位置 从而破坏图像相邻像素点之间的相关性 它的安全性较低 易利