本文目录一览:
- 1、急求一个完整的c语言图像置乱加密算法!!!
- 2、主流的图像置乱方法
- 3、Arnold变换详解
- 4、基于Arnold置乱的数字水印图像加密算法的课程设计
- 5、有哪些视频加密算法
- 6、图像解密会损失像素吗
急求一个完整的c语言图像置乱加密算法!!!
#include "windows.h"
#include "stdio.h"
#include "string.h"
#include "malloc.h"
unsigned char *pBmpBuf;//读入图像数据的指针
unsigned char *pEnBmpBuf;//加密图像数据的指针
unsigned char *pUnBmpBuf;//解密图像数据的指针
char key=255;//密钥
int bmpWidth;//图像的宽
int bmpHeight;//图像的高
RGBQUAD *pColorTable;//颜色表指针
int biBitCount;//图像类型,每像素位数
bool readBmp(char *bmpName)
{
//二进制读方式打开指定的图像文件
FILE *fp=fopen(bmpName,"rb");
if(fp==0) return 0;
//跳过位图文件头结构BITMAPFILEHEADER
fseek(fp, sizeof(BITMAPFILEHEADER),0);
//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
BITMAPINFOHEADER head;
fread(head, sizeof(BITMAPINFOHEADER), 1,fp);
//获取图像宽、高、每像素所占位数等信息
bmpWidth = head.biWidth;
bmpHeight = head.biHeight;
biBitCount = head.biBitCount;
//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
//灰度图像有颜色表,且颜色表表项为256
if(biBitCount==8){
//申请颜色表所需要的空间,读颜色表进内存
pColorTable=new RGBQUAD[256];
fread(pColorTable,sizeof(RGBQUAD),256,fp);
}
//申请位图数据所需要的空间,读位图数据进内存
pBmpBuf=new unsigned char[lineByte * bmpHeight];
fread(pBmpBuf,1,lineByte * bmpHeight,fp);
//关闭文件
fclose(fp);
return 1;
}
void encrypt(char k)
{
//加密,奇数位置的像素使用位运算加密,偶数位置像素为原始值
int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
pEnBmpBuf=new unsigned char[lineByte * bmpHeight];
for (int i=0;ilineByte * bmpHeight;i++)
{
if (i%2==0)
{
pEnBmpBuf[i]=pBmpBuf[i];
}
else pEnBmpBuf[i]=pBmpBuf[i]^k;
}
}
void unencrypt(char k)
{
//解密
int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
pUnBmpBuf=new unsigned char[lineByte * bmpHeight];
for (int i=0;ilineByte * bmpHeight;i++)
{
if (i%2==0)
{
pUnBmpBuf[i]=pEnBmpBuf[i];
}
else pUnBmpBuf[i]=pEnBmpBuf[i]^k;
}
}
bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,
int biBitCount, RGBQUAD *pColorTable)
{
//如果位图数据指针为0,则没有数据传入,函数返回
if(!imgBuf)
{printf("error\n!");return 0; }
//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
int colorTablesize=0;
if(biBitCount==8)
colorTablesize=1024;
//待存储图像数据每行字节数为4的倍数
int lineByte=(width * biBitCount/8+3)/4*4;
//以二进制写的方式打开文件
FILE *fp=fopen(bmpName,"wb");
if(fp==0) return 0;
//申请位图文件头结构变量,填写文件头信息
BITMAPFILEHEADER fileHead;
fileHead.bfType = 0x4D42;//bmp类型
//bfSize是图像文件4个组成部分之和
fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ colorTablesize + lineByte*height;
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;
//bfOffBits是图像文件前3个部分所需空间之和
fileHead.bfOffBits=54+colorTablesize;
//写文件头进文件
fwrite(fileHead, sizeof(BITMAPFILEHEADER),1, fp);
//申请位图信息头结构变量,填写信息头信息
BITMAPINFOHEADER head;
head.biBitCount=biBitCount;
head.biClrImportant=0;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=height;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=lineByte*height;
head.biWidth=width;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
//写位图信息头进内存
fwrite(head, sizeof(BITMAPINFOHEADER),1, fp);
//如果灰度图像,有颜色表,写入文件
if(biBitCount==8)
fwrite(pColorTable, sizeof(RGBQUAD),256, fp);
//写位图数据进文件
fwrite(imgBuf, height*lineByte, 1, fp);
//关闭文件
fclose(fp);
return 1;
}
void main()
{
char inFileName[90],outFileName1[90],outFileName2[90];
printf("请输入原始位图文件的文件名:");
scanf("%s",inFileName);
printf("请输入加密程序产生的新位图文件的文件名:");
scanf("%s",outFileName1);
printf("请输入解密程序产生的新位图文件的文件名:");
scanf("%s",outFileName2);
//读入指定BMP文件进内存
readBmp(inFileName);
//输出图像的信息
printf("width=%d,height=%d, biBitCount=%d\n",bmpWidth,bmpHeight, biBitCount);
//图像加密
encrypt(key);
//将加密数据存盘
saveBmp(outFileName1, pEnBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
//图像解密
unencrypt(key);
//将解密数据存盘
saveBmp(outFileName2, pUnBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
//清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间
delete []pBmpBuf;
if(biBitCount==8)
delete []pColorTable;
}
读取BMP,使用位运算加密,你也可以自己改
dem数据的话,一般用GDAL库读取,加密的思路是类似的,最简单方法是把奇数位和偶数位的高程值置换一下
主流的图像置乱方法
一.背景/意义
背景:
图像置乱是信息隐藏技术的一种,图像置乱后图像无法辨认,可以达到对图像信息的隐藏和保护作用,图像置乱的主要目的是将给定的图像经过处理后变成杂乱无章的不可见图像,其中按照图像置乱的特点可以将图像置乱划分为空域置乱,频域置乱和空频域混合置乱,由于其数学原理相近,并没有本质区别,因此在对图像置乱进行分析时,可以只考虑空域上的图像置乱
目前基于骑士巡游变换的置乱算法是目前比较流行的研究方向,在安全性上的性能优于其他算法。
意义:
图像置乱对信息起到了隐藏和保护作用,既可以对信息进行加密传送,也可以作为图像处理的预处理。任何的二进制比特,都可以采用相应的矩阵变换来进行处理,除了对信息的不可感知性和抗攻击功能外,图像置乱预处理的
目前图像置乱的主流应用场景是图像的预处理
二.骑士巡游
在所有的置乱算法中,骑士巡游问题要求骑士在棋盘上使用马步遍历棋盘的格子且每个格子只路过一次,在对图像进行骑士巡游置乱时Niklaus Wirth在1976年的著作中使用了“回溯算法”,其时间复杂度是n的四次方,虽然骑士巡游算法复杂度较高,但是其安全性高,可以应用在保密性要求高的图像隐藏和保护算法中,在对水印图像进行预处理的过程中,水印的保密性要求仅仅要求水印处理后的不可见性。
三.对称加密
四.混沌加密
五.Hilbert置乱
Hilbert置乱是在1890年由意大利数学家皮亚诺和赫尔伯特提出的填满正方形单位的FASS曲线,其中一共存在八种置乱路径,当图像水印大小较为大时,例如16*16时,应用Hilbert置乱的置乱周期较大,置乱效果较好。Hilbert置乱具有较大的置乱周期,增强了图像的安全性,但是由于其在某些置乱次数时重合度较高,且Hilbert算法本身实现较为复杂,在本次算法仿真时不予采用。
六.分块分层
七.仿射变换理论(Arnold置换)
几何仿射变换在图像预处理和图像隐藏应用较为广泛,其变换的基本形式为:
几何仿射变换要求变换是离散点域到其自身的单映射,变换是离散点域到其自身的满映射
诸如Arnold变换的几何仿射变换在图像置乱中具有周期性,设最小周期为T,图像经过周期T处理后回到原图
常见的和几何仿射相似的变换还有排列变换和斐波那契变换等变换,其中排列变换依旧具有周期性,其安全性不高
从对水印进行预处理的角度看,对水印的预处理的时间复杂度不应该太高,保密性也不应当太低。Arnold置换是一个周期固定的变换,进行适当的改进依旧可以让传统的Arnold置换具有较高的保密性和安全性,例如生成随机二进制密钥控制Arnold置乱的参数,可以让图像在进行置换时按照行列进行不同的置换
Arnold置换在进行迭代置乱时,具有较强的纹理特征,这也是Arnold置换的缺点,通过明显的纹理特征可以看出Arnold置换的痕迹
Arnold置换的优点:其置换原理简单,时间复杂度较低,根据柏森【基于信息隐藏的隐蔽通信技术研究】中的结论,几何变换的置乱程度优于斐波那契变换的置乱程度。
八.生命游戏
Arnold变换详解
利用Arnold变换(又称猫脸变换)可以对图像进行置乱,使得原本有意义的图像变成一张无意义的图像。该变换可以在其它图像处理前对图像做预处理,例如在数字盲水印嵌入前对水印进行置乱。也可以用于普通的图像加密。
通常一次Arnold变换达不到理想效果,需要对图像进行连续多次的变换。Arnold变换具有周期性,即对图像连续进行Arnold变换,最终又能得到原图像。变换的周期和图像的尺寸有关。
当图像是一张方形的图像时,Arnold变换存在逆变换。经过N次Arnold变换后的数据可以通过N次逆变换恢复数据。
Arnold变换不仅可以用于图像置乱,也可以用于其它数据的置乱和加密。
狭义的猫脸变换即最简单的一种变换。网络上绝大部分关于Arnold变换的博客都是狭义Arnold变换。
其矩阵运算公式为:
置乱的实质是新位置与旧位置的映射,且该映射是一一对应的 。下图是一次猫脸变换的示意图:
此处宽高需要相等是方便后续的逆变换。
如图所示,一次变换后,原图得到了一定程度的置乱,但还能分辨出原始图像的信息,6次变换后图像已看不出原始图像的信息。
当一张图片的宽度和高度相同时,Arnold变换具有逆变换。虽然Arnold变换具有周期性,可以通过一直变换下去得到原图,但是周期越长,恢复原图也越长。通过逆变换可以较为方便地把变换后的图像恢复。
转换为多项式为:
逆变换的效果当然就是把图像复原了。此处就不在贴效果图了。
如前文所述,只要错切的单位满足取模回填后,原图与变换后的图能够一一对应,那么该变换就是有效的。满足这个条件的公式是:
其逆变换公式为:
这里只列出了用于Android的一维数组形式:
对于广义Arnold变换,当a、b、count任何一个值不同时,变换后图像也是不相同的。因此,可以把(a、b、count)作为加密参数对图像进行加密。此外,还可以对图像的不同部分进行不同的加密,使得更难破解。例如,可以把图像分为四份(甚至可以有交集),分别对每一份子图进行加密,这样又增大了破解的难度。
Arnold加密后,如果图像被破坏了,例如压缩、涂改等。解密后的图像依然能恢复一部分数据。
下图是以参数(7,11,4)加密的图像,以及对加密后的图像进行涂抹后再解密的结果。
可以看出Arnold变换有较高的鲁棒性,即使添加了多个较大的圆也能恢复出原图的大致信息。
根据Arnold变换的原理,我们还可以用来加密其它数据,而不仅仅是图像。
基于Arnold置乱的数字水印图像加密算法的课程设计
clc
clear all;
iTimes=10; %置乱次数
% 读入水印图像
file_name='3232水印.bmp';
message=double(imread(file_name));
%水印图像矩阵的行数与列数
Mm=size(message,1);
Nm=size(message,2);
%对水印图像进行arnold置乱
if Mm~=Nm
error('水印矩阵必须为方阵');
end
if Mm~=90
error('必须为90*90大小,或者修改置乱次数');
end
tempImg=message; %图像矩阵赋给tempImg
for n=1:iTimes %置乱次数
for u=1:Mm
for v=1:Nm
temp=tempImg(u,v);
ax=mod((u-1)+(v-1),Mm)+1; %新像素行位置
ay=mod((u-1)+2*(v-1),Nm)+1; %新像素列位置
outImg(ax,ay)=temp;
end
end
tempImg=outImg;
end
% 显示水印,嵌入水印图像与原始图像
figure(1)
subplot(1,3,1);
imshow(message,[]);
title('原始水印');
subplot(1,3,2)
imshow(outImg,[]);
title('置乱水印');
% arnold反置乱
message_arnold=tempImg;
iTimes1=60-iTimes
%置乱后水印图像矩阵的行数与列数
Mo=size(outImg,1);
No=size(outImg,2);
for n=1:iTimes1 % 次数
for u=1:Mo
for v=1:No
temp1=tempImg(u,v);
bx=mod((u-1)+(v-1),Mo)+1;
by=mod((u-1)+2*(v-1),No)+1;
outImg1(bx,by)=temp1;
end
end
tempImg=outImg1;
end
message=outImg1;
% 显示反置乱后水印
%figure(3)
%subplot(1,3,1);
%imshow(message_arnold,[]);
%title('提取的置乱水印');
subplot(1,3,3);
imshow(message,[]);
title('反置乱(恢复)水印');
%subplot(1,3,3);
%imshow(orig_watermark,[])
%title('原始水印')
gui 自己学学吧 matlab中文论坛 gui板块
有哪些视频加密算法
全部加密
使用标准加密算法(比如DES3)加密整个视频流,其中,P是原始的多媒体数据,p0是经过压缩或不压缩的数据,C是使用加密算法加密过的数据,K是加密密钥。解密过程与加密过程相对陈,这种加密方法将视频比特流视作传统的文本数据,没有利用视频压缩后数据的特殊结构。这种方法显然计算量巨大,很难保证视频的实时传输
选择性加密
选择性加密是基于信源特征的视频加密方法的主要发展方向。其加密模型如下图所示。选择性加密可分为加班的选择性加密算法、仅加密头部信息的方法和SECMPEG比特流方法。
Zigzag置乱算法
Zigzag置乱算法的基本思想是使用一个随机的置乱序列来代替Zigzag扫描顺序,来将各个8*8块的DCT系数映射成一个1*64矢量。
Zigzag置乱算法速度很快,不影响视频的实时传输。但是经过加密的视频压缩后码流大下显著增加。因为运用非Zigzag顺序将8*8块映射到1*64矢量,将会极大减少连续零的个数,从而减少压缩率。视频流大小经过加密后增加可达46%。考虑到MPEG视频数据量的巨大,这种大小增量是很难容忍的。
改变Huffiman码表算法
改变Huffiman码表的视频加密算法原理是:对于熵编码采用Huffiman编码的视频标准,将通用Huffiman码表修改后使用,修改后的特殊Huffiman码表作为密钥。非接收方无此特殊码表,就无法正确解密视频信息。该算法完全不增加计算量。适用于使用Huffiman编码的各种视频和图像压缩编码标准和算法。其缺点是安全性较差。
纯置乱算法
纯置乱算法简单的置乱字节流。置乱密码序列的基数是根据密级和应用需求动态可变的。比如我们可以用64个数的置乱序列或一个长的I帧的1/8的置乱序列。这种算法的问题在于它对已知明文攻击非常脆弱。一旦通过比较密文和已知原始帧数据,获取了随机置乱序列,所有的帧将很容易被破解。为了找出随机置乱序列,我们需要已知随机序列长度倍数大小的明文。然而注意到MPEG数据流的单一性和帧大小在同一个数量级上,因此,基于香农理论,如果已知一个I帧数据足以破译整个随机序列。
如果你要是加密视频的话最简单的方法其实是下载一个视频加密软件就可以了,比如超级加密3000、金钻视频加密专家都可以加密视频的。
图像解密会损失像素吗
会,图像置乱的功能是将图像中像素的位置或者像素的颜色打乱,将原始图像变换成一个杂乱无章的新图像,如果不知道所使用的置乱变换,就很难恢复出原始图像。基于置乱技术的图像加密技术总体上来说可以等效为对图像矩阵进行有限不的初等变换,从而打乱像素的排列位置。但是初等变换时一维线性变换,其保密性不高。通常,图像置乱是图像信息隐藏、图像信息分存和数字水印等任务的基础性工作,置乱方法的优劣将直接影响其任务的效果,因此我们需要从置乱效果、计算复杂性、抗干扰能力等方面评价一个图像置乱算法的优劣。
3.2 基于行列乱序算法的图像加密技术
打乱矩阵行或列的方法运算步骤少、运算速度快,可对较大图像文件进行加密,缺点是对于一些特殊的图像无法进行加密。下面以随机打乱行为例介绍加密解密方法。