是的,这不是一个严肃的加密方法,只是一时兴起想出来的一个点子,是我思考如何直播骗审核的时候出现的灵感
1.希尔伯特曲线及其特性
希尔伯特曲线(Hilbert Curve)是一种具有特殊几何性质的空间填充曲线,在数学、计算机科学和物理学等领域都有广泛的应用。它具有以下特点:
空间填充性质:希尔伯特曲线是一条连续的曲线,可以填充单位正方形或单位立方体中的所有点。它以一种递归的方式构造,通过将较低级别的曲线连接起来形成更高级别的曲线。
局部平滑性:希尔伯特曲线的局部性质非常好,即相邻点在曲线上也是相邻的。这使得它在空间索引和数据压缩等领域中非常有用。
紧凑性:希尔伯特曲线是一条紧凑的曲线,它在单位正方形或单位立方体中占据的长度或面积是有限的。这使得它可以用有限的曲线段来表示大型数据集或图像。
连续性:希尔伯特曲线是一条连续的曲线,没有任何间隙或重叠。这使得它在路径规划和运动规划等领域中有广泛的应用。
以下代码可以生成一个希尔伯特曲线:
import numpy as np from hilbert import decode import matplotlib.pyplot as plt def hilbert_curve_points(order): # 计算希尔伯特曲线的点数 num_points = 2 ** (order * 2) # 生成希尔伯特曲线上所有点的 Hilbert 编码 curve_points = np.arange(num_points) # 将 Hilbert 编码转换为坐标位置 coords = decode(curve_points, 2, order) # 将坐标位置转换为一系列坐标 curve_coords = [(x, y) for x, y in coords] return curve_coords # 定义希尔伯特曲线的阶数 order = 3 # 生成阶数为3的希尔伯特曲线上所有点的坐标 curve_points = hilbert_curve_points(order) # 提取 x 和 y 坐标 x_coords, y_coords = zip(*curve_points) # 绘制希尔伯特曲线 plt.plot(x_coords, y_coords, marker='o', linestyle='-') plt.title(f"Hilbert Curve of Order {order}") plt.xlabel("X") plt.ylabel("Y") plt.grid(True) plt.show()
如上图所示,希尔伯特曲线的特性使得我们可以很轻易的将二维的图片一维化,并且相邻点在曲线上也是相邻的
2.利用希尔伯特曲线加解密图片
我们可以利用希尔伯特曲线的特性,将二维图片上的像素点按照希尔伯特曲线的方向偏移一定像素,从而打乱原图像的像素,并且保证相邻的像素始终相邻,这一特性使得加密后的图像即使被压缩或者轻微破也能成功还原出原图像
如图,这是将一张1024*1024的图像沿希尔伯特曲线方向偏移114514像素前后对比
我们将加密后的图像压缩至128*128后尝试还原:
可以看到,即使图像被压缩64倍,依然可以还原出依稀可辨的原图像
我们将压缩后的图像随机裁剪并且加入大量噪音尝试还原:
可以观察到,依然可以还原出相应的原图像
3.算法的用途
此算法提供了一种简单的图片/视频加密方法,可以在有损失的不可靠传输中也能成功解密图像/视频,可以用于模拟图传信号的加密或者直播视频流的加密之类的会改变图像质量的领域的加解密
全部代码:
import cv2 import numpy as np import matplotlib.pyplot as plt from hilbert import decode def hilbert_curve_points(order): # 计算希尔伯特曲线的点数 num_points = 2 ** (order * 2) # 生成希尔伯特曲线上所有点的 Hilbert 编码 curve_points = np.arange(num_points) # 将 Hilbert 编码转换为坐标位置 coords = decode(curve_points, 2, order) # 将坐标位置转换为一系列坐标 curve_coords = [(x, y) for x, y in coords] return curve_coords def shift_channel(channel, offset): shifted_channel = np.roll(channel, -offset) return shifted_channel def shift_channels(pixels, num_channels, offset): shifted_pixels = np.zeros_like(pixels) for i in range(num_channels): shifted_pixels[:, i] = shift_channel(pixels[:, i], offset) return shifted_pixels def Hilbert_encode(img, step): # 获取图像的大小和通道数 height, width, channels = img.shape # 计算希尔伯特曲线的级别 level = int(np.log2(max(height, width))) # 生成希尔伯特曲线上的坐标点 curve_coords = hilbert_curve_points(level) # 创建一个空的一维数组来存储新的像素值,对每个通道分别进行操作 pixels = np.zeros((height * width, channels), dtype=img.dtype) # 使用希尔伯特曲线的顺序来获取像素值 for channel in range(channels): for i, (x, y) in enumerate(curve_coords): x = int(x) y = int(y) pixels[i, channel] = img[y % height, x % width, channel] pixels = shift_channels(pixels, 3, step) # 创建一个空的数组来存储还原的像素值 restored_img = np.zeros((height, width, channels), dtype=img.dtype) # 使用希尔伯特曲线的坐标来填充像素值 for i, (x, y) in enumerate(curve_coords): x = int(x) y = int(y) for channel in range(channels): restored_img[y % height, x % width, channel] = pixels[i, channel] return restored_img # 读取图像 img = cv2.imread('in.jpg') restored_img = Hilbert_encode(img, step=114514) # 使用matplotlib显示还原的图像 plt.imshow(restored_img) plt.axis('off') # 隐藏坐标轴 plt.show() # 保存处理后的图像 cv2.imwrite('out.jpg', restored_img)
明显就是为了骗过审核想出的骚方法。。。传输过程中的图像压缩算法会破坏“加密”后的大量高频成分,导致最...
哈哈,正解哈,确实是从这个想法出发想出来的歪点子,不过我不直播,只是想出来了这么个点子所以写出来玩一玩而已
时段 | 个数 |
---|---|
{{f.startingTime}}点 - {{f.endTime}}点 | {{f.fileCount}} |
200字以内,仅用于支线交流,主线讨论请采用回复功能。