ImageEncipher
PRA-TPE: Perfectly recoverable approximate thumbnail-preserving image encryption
Install / Use
/learn @RMDE/ImageEncipherREADME
基于差分扩展的缩略图保持加密技术
环境配置
- matlab
基本原理
- 以块为单位,将块分为调整区和嵌入区,利用差分扩展将调整区中的像素的MSB嵌入嵌入区,加密后通过改变调整区像素的MSB使块平均像素与原始平均像素值基本一致从而达到缩略图保持。
应用场景
- 云端的图片保存等
具体步骤
一.腾空间
对块进行处理
- 记录调整区的MSB
- 对嵌入区的像素进行分类
- 每两个像素为一组
- 计算两个像素之间的平均值以及差值
- l = [x+y]/2
- h = x-y
- 通过判断 |2h+b| , |2[h/2]+b| 与 min(2(255-l),2l+1) 之间的关系,从而对每组像素进行分类
- EZ :h=0 || h=-1
- EN : |2*h+b| <= min(2(255-l), 2l+1) 即可拓展集合
- CN : |2*[h/2]+b| <= min(2(255-l), 2l+1 即可变集合
- NC : 不满足上述两个条件,即不可变区
- 考虑到空间因素,将EN分为EN1和EN2两部分一部分作为可拓展部分,一部分作为可变部分
- 生成待嵌入数据
- locate-map用于标记可拓展像素组
- 对属于EN2和CN集合的像素组的h的LSB部分进行收集(h=1 || h=-2时不用记录)
- 调整区的MSB部分
- (若MSB>1,则将每个像素的同一位一起保存,例如将每个像素的最高位收集在一起,然后将次高位收集存在所有最高位之后)
- 将locate-map以及MSB部分进行游程编码来进行压缩
- 整合为块嵌入数据: data = Encode(locate-map) + LSB + Encode(MSB)
- 进行预备工作
- 对于可拓展像素组
- h' = 2*h
- 对于可变像素组
- h' = 2*[h/2]
- x' = l+[(h'+1)/2]
- y' = l-[h'/2]
- 对于可拓展像素组
对图像整体进行处理
- 整合待嵌入数据
- 对块内得到的数据信息进行编码,这里采用的是当遇到连续8个‘1’时,在后面加上‘0’
- 对块与块数据之间插入分隔符‘01111111110’用于区别
- 对图像整体进行数据嵌入
- 通过判断 |2*[h/2]+b| 与 min(2(255-l),2l+1) 之间的关系,从而对每组像素进行分类
- CH :|2*[h/2]+b| <= min(2(255-l), 2l+1 即可变集合
- NC :不可变区
- 对于可变像素组
- h' = h+b (b为待嵌入比特)
- 若数据已经嵌入完成,则不再进行嵌入操作
- x' = l+[(h'+1)/2]
- y' = l-[h'/2]
- 通过判断 |2*[h/2]+b| 与 min(2(255-l),2l+1) 之间的关系,从而对每组像素进行分类
二.加密
- 此处用简单的流加密方式进行加密,当然可以采用更安全的加密方式(包括会改变像素位置的加密方式,但一定要记录可调整区像素位置用于调整)
三.调整
- 通过不断改变调整区像素的MSB,找出所有可能中最接近于原图像块平均像素的一组数据(即遍历查找)
四.解密
- 此处和加密一致,直接将加密过程用于解密即可
五.提取
对图像整体进行处理
- 将嵌入区的像素组分类
- 两个像素一组
- 计算两个像素之间的平均值以及差值
- l = [x+y]/2
- hh = x-y
- 通过判断 |2*[h/2]+b| 与 min(2(255-l),2l+1) 之间的关系,从而对每组像素进行分类
- CH :|2*[h/2]+b| <= min(2(255-l), 2l+1 即可变集合
- NC :不可变区
- 可变集合CH中的hh的LSB位即为嵌入的信息
- 对提取的信息进行解码,并根据分隔符将整体嵌入信息分解为各个块的嵌入信息
对块进行处理
- 计算出嵌入信息各组成部分压缩前的大小
- locate-map:(blocksize-2)*(blocksize-2)/2
- MSB:blocksize*4-4
- LSB:size(data) - size(locate-map) - size(MSB)
- 对经过压缩的嵌入数据进行还原
- 从data的首部开始:边还原MAP边对已经还原的MAP元素个数进行计算,当达到locate-map原大小时停止
- 从data的尾部开始:边还原MSB边对已经还原的MSB元素个数进行计算,当达到MSB原大小时停止
- 两部分中间的即为LSB部分
- 将嵌入区的像素组分类
- 两个像素一组
- 计算两个像素之间的平均值以及差值
- l = [x+y]/2
- hh = x-y
- 通过判断 |2*[h/2]+b| 与 min(2(255-l),2l+1) 之间的关系,从而对每组像素进行分类
- CH :|2*[h/2]+b| <= min(2(255-l), 2l+1 即可变集合
- NC :不可变区
- 对可变区的像素进行还原
- 对于属于EZ & EN1的像素组(即locate-map中值为1): h = [hh/2]
- 0 <= hh <= 1: h = 1
- 12 <= hh <= -1: h = -2
- else: h = 2*[hh/2]+LSB
- x = l+[(h+1)/2]
- y = l-[h/2]
- 对调整区像素进行还原
- pixel = pixel(8-MSB)+MSB
Related Skills
node-connect
351.2kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
frontend-design
110.6kCreate distinctive, production-grade frontend interfaces with high design quality. Use this skill when the user asks to build web components, pages, or applications. Generates creative, polished code that avoids generic AI aesthetics.
openai-whisper-api
351.2kTranscribe audio via OpenAI Audio Transcriptions API (Whisper).
qqbot-media
351.2kQQBot 富媒体收发能力。使用 <qqmedia> 标签,系统根据文件扩展名自动识别类型(图片/语音/视频/文件)。
