• 大小: 3KB
    文件类型: .zip
    金币: 2
    下载: 0 次
    发布日期: 2024-01-28
  • 语言: C/C++
  • 标签: C++  

资源简介

使用c++实现hill密码的加密解密以及破译,代码可即时运行。 代码详述:代码有两个文件,第一个文件用于加密解密,第二个文件用于破译,均可由用户即时输入,交互性好。

资源截图

代码片段和文件信息

#include
#include
#include
using namespace std;
int gcd(int aint b)
{
    while(b != 0)
    {
        int r = b;
        b = a%b;
        a = r;
    }
    return a;

int math(int a)
{
if(a<0)
{
for(int i=1;;i++)
{
a=a+26;
if(a>=0&&a<26)
break;
}
}
else
for(int i=0;;i++)
{
if(a>=0&&a<26)
break;
a=a-26;
}

return a;
}
int main()
{
int matrix[2][2];//matrix[2][2]为加密矩阵
int dtplen;//dt为行列式的值,flag是明(文)长度的奇偶标志,0为偶数,1为奇数
cout<<“请输入明文长度:“;
cin>>len;
cout<<‘\n‘<<“请输入明文:“;
char *pla=new char[len];//plaz指向用户输入的明文(26个字母组成)
int *tran1=new int[len];//tran1指向明文对应的数字组成的数组
char *ciph=new char[len];//ciph指向密文
int *s=new int[len];//s指向密文数字数组
for(int i=0;i cin>>pla[i];
//随机生成一个对模为26可逆的二阶矩阵
do
{
matrix[0][0]=rand()%26;
matrix[0][1]=rand()%26;
matrix[1][0]=rand()%26;
matrix[1][1]=rand()%26;
dt = -1;
for(p=1; dt < 0; p++)
{
dt = ((matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0]) + 26 * p)%26; //行列式的值 
}
}while(dt%2==0||dt%13==0);
cout<<‘\n‘<<“加密矩阵为:“<<‘\n‘< //判断输入明文的长度是否为偶数
if(len % 2 == 1) 
 {
pla[len] = ‘a‘;
len = len+1;
 }
//将明文里的字母转化为对应的数字(要区分大小写大写字母要先转换为小写字母)
for(i=0; i {
if(pla[i] >= ‘A‘ && pla[i] <= ‘Z‘)
{
pla[i] = pla[i] + 32;
}
if(pla[i] >= ‘a‘ && pla[i] <‘z‘)
tran1[i]=pla[i]-‘a‘+1;
else
tran1[i]=0;
}
//以两个为一组,一次加密
for(i=0; i {
s[i]=(tran1[i]*matrix[0][0]+tran1[i + 1]*matrix[0][1])%26;
s[i + 1] = (tran1[i] *matrix[1][0] + tran1[i + 1] * matrix[1][1]) % 26;
    }
//把加密后的数字数组转化为字母(不区分大小写)
cout<<“密文:“<<‘\n‘;
for(i=0; i {
if(s[i]!=0)
ciph[i] = s[i] + ‘a‘-1;
else ciph[i]=‘z‘;
cout<<(char)ciph[i]<<‘\t‘;
}

//求矩阵的逆
int det = -1invdet;//invdet为加密矩阵模的倒数
int matrix2[2][2];//matrix2[22]为解密矩阵
int *mes=new int[len];//mes指向解密后的明文对应的数字数组
char *ciph2=new char[len];//ciph2指向解密后的明文
    /*for(i=0; det < 0; i++)
{
det = ((matrix[0][0] * matrix[1][1] - matrix[0][1] * matrix[1][0])+i*26)%26;
}
i=1;*/
while(i++)
{
if((dt*i)%26==1)
{
invdet=i;
break;
}
}
    /*i = 1;
    while(1)
{
if((det * i) % 26 == 1)
{
invdet=i;
break;
        }
else
i++;
}*/
//逆矩阵
    int temp=(matrix[1][1]*invdet);
matrix2[0][1]=(-1 * matrix[0][1]) * invdet;
    matrix2[1][0]=(-1 * matrix[1][0]) * invdet;
    matrix2[1][1]=(matrix[0][0]*invdet);
matrix2[0][0]=temp;
matrix2[0][0]=math(matrix2[0][0]);
matrix2[0][1]=math(matrix2[0][1]);
matrix2[1][0]=math(matrix2[1][0]);
matrix2[1][1]=math(matrix2[1][1]);
    // 得到解密后结果
cout<<‘\n‘<<“解密矩阵:“<<‘\n‘<    for(i=0; i {
mes[i] = (s[i] * matrix2[0][0] + s[i + 1] * matrix2[0][1]) % 26;
mes[i + 1] 

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----
     目录           0  2019-06-07 08:33  Hill密码\
     文件        3486  2019-06-06 17:58  Hill密码\hiil密码加密解密.cpp
     文件        3918  2019-06-06 17:56  Hill密码\hill密码破译.cpp

评论

共有 条评论