这是本萌新的信息安全课程的大作业 :
下面是本作业的基本概念:
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 0xfffff
int 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;
}