猫映射(Arnold变换),猫脸变换介绍与基于例题脚本的爆破

news/2025/1/8 18:56:55/文章来源:https://www.cnblogs.com/alexander17/p/18551089

前置信息
http://www.jiamisoft.com/blog/index.php/7249-erzhituxiangjiamisuanfaarnold.html
https://mp.weixin.qq.com/s/IbkAlyAPvbgMeNgqfwisTg
Arnold变换
Arnold变换是V.J.Arnold在遍历理论的研究中提出的一种变换,原意为catmapping,俗称猫脸变换。Arnold变换直观、简单、具有周期性,使用非常方便。Arnold变换的原理是先作x轴方向的错切变换,再作y轴方向的错切变换,最后的模运算相当于切割回填操作。
当对图像进行Arnold变换时,就是把图像的各个像素点位置按照下列公式进行移动,

从而得到一个相对原图像比较混乱的图像。对图像每进行一次Arnold变换,就相当于对该图像进行了一次置乱,一般来说这一过程需要反复进行多次才能达到令人满意的效果。利用Arnold变换对图像进行置乱后,使原本有意义的图像变成了像白噪声一样无意义的图像,从而实现了信息的初步隐藏。同时置乱次数可以作为水印系统的密钥,从而进一步增强系统的安全性和保密性。

Arnold变换也是具有周期性的。F.J.Dyson和H.Falk在分析离散Arnold变换的周期性时,给出了这样的结论:对于任意的N>2,Arnold变换的周期L≤N2/2。这是迄今为止最好的结果。计算Arnold周期的方法,对于给定的自然数N>2,下式的Arnold变换周期M是使得它成立的最小自然数n。

反变换查看原文,就不多赘述了

基于pillow库的加密实现

from PIL import Image
def arnold(infile: str, outfile: str = None, a: int = 1, b: int = 1, shuffle_times: int = 1, reverse: bool = False) -> None:    
"""    
Arnold猫脸变换函数Parameters:        
infile - 输入图像路径        
outfile - 输出图像路径        
a - Anrold 变换参数        
b - Anrold 变换参数        
shuffle_times - 置乱次数        
reverse - 逆变换    
"""    
inimg = Image.open(infile)    
width, height = inimg.size    
indata = inimg.load()    
outimg = Image.new(inimg.mode, inimg.size)    
outdata = outimg.load()for _ in range(shuffle_times):        for x in range(width):            for y in range(height):                if reverse:                   nx = ((a * b + 1) * x - a * y) % width                    ny = (y - b * x) % height                else:                    nx = (x + a * y) % width                    ny = (b * x + (a * b + 1) * y) % height                outdata[ny, nx] = indata[y, x]        outimg.save(outfile if outfile else "arnold_"+infile, inimg.format)
arnold("before.png", "encode.png", 9, 39, 1)
arnold("encode.png", "decode.png", 9, 39, 1, True)

2024鹏程杯

import numpy as np
import cv2def arnold_decode(image, arnold_times):a = 7b = 35# 创建新的解码图像,初始化为全0,数据类型为uint8decode_image = np.zeros(shape=image.shape, dtype=np.uint8)height, width = image.shape[0], image.shape[1]N = height  # N是正方形的边长for _ in range(arnold_times):  # 进行arnold_times次变换for old_x in range(height):for old_y in range(width):# 计算新的像素坐标new_x = ((a * b + 1) * old_x + (-a) * old_y) % Nnew_y = ((-b) * old_x + old_y) % Ndecode_image[new_x, new_y, :] = image[old_x, old_y, :]# 保存解码后的图像,确保图像保存成功try:cv2.imwrite('flag.png', decode_image, [int(cv2.IMWRITE_PNG_COMPRESSION), 0])  # 以PNG格式保存图像print("解码图像已保存为 flag.png")except Exception as e:print(f"保存图像时发生错误: {e}")return decode_imageif __name__ == '__main__':# 读取图像并确保图像加载成功image = cv2.imread('4.jpg')if image is not None:arnold_decode(image, 1)  # 此处arnold_times设置为1else:print("图像加载失败,请检查文件路径。")

2024源鲁杯CTFMisc

