资源简介
使用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
- 上一篇:C++生存游戏
- 下一篇:格雷码图片生成与保存C++实现代码
相关资源
- 格雷码图片生成与保存C++实现代码
- C++生存游戏
- 职工工作量统计系统.rar
- lbm模拟液滴从壁面滑落
- C++学生成绩管理系统 2018
- Win32简易画图程序
- C++数值算法 C数值算法 的随书代码
- 扫雷游戏.cpp C++ 课程设计
- c++万能外挂.txt
- Qt飞机大战小游戏源代码
- VC++用MFC做选课系统
- C++网络爬虫项目
- 泡泡堂(炸弹人)小游戏C/C++完整源码
- 张平OpenCV算法精讲基于python和C++教材
- CTP、python、C++ 期货、股票程序化交易
- Visual C++串口通信技术详解.(机械工业
- MFC VC++实现Sierpinski分形图像
- Accelerated C++ (中文pdf+英文原版chm)
- 汽车加油行驶问题 C++算法实现
- C++操作系统课设-进程管理
- c++,fp-growth实现两部分fp构建和fp-gr
- 客房管理系统含一万字论文
- 功能强大的多条曲线绘制类 (MFC,
- 池塘夜降彩色雨
- 声波方程有限差分数值模拟程序C++
- vc++ opengl代码爆炸
- 我见过最漂亮的CS仿真程序openGL和C+
- C++ 命令行小游戏 节奏大师别踩白块
- c++实现ECC加解密
- 酒店客房预定系统vc++)
评论
共有 条评论