基于置换和代换方法的灰度图像的加密

来源:互联网 发布:图标素材 知乎 编辑:程序博客网 时间: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;}