博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
累死人之希尔加密
阅读量:4559 次
发布时间:2019-06-08

本文共 2667 字,大约阅读时间需要 8 分钟。

#include 
#include
#include
#include
#define N 5using namespace std;int exgcd(int A,int &x,int B,int &y){ int x1,y1,x0,y0; x0=1;y0=0; x1=0;y1=1; int r=(A%B+B)%B; int q=(A-r)/B; x=0;y=1; while(r) { x=x0-q*x1; y=y0-q*y1; x0=x1; y0=y1; x1=x;y1=y; A=B;B=r;r=A%B; q=(A-r)/B; } return B;}int modq(int a,int n,int x,int y){int b=1; int d=exgcd(a,x,n,y); if(b%d==0) { x=(x%(n/d)+n/d)%(n/d); if(!x)x++; return x; } else printf("Not Exist\n");}//计算矩阵的行列式 int getA(int A[N][N],int n){ if(n==1) return A[0][0]; int num=0; int temp[N][N]={
0.0}; int i,j,k; for(i=0;i
=i) temp[j][k]=A[j+1][k+1]; else temp[j][k]=A[j+1][k]; } } int t=getA(temp,n-1); if(i%2==0) num+=A[0][i]*t; else num-=A[0][i]*t; } return num%26;}//求矩阵的伴随矩阵 void getAstart(int A[N][N],int n,int newA[N][N]) { if(n==1) { newA[0][0]=1; return; } int i,j,k,t; int temp[N][N]; for(i=0;i
=i)?k+1:k][(t>=j)? t+1:t]; } } newA[j][i]=(getA(temp,n-1)); if((i+j)%2==1) newA[j][i]=-newA[j][i]; newA[j][i]=newA[j][i]%26; if(newA[j][i]<0) newA[j][i]=(newA[j][i]+26)%26; } }}//求矩阵的逆void getInverse(int A[N][N],int n,int I[N][N]){ int t[N][N]={ 0.0}; int flag=getA(A,n); int x,y; int e=modq(flag,26,x,y); if(e==0) return; else { getAstart(A,n,t); for(int i=0;i
m) { int s=m; m=n;n=s; } r=m%n; while(r!=0) { m=n; n=r; r=m%n; if(r==0) { return n; } } }}bool IsInverse(int A[N][N],int n)//判断矩阵是否可作为密钥 { int t=getA(A,n); if(gcd(t,26)==1) return true; else return false;}vector
change1(string s) //将明文密文转化为字母表中的次序,A为0,依次类推 { vector
v; for(int i=0;i
='A'&&s[i]<='Z') v.push_back(s[i]-'A'); if(s[i]>='a'&&s[i]<='z') v.push_back(s[i]-'a');}return v; } string change2(vector
v)//将字母的次序转化为小写字母 { string s=""; for(int i=0;i
v)//将字母的次序转化为大写字母 { string s=""; for(int i=0;i
mingnum; mingnum=change1(s); int rows=length/N; int lines=N; int mingmatrix[rows][lines]={ 0.0}; for(int i=0;i
minum; for(int i=0;i
minum; minum=change1(s); int rows=length/N; int lines=N; int mimatrix[rows][lines]={ 0.0}; for(int i=0;i
mingnum; for(int i=0;i
>ars[i][j]; } } cout<<"请输入明文"<
>mess; addcode(ars,mess); cout<<"请输入密文"<
>code; deaddcode(ars,code);}

其实老师让做的是变长的,我找了网上的代码,加密解密和它做的略有不同,不过除非是希尔加密否则求行列式不推荐这种做法,因为循环到了三层以上代码的可读性非常差,但是用这种方法求行列式的好处就是比较简单,推荐传一个二级指针进去进行行列式求解,较好理解,但对于希尔加密不适合,因为会在判断互素的时候损失精度。

转载于:https://www.cnblogs.com/daremosiranaihana/p/10600604.html

你可能感兴趣的文章
第八遍:链接详解
查看>>
Qt5.5 使用smtp发邮件的各种坑
查看>>
js奇葩错误 字符串传递问题
查看>>
人之初,性本恶
查看>>
springboot 端口号
查看>>
使用AChartEngine画动态曲线图
查看>>
安卓项目五子棋代码详解(四)
查看>>
urllib 学习一
查看>>
bzoj4196 [Noi2015]软件包管理器——树链剖分
查看>>
kafka源码阅读环境搭建
查看>>
UI设计
查看>>
androidtab
查看>>
Windows Phone 自定义弹出框和 Toast 通知
查看>>
php 事件驱动 消息机制 共享内存
查看>>
剑指offer 二叉树的bfs
查看>>
LeetCode Maximum Subarray
查看>>
让我们再聊聊浏览器资源加载优化
查看>>
underscore demo
查看>>
CSS hack
查看>>
C# Enum Name String Description之间的相互转换
查看>>