image = np.array(image)arnold_image = np.zeros(shape=image.shape, dtype=image.dtype)h, w = image.shape[0], image.shape[1]N = hfor _ in range(shuffle_times):for ori_x in range(h):for ori_y in range(w):new_x = (1*ori_x + b*ori_y)% Nnew_y = (a*ori_x + (a*b+1)*ori_y) % Nif mode == '1':arnold_image[new_x, new_y] = image[ori_x, ori_y]else:arnold_image[new_x, new_y, :] = image[ori_x, ori_y, :]return Image.fromarray(arnold_image)import numpy as np
from PIL import Imagedef arnold_decode(image, shuffle_times=10, a=1, b=1, mode='1'):image = np.array(image)decode_image = np.zeros(shape=image.shape, dtype=image.dtype)h, w = image.shape[0], image.shape[1]N = hfor _ 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)% Nnew_y = ((-a)*ori_x + ori_y) % Nif mode == '1':decode_image[new_x, new_y] = image[ori_x, ori_y]else:decode_image[new_x, new_y, :] = image[ori_x, ori_y, :]return Image.fromarray(decode_image)img = Image.open('flag.png')
decode_img = arnold_decode(img)
decode_img.save('flag-output.png')

2024源鲁杯CTFCrypto

import matplotlib.pyplot as plt
import cv2
import numpy as np
from PIL import Image
def de_arnold(img,shuffle_time,a,b):r, c, d = img.shapedp = np.zeros(img.shape, np.uint8)for s in range(shuffle_time):for i in range(r):for j in range(c):x = ((a * b + 1) * i - b * j) % ry = (-a * i + j) % cdp[x, y, :] = img[i, j, :]img = np.copy(dp)cv2.imwrite(f"flag.png",img)img_en = cv2.imread('en_flag.png')
de_arnold(img_en, 3,6, 9)

0xGame2024Misc

from PIL import Image
​
img = Image.open('mijiha.png')
if img.mode == "P":img = img.convert("RGB")
assert img.size[0] == img.size[1]
dim = width, height = img.size
​
st = 1
a = 35
b = 7
for _ in range(st):with Image.new(img.mode, dim) as canvas:for nx in range(img.size[0]):for ny in range(img.size[0]):y = (ny - nx * a) % widthx = (nx - y * b) % heightcanvas.putpixel((y, x), img.getpixel((ny, nx)))
canvas.show()
canvas.save('flag.png')

了解这些比赛例题解密代码后
如果只知道啊a,b不知道翻转次数
那我们只有一个办法,爆破。
这是基于理解修改的一个爆破脚本

import os
from PIL import Image
import numpy as npdef arnold_decode(image, shuffle_times, a=, b=, mode='1'):image = np.array(image)decode_image = np.zeros(shape=image.shape, dtype=image.dtype)h, w = image.shape[0], image.shape[1]N = hfor _ 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) % Nnew_y = ((-a)*ori_x + ori_y) % Nif mode == '1':decode_image[new_x, new_y] = image[ori_x, ori_y]else:decode_image[new_x, new_y, :] = image[ori_x, ori_y, :]return Image.fromarray(decode_image)# 创建存储解码图片的文件夹
output_folder = "decoded_images"
os.makedirs(output_folder, exist_ok=True)# 读取加密图片
img = Image.open('flag.png')#最大翻转次数
max_attempts = # 开始爆破
for shuffle_times in range(1, max_attempts + 1):decoded_img = arnold_decode(img, shuffle_times=shuffle_times)decoded_img.save(os.path.join(output_folder, f"decoded_{shuffle_times}.png"))print(f"所有尝试的解码图片已保存到文件夹: {output_folder}")
import os
import cv2
import numpy as npdef de_arnold(img, shuffle_time, a, b):r, c, d = img.shapedp = np.zeros(img.shape, np.uint8)for s in range(shuffle_time):for i in range(r):for j in range(c):x = ((a * b + 1) * i - b * j) % ry = (-a * i + j) % cdp[x, y, :] = img[i, j, :]img = np.copy(dp)return img# 参数设置
a, b = ?,  ? # Arnold变换的参数
max_attempts = ? # 爆破的最大尝试次数
output_dir = "decrypted_images"  # 输出文件夹
os.makedirs(output_dir, exist_ok=True)# 读取加密图片
img_en = cv2.imread('en_flag.png')
if img_en is None:raise FileNotFoundError("加密图片未找到,请检查路径和文件名是否正确。")# 开始爆破
for shuffle_time in range(1, max_attempts + 1):img_decrypted = de_arnold(img_en, shuffle_time, a, b)output_path = os.path.join(output_dir, f"flag_{shuffle_time}.png")cv2.imwrite(output_path, img_decrypted)print(f"解密图片已保存: {output_path}")print(f"爆破完成,共生成 {max_attempts} 张解密图片,保存在文件夹: {output_dir}")

这样我们就可以得到原图

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/836071.html

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

相关文章

伯索云学堂视频课件课程下载工具,如何在电脑端下载伯索云学堂视频课程课件资料PDF,PPT到本地?

