本文目录一览:
- 1、2.为什么图像在加密后,它的直方图的分布越平越好
- 2、急求一个完整的c语言图像置乱加密算法!!!
- 3、有哪些视频加密算法
- 4、基于Arnold置乱的数字水印图像加密算法的设计,基于Matlab语言编程,完成Arnold置乱算法,并用Matlab GUI工
2.为什么图像在加密后,它的直方图的分布越平越好
正如楼上所言,直方图分布越平,加密图像的可读性越差,那么信号变得越随机,还原的可能性就更小了,也就是说更安全了。
急求一个完整的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库读取,加密的思路是类似的,最简单方法是把奇数位和偶数位的高程值置换一下
有哪些视频加密算法
全部加密
使用标准加密算法(比如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、金钻视频加密专家都可以加密视频的。
基于Arnold置乱的数字水印图像加密算法的设计,基于Matlab语言编程,完成Arnold置乱算法,并用Matlab GUI工
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板块