#include<stdio.h>
#define N 3 //可加密举洞的字符串长度
char plaintext[N]= //明文,输入时输入字符,参与运算时强制转换成整数
int ciphertext[N]=//密文,保存成整数,输出时强制转换成字符
void getPlainText() //获得明文字符串
{
printf("请输入明文:")
scanf("%s",plaintext)
printf("\数锋n")
}
void getKey()//输入密钥矩阵
{
int i,j
printf("请输入加密矩阵:\n")
for(i=0i<Ni++)
for(j=0j<Nj++)
scanf("%d",&key[i][j])
printf("\n")
}
void hill() //Hill加密算法
{
int i,j
for(i=0i<Ni++){ //矩阵的乘法
for(j=0j<Nj++){ //计算转换依据,0~25对应a~z
ciphertext[i]+=key[i][j]*(int)(plaintext[j]-'a')
ciphertext[i]%=26
}
}
printf("\n")
}
void printCipherText()//输出加密后的密文
{
int i
printf("加密后的密文是:"薯答晌)
for(i=0i<Ni++) //把参与计算后是整数强制转换成对应的字符
printf("%c",(char)(ciphertext[i]+'a'))
printf("\n")
}
void main()
{
getPlainText()//明文
getKey()//密钥
hill() //加密
printCipherText()//密文
}
这是C的腔昌,且基于的是ASCII码,大致改一改吧。#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<轿迟string.h>
struct hill
{
int i,j
int s[10][10]
}a[3],b
struct hill mul(struct hill,struct hill)
int det(struct hill,int,int)
struct hill inv(struct hill)
void code()
void uncode()
FILE *word,*num
void main()
{
int i=0,j=0,k=0
word=fopen("word.txt","r")
num=fopen("num.txt","r")
if(word==NULL||num==NULL)
{
printf("Error!\n")
exit(0)
}
fclose(word)
fclose(num)
while(!i)
{
fflush(stdin)
printf("输入密码\n")
for(i=0i<10i++)
{
for(j=0j<10j++)
{
a[k].s[i][j]=getchar()
if(a[k].s[i][j]=='\n') break
}
if(a[k].s[i][0]=='\n') break
}
for(a[k].j=0a[k].s[0][a[k].j]!='\n'a[k].j++)
for(a[k].i=0a[k].s[a[k].i][0]!='\n'a[k].i++) a[k].s[a[k].i][a[k].j]=0
for(i=0i<a[k].ii++) for(j=0j<a[k].jj++) a[k].s[i][j]=a[k].s[i][j]-'a'
i=0
if(a[k].i==a[k].j)
{
if(det(a[k],a[k].i,a[k].j)%2!=0&&det(a[k],a[k].i,a[k].j)%13!=0)
{
printf("是(0)否(1)继续输入?:")
scanf("%d"伍帆扒,&i)
k++
}
else printf("密码不合格!\n")
}
else printf("密码不合格!\n")
}
while(i)
{
printf("1:加密 2:解密\n")
scanf("%d",&i)
switch(i)
{
case 1: code()break
case 2: uncode()break
default: i=0
}
}
}
struct hill mul(struct hill a,struct hill b)
{
int i=0,j=0,k=0
struct hill ans
ans.i=a.i
ans.j=b.j
for(i=0i<ans.ii++)
{
for(j=0j<ans.jj++)
{
ans.s[i][j]=0
for(k=0k<a.jk++)
ans.s[i][j]=ans.s[i][j]+a.s[i][k]*b.s[k][j]
}
}
for(i=0i<ans.ii++)
{
for(j=0j<ans.jj++) ans.s[i][j]=(ans.s[i][j]%26+26)%26+'a'
ans.s[i][j]='\0'
}
return(ans)
}
struct hill inv(struct hill a)
{
char c
int i=0,j=0,k=0
struct hill ans
ans.i=a.i
ans.j=a.j
switch(det(a,a.i,a.j)%26)
{
case 1: k=1break
case 3: k=9break
case 5: k=21break
case 7: k=15break
case 9: k=3break
case 11: k=19break
case 15: k=7break
case 17: k=23break
case 19: k=11break
case 21: k=5break
case 23: k=17break
case 25: k=25break
}
for(i=0i<ans.ii++)
{
for(j=0j<ans.jj++)
ans.s[i][j]=(((int)pow(-1,i+j)*det(a,i,j)*k)%26+26)%26
}
for(i=0i<ans.ii++) ans.s[i][ans.j]='\0'
for(i=0i<ans.ii++)
{
for(j=0j<ij++)
{
c=ans.s[i][j]
ans.s[i][j]=ans.s[j][i]
ans.s[j][i]=c
}
}
return(ans)
}
int det(struct hill a,int m,int n)
{
int i=0,j=0,x=0
if(m!=a.i||n!=a.j)
{
for(i=0i<a.ii++) for(j=nj<a.jj++) a.s[i][j]=a.s[i][j+1]
for(i=mi<a.ii++) for(j=0j<a.jj++) a.s[i][j]=a.s[i+1][j]
a.i--
a.j--
}
if(a.i==2&&a.j==2) return(a.s[0][0]*a.s[1][1]-a.s[0][1]*a.s[1][0])
for(i=0i<a.ii++) x+=a.s[0][i]*det(a,0,i)*(int)pow(-1,i)
return(x)
}
void code()
{
int i=0,j=0,space[10],k=0,n=0
struct hill ans
char c=0
word=fopen("word.txt","r")
c=fgetc(word)
while(c!=EOF)
{
if(c>='a'&&c<='z') n++
c=fgetc(word)
}
fclose(word)
word=fopen("word.txt","r")
num=fopen("num.txt","w")
while(n)
{
printf("剩余%d: ",n)
scanf("%d",&j)
n=n-j
for(k=0a[k].i!=jj++)
b.i=a[k].i
b.j=1
for(j=0j<10j++) space[j]=-1
j=0
for(i=0i<b.ii++)
{
b.s[i][0]=fgetc(word)
if(b.s[i][0]<'a'||b.s[i][0]>'z')
{
space[j]=i
j++
b.s[i][0]=fgetc(word)
}
}
for(i=0i<b.ii++)
{
b.s[i][0]-='a'
b.s[i][1]='\0'
}
ans=mul(a[k],b)
for(i=0i<ans.ii++)
{
for(j=0j<10j++) if(i==space[j]) break
if(j!=10) fprintf(num," %c",ans.s[i][0])
else fprintf(num,"%c",ans.s[i][0])
}
}
fclose(word)
fclose(num)
}
void uncode()
{
int k=0,n=0
int i=0,j=0,space[10]
struct hill ans
char c=0
word=fopen("num.txt","r")
c=fgetc(word)
while(c!=EOF)
{
if(c>='a'&&c<='z') n++
c=fgetc(word)
}
fclose(word)
word=fopen("word.txt","w")
num=fopen("num.txt","r")
b.i=a[k].i
b.j=1
while(n)
{
printf("剩余%d: ",n)
scanf("%d",&j)
n=n-j
for(k=0a[k].i!=jj++)
b.i=a[k].i
b.j=1
for(j=0j<10j++) space[j]=-1
j=0
for(i=0i<b.ii++)
{
b.s[i][0]=fgetc(num)
if(b.s[i][0]<'a'||b.s[i][0]>'z')
{
space[j]=i
j++
b.s[i][0]=fgetc(num)
}
}
for(i=0i<b.ii++)
{
b.s[i][0]-='a'
b.s[i][1]='\0'
}
ans=mul(inv(a[k]),b)
for(i=0i<ans.ii++)
{
for(j=0j<10j++) if(i==space[j]) break
if(j!=10) fprintf(word," %c",ans.s[i][0])
else fprintf(word,"%c",ans.s[i][0])
}
}
fclose(word)
fclose(num)
}
// 希尔算法的加密与解密\x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include \x0d\x0a#include // nDime为全部变量,可逆矩阵的维数\x0d\x0aint nDime\x0d\x0aint index = 0// MAXN为明文的最大长度\x0d\x0aconst int MAXN = 256// 矩阵相乘,a是一个列为早掘扒1的矩阵\x0d\x0avoid MultiplyMatrix(int a[], int b[][10], int *text)\x0d\x0a{\x0d\x0a int i, j, tfor (i = 0i = size)\x0d\x0asum %= size\x0d\x0a temp1[diff] *= m[row][column]\x0d\x0a temp2[sum] *= m[row][column]\x0d\x0a }\x0d\x0a }\x0d\x0a t = 0\x0d\x0a for (row = 0row 回答于 2022-11-16欢迎分享,转载请注明来源:内存溢出
评论列表(0条)