一. 安装伯索云课程下载器 1.获取学无止下载器 https://www.xuewuzhi.cn/plaso_downloader 2.下载安装后,然后点击桌面快捷方式运行即可。 注意:杀毒软件可能会阻止外部exe文件运行,并将其当做成病毒,直接添加信任即可,本软件绝对没有木马病毒。 二. 使用说明 1.学无止下载…

一个自托管免费开源的人脸识别系统

大家好,今天给大家分享一个自托管免费开源的人脸识别系统CompreFace。CompreFace 是一个开源的人脸识别系统,由 Exadel 公司开发并维护。它提供了一个基于深度学习的解决方案,用于人脸检测、识别和验证。 CompreFace 的设计旨在简化人脸识别技术的使用,使得开发者无需深入理…

洛谷题单指南-二叉堆与树状数组-P3374 【模板】树状数组 1

原题链接:https://www.luogu.com.cn/problem/P3374 题意解读:树状数组模版:单点修改,区间求值。 解题思路: 树状数组-Binary Index Tree可以动态维护一组数,可以O(logn)的修改一个数,也可以O(logn)的计算一段区间的和。 思考一下朴素做法:如何修改一个数,计算区间和?…

11月16日,工信部人才交流中心 CUUG - PGCP / PGCM认证考试完成!

2024年11月16日,由工业和信息化部人才交流中心 与 北京神脑资讯技术有限公司共同举办的PostgreSQL管理员岗位能力认证考试(PGCP中级/PGCM高级)完成。 中级PG认证专家-PGCP(PostgreSQL Certified Professional):是对PostgreSQL数据库技术能力的一种认可,达到了专家级别,…

manim边做边学--球体

Sphere类用于创建三维球体对象,它提供了丰富的参数和方法来定制球体的外观和行为。 球体在制作三维动画时,具有广泛的应用场景。 比如:展示几何概念:通过创建不同大小、颜色和透明度的球体,可以直观地展示几何中的体积、表面积等概念 物理模拟:在模拟物理现象(如重力、碰…

闵可夫斯基和

闵可夫斯基和 前言 部分图片来自 https://www.luogu.com.cn/article/mhp0aeub。 定义 对于两个向量集合 \(A,B\),它们的闵可夫斯基和为 \(\{ a+b | a \in A, b \in B\}\)。 求解 在 OI 中,我们一般研究凸包的闵可夫斯基和。 如图是两个凸包的闵可夫斯基和。本文来自博客园,作…

UNIAPP设置消息推送(v1.0),自定义铃声功能

目前项目需要开发一个物联网APP进行设备绑定、警情查看、统计分析、设备操作、自定义报警铃声等相关功能 采用的uniapp进行开发,功能其实都很简单就是调用SDK进行设备关联、数据的增删改查,逻辑清晰明了,没想到问题出在了消息推送这块, 消息推送-因为是uniapp进行开发所以采…

仓储和运输如何协同?项目管理在物流行业的应用

物流运输是现代经济的核心,覆盖了供应链的多个环节,从订单接收到仓储管理,再到运输配送,每一步都关系到效率和成本。然而,物流行业的复杂性也带来了管理难题,例如多部门协作不畅、运输计划不可控、资源分配不合理等。面对这些挑战,项目管理工具正逐步成为提升物流运输效…

6、oracle网络(监听)

oracle包含 1、软件 2、数据库 3、实例 4、监听(listener) 监听的特点 可以独立启动,就是说,数据库没有启动,监听可以启动;数据库启动,监听也可以不启动;数据库启动,监听也启动 监听和数据库是独立分开的数据库的整个网络结构图解: 1、数据库有数据库的名字:dbname;…

inline-block元素下移问题的分析及解决

不知道大家有没有遇到过这种蛋疼的情况,当你排列了三个 display 属性为inline-block的 div 时。我们在其中一个div中输入文字,就会出现如下这种现象,设置文字 div 的布局变化了。问题定位 为什么会出现这种情况呢?我们打开控制台查看一下元素布局,如下图我们能看到第二个 …

NOIP 模拟赛:2024-11-16

全体栽在 T1 ? T1:二分一下内存大小然后模拟判断。关键点在于意识到 "解码" 和 "播放" 这两种事件是分开的。用一个 while 循环,每次循环从 "完成某帧的解码"、"开始某帧的解码"、"播放某帧"、"删除某帧" 之间…

什么是员工绩效管理系统?员工绩效管理系统怎么用?

我们都知道,面对大环境激烈的竞争,企业在运作工程中,员工绩效管理系统有着至关重要的地位。它与员工个人的职业发展和工作成果息息相关,更是企业实现战略目标、在激烈竞争中崭露头角的关键所在。 不少企业在实施绩效管理系统时遇到了不少麻烦,但是他们建立了完善的绩效管理…