一种基于希尔伯特曲线的图片及视频加密方法
yuanfeng2023/05/16原创 软件综合 IP:湖南
中文摘要
本文提出了一种使用希尔伯特曲线对图像进行加密的算法。希尔伯特曲线是一种填充空间的曲线,具有良好的空间填充特性和一维化特点。该算法通过对图像的像素按照希尔伯特曲线的顺序进行重新排列,实现对图像的加密和还原操作。
Abstract
This paper presents an algorithm that utilizes the Hilbert curve for image encryption. The Hilbert curve is a space-filling curve known for its favorable spatial filling properties and one-dimensional characteristics. The proposed algorithm achieves image encryption and restoration by rearranging the pixels of the image in the order dictated by the Hilbert curve.
关键词
希尔伯特曲线图像加密一维化信息安全
Hilbert curveimage encryptionone-dimensionalinformation security

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()

image.png

如上图所示,希尔伯特曲线的特性使得我们可以很轻易的将二维的图片一维化,并且相邻点在曲线上也是相邻的

2.利用希尔伯特曲线加解密图片

我们可以利用希尔伯特曲线的特性,将二维图片上的像素点按照希尔伯特曲线的方向偏移一定像素,从而打乱原图像的像素,并且保证相邻的像素始终相邻,这一特性使得加密后的图像即使被压缩或者轻微破也能成功还原出原图像

image.png

如图,这是将一张1024*1024的图像沿希尔伯特曲线方向偏移114514像素前后对比

我们将加密后的图像压缩至128*128后尝试还原:

image.png

可以看到,即使图像被压缩64倍,依然可以还原出依稀可辨的原图像

我们将压缩后的图像随机裁剪并且加入大量噪音尝试还原:

image.png

可以观察到,依然可以还原出相应的原图像

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)



来自:计算机科学 / 软件综合严肃内容:预印本
12
 
13
 
高赞回复 
已屏蔽 原因:{{ notice.reason }}已屏蔽
{{notice.noticeContent}}
~~空空如也
yuanfeng 作者
1年6个月前 IP:湖南
920656
引用量子隧道发表于1楼的内容
用算法来保密?按照现代信息理论,好像这并不可靠。。。用密钥来加密?那么简单地在希尔伯特曲线上平移,好...

是的,这不是一个严肃的加密方法,只是一时兴起想出来的一个点子,是我思考如何直播骗审核的时候出现的灵感

7
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
yuanfeng作者
1年6个月前 IP:湖南
920654
引用UICalc发表于2楼的内容
明显就是为了骗过审核想出的骚方法。。。传输过程中的图像压缩算法会破坏“加密”后的大量高频成分,导致最...

哈哈,正解哈,确实是从这个想法出发想出来的歪点子,不过我不直播,只是想出来了这么个点子所以写出来玩一玩而已

引用
评论
4
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论
yuanfeng作者
1年6个月前 IP:湖南
920656
引用量子隧道发表于1楼的内容
用算法来保密?按照现代信息理论,好像这并不可靠。。。用密钥来加密?那么简单地在希尔伯特曲线上平移,好...

是的,这不是一个严肃的加密方法,只是一时兴起想出来的一个点子,是我思考如何直播骗审核的时候出现的灵感

引用
评论
7
加载评论中,请稍候...
200字以内,仅用于支线交流,主线讨论请采用回复功能。
折叠评论

想参与大家的讨论?现在就 登录 或者 注册

所属专业
所属分类
上级专业
同级专业
yuanfeng
进士 机友 笔友
文章
7
回复
92
学术分
0
2019/07/21注册,2个月10天前活动
暂无简介
主体类型:个人
所属领域:无
认证方式:手机号
IP归属地:湖南
文件下载
加载中...
{{errorInfo}}
{{downloadWarning}}
你在 {{downloadTime}} 下载过当前文件。
文件名称:{{resource.defaultFile.name}}
下载次数:{{resource.hits}}
上传用户:{{uploader.username}}
所需积分:{{costScores}},{{holdScores}}下载当前附件免费{{description}}
积分不足,去充值
文件已丢失

当前账号的附件下载数量限制如下:
时段 个数
{{f.startingTime}}点 - {{f.endTime}}点 {{f.fileCount}}
视频暂不能访问,请登录试试
仅供内部学术交流或培训使用,请先保存到本地。本内容不代表科创观点,未经原作者同意,请勿转载。
音频暂不能访问,请登录试试
支持的图片格式:jpg, jpeg, png
插入公式
评论控制
加载中...
文号:{{pid}}
投诉或举报
加载中...
{{tip}}
请选择违规类型:
{{reason.type}}

空空如也

加载中...
详情
详情
推送到专栏从专栏移除
设为匿名取消匿名
查看作者
回复
只看作者
加入收藏取消收藏
收藏
取消收藏
折叠回复
置顶取消置顶
评学术分
鼓励
设为精选取消精选
管理提醒
编辑
通过审核
评论控制
退修或删除
历史版本
违规记录
投诉或举报
加入黑名单移除黑名单
查看IP
{{format('YYYY/MM/DD HH:mm:ss', toc)}}