资源简介
使用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++实现代码
相关资源
- 国际象棋的qt源代码
- C++中头文件与源文件的作用详解
- C++多线程网络编程Socket
- VC++ 多线程文件读写操作
- 利用C++哈希表的方法实现电话号码查
- 移木块游戏,可以自编自玩,vc6.0编写
- C++纯文字DOS超小RPG游戏
- VC++MFC小游戏实例教程(实例)+MFC类库
- 连铸温度场计算程序(C++)
- 6自由度机器人运动学正反解C++程序
- Em算法(使用C++编写)
- libstdc++-4.4.7-4.el6.i686.rpm
- VC++实现CMD命令执行与获得返回信息
- 白话C++(全)
- C++标准库第1、2
- 大数类c++大数类
- C++语言编写串口调试助手
- c++素数筛选法
- C++ mqtt 用法
- 商品库存管理系统 C++ MFC
- c++ 多功能计算器
- C++17 In Detail
- 嵌入式QtC++编程课件
- 颜色识别形状识别STM103嵌入式代码
- c++ 邮件多附件群发
- c++ 透明代理(hookproxy)
- mfc 调用redis
- FTP客户端源码(c++)
- c++ 画图(14Qt-XPS)
- c++多边形交并差运算
评论
共有 条评论