基于置换和代换方法的灰度图像的加密
来源:互联网 发布:图标素材 知乎 编辑:程序博客网 时间:2024/05/16 12:52
这是本萌新的信息安全课程的大作业 :
下面是本作业的基本概念:
1、灰度图像:
灰度数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。
2、信息熵:
某种特定信息的出现概率(离散随机事件的出现概率)。对于任意一个随机变量X,它的信息熵定义如下,单位为比特(bit):
,式中对数一般取2为底,单位为比特
3、置换密码与代换密码:
置换密码:明文的字母保持相同但顺序被打乱。置换只不过是一个简单的换位,每个置换都可以用一个置换矩阵Ek来表示。每个置换都有一个与之对应的逆置换Dk。
代换密码:是将明文字母替换成其他字母、数字或者符号。如果把明文看成二进制序列,那么代换就是用明文位串来代换明文位串。
4、算法原理流程
程序随机产生N*M大小的灰度图像像素矩阵,每个像素值在0-255之间。加密密钥为英文小写字母,密钥的长度即为keyLength。
加密:原像素矩阵重新排列,其规则如下:宽度W为keyLength,高度H为(N*M ) / keyLength。则重新排列后的像素矩阵为W*H,此时按照密钥字母从小到大的顺序输出每个字母对应的列。至此加密完成。
解密:读取已加密的像素矩阵,每次读取(N*M)/keyLength长度的像素值,排为列,并标记顺序。读取完毕之后,根据密钥字母的顺序逐列输出像素值。至此解密完成。
5、C++模拟实现
#include<iostream>#include<cstdio>#include<cstring>#include<ctime>#include<stdlib.h>#include<string>#include<windows.h>#include<algorithm>#include<map>#include<cmath>using namespace std;#define N 100#define M 100#define MAXN 255#define MAXNN 0xfffffint matrix[N][M];//灰度图像颜色矩阵 N*M#define random(x) (rand()%x) //产生0-x范围的随机数int n,m;//全局变量灰度图像的像素#define loop(i,x) for(int i=1;i<=x;i++)string vigerKey,zhKey;int a[N];//储存置换加密密钥int matrixViger[N][M];//存储代换加密密钥//初始化灰色图像矩阵void init(){ memset(matrix,MAXNN,sizeof(matrix)); srand((int)time(0)); loop(i,n)loop(j,m) matrix[i][j]=random(MAXN);}//输出灰色图像void print(){ loop(i,n){ cout<<"| "; loop(j,m) cout<<matrix[i][j]<<"\t"; cout<<"\n\n"; }}//初始化Vigenere密钥矩阵void initVigenereKey(){ int k=0; loop(i,n) for(int j=1;j<=m;j++,k++){ if(k>=vigerKey.length()) k=0; matrixViger[i][j]=(int)vigerKey[k]; }}//Vigener加密void vigenerEncrypt(){ loop(i,n) loop(j,m) if((i+j)&1) matrix[i][j]=(matrix[i][j]+matrixViger[i][j])%(MAXN+1); else matrix[i][j]=(matrix[i][j]+matrixViger[i][j]-96)%(MAXN+1);}//Vigener解密void vigenerDecrypt(){ int tt; loop(i,n) loop(j,m){ if((i+j)&1) tt = (matrix[i][j]-matrixViger[i][j]); else tt = (matrix[i][j]-matrixViger[i][j]+96); if(tt<0) tt+=(MAXN+1); matrix[i][j]=tt%(MAXN+1); }}//置换加密初始化密钥void initZh(){ loop(i,zhKey.length()) a[i]=zhKey[i-1]-96;}//置换加密 int temp2[N*N],coun=1;void zhEncrypt(){ int row=1; int matrixTemp[N][M];//存储变换次序后的矩阵 int temp[N*N]; int num=1,col,k=1; loop(i,zhKey.length()) temp[num++]=a[i]; loop(i,n) loop(j,m) temp[num++]=matrix[i][j]; for(row=1;;row++){ for(col=1;col<=zhKey.length();col++){ matrixTemp[row][col]=temp[k++]; } if(k>=num) break; } //测试输出// loop(i,row){// loop(j,zhKey.length())// cout<<matrixTemp[i][j]<<" ";// cout<<endl;// } sort(a+1,a+zhKey.length()+1); loop(j,zhKey.length()) //按照纵坐标的从小到大的顺序读取列值 { loop(jj,zhKey.length()) if(a[j]==matrixTemp[1][jj]) { loop(i,row) if(matrixTemp[i+1][jj]!=0) temp2[coun++]=matrixTemp[i+1][jj]; } }}void printZh() //打印置换加密矩阵{ int k=1; loop(i,n){ cout<<"| "; loop(j,m){ cout<<temp2[k]<<"\t"; k++; } cout<<"\n\n"; }}void zhDecrypt() //置换解密还没有写o(╯□╰)o{ loop(i,n){ cout<<"| "; loop(j,m) cout<<matrix[i][j]<<"\t"; cout<<"\n\n"; }}void shang(){ double p[N],sum=0; map<int,int> number; loop(i,n) loop(j,m) number[matrix[i][j]]++; loop(i,n) loop(j,m) sum+=(-log(number[matrix[i][j]]*1.0/(n*m))/log(2))*(number[matrix[i][j]]*1.0/(n*m)); printf("信息熵为:%.2f\n",sum);}void shang2(){ double p[N],sum=0; map<int,int> number; loop(i,coun) number[temp2[i]]++; loop(i,coun) sum+=(-log(number[temp2[i]]*1.0/(n*m))/log(2))*(number[temp2[i]]*1.0/(n*m)); printf("信息熵为:%.2f\n",sum);}//菜单void menu(){ cout<<"\n\n\t基于代换与置换的灰度图像加密与解密模拟系统\n\n"; cout<<"----------------------------------------------------\n\n"; cout<<"请输入图像大小(w*h)像素:"; cin>>n>>m; init(); cout<<"\n当前图像为:\n----------------------------------------------------"<<endl; print();}int main(){ menu(); cout<<"\n基于代换方法的灰度图像加密与解密模拟实现:\n"; //置换加密 cout<<"\n请输入加密密钥:"; cin>>vigerKey; initVigenereKey(); shang(); cout<<"\n加密后图像为:\n----------------------------------------------------"<<endl; vigenerEncrypt(); print(); shang(); cout<<"请输入回车得到解密后的图像:"; string cc,cct; getline(cin,cc); getchar(); cout<<"\n解密后图像为:\n----------------------------------------------------"<<endl; vigenerDecrypt(); print(); shang(); //////////////////////////////////////////////////////////////////////// cout<<"\n请输入回车进行置换算法加密与解密的演示:"; getline(cin,cct); getchar(); system("cls"); menu(); cout<<"\n基于置换方法的灰度图像加密与解密模拟实现:\n"; cout<<"\n请输入加密密钥:"; cin>>zhKey; initZh(); shang(); zhEncrypt(); cout<<"\n加密后图像为:\n----------------------------------------------------"<<endl; printZh(); shang(); string cctt; cout<<"请输入回车得到解密后的图像:"; getline(cin,cctt); getchar(); zhDecrypt(); return 0;}
阅读全文
0 0
- 基于置换和代换方法的灰度图像的加密
- 基于c++的图像的灰度修正
- 基于canvas的灰度图像识别
- 两种获取灰度图像的方法
- 图像灰度化的四种方法
- Matlab灰度NxN图像的Arnold加密与解密
- 黑白图像,灰度图像和彩色图像的区别
- java 加载图像,显示图像和图像的灰度化
- 图像的灰度化原理和实现
- 图像的灰度化原理和实现
- 图像的灰度化原理和实现
- 图像的二值化和灰度化
- 图像的二值化和灰度化
- 灰度图像的直方图
- 灰度图像的生成
- 灰度图像的直方图
- 图像的灰度直方图
- 图像的灰度直方图
- 落笔
- 放大镜效果
- 文件操作
- 域名的那些事
- java基础第三题 循环结构
- 基于置换和代换方法的灰度图像的加密
- 每日英语阅读(二十七)
- 线段树题集
- 读取和保存一个对象到文件方法总结(字符串形式)
- 2017"百度之星"程序设计大赛
- manven 私有仓库上传第三方jar 包
- 苹果手机的备份方法:iCloud备份和数据恢复使用教程
- strcpy
- ShuffleNet——面向移动设备的极为高效的卷积神经网络