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

转载:来自 谢谢博主分享
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;
}

猜你喜欢

转载自blog.csdn.net/qq_33248019/article/details/80559709