I.对于字母表str[ ]a,b,c.....z(本例只考虑小写,你也可以改大小写的)换算成0,1,2...25个数组A[ ](简单的 数组映射关系),即:str[i]=A[j],i=j;
II.选取秘钥,输入key(0-25),保证gcd(k,26)=1,即key和26互质。然后计算key的逆元(在此不介绍可 以google一下,简单说就是找到一个值与key相乘后对26模运算结果为1),赋值于key2。然后再输入一个人偏移密码key3(0-25);
III.则明文M转换成密文C公式就是
C=E(m);
C=(m*key+key3)%26
解密就是
M=(C-key3)*key2%26;(对(C-key3)的结果进行简单分析后再进行解密方可。即大于0直接减,若小于0说明偏移的量需要借助最后字母就是C-key3+'z')
实例代码://里面没写注释希望见谅哈,不足之处,不吝赐教
#include<stdio.h>
#include<string.h>
#include "math.h"
#define M 20
int gcd(int k,const int m);
int qiuNi(const int k);
void jiami(const int k,char *str,int a[],const int n,char *test,const int key3);
void jiemi(const int k,char *str,int a[],const int n,char *test,const int key3);
void main()
{
char str[26],ch,test[M];
int i,a[26],key1,key2,n,key3;
for(i=0;i<26;i++)
{
str[i]='a'+i;
a[i]=i;
//printf("%c\n",str[i]);
}
printf("本例程忽略了对换行(换行也记录字符)的考虑,直接输入字符即可\n");
printf("输入明码的字母数字9结束或者最大为20以*字符结束\n");
i=0;
ch='a';
while((i<20)&&ch!='*')
{
scanf("%c",&ch);
if(ch!='*'){
test[i]=ch;
i++;
}
}
n=i;
printf("this is the string %d\n",n);
for(i=0;i<n;i++)
{
printf("%c",test[i]);
}
printf("\n");
printf("enter erthe key\n");
scanf("%d",&key1);
while(gcd(key1,26)!=1)
{
printf("ent erthe key again\n");
scanf("%d",&key1);
}
printf("the key1 is %d\n",key1);
key2=qiuNi(key1);
printf("the key2 is %d\n",key2);
printf("enter the third key3\n");
scanf("%d",&key3);
printf("the key1=%d,key2=%d,key3=%d\n",key1,key2,key3);
jiami(key1,str,a,n,test,key3);
printf("jia mi process\n");
for(i=0;i<n;i++)
{
printf("%c",test[i]);
}
printf("\n");
jiemi(key2,str,a,n,test,key3);
printf("jie mi process\n");
printf("\n");
for(i=0;i<n;i++)
{
printf("%c",test[i]);
}
printf("\n");
}
int gcd(int k,const int m)
{
if(k==0)
return m;
else
return gcd(m%k,k);
}
int qiuNi(const int k)
{
int i=0,k2;
while(i<26)
{
if((i*26+1)%k==0)
{
k2=(i*26+1)/k;
break;
}
i++;
}
return k2;
}
void jiami(const int k,char *str,int a[],const int n,char *test,const int key3)
{
int j=0;
printf("the key3 is %d\n",key3);
for(j;j<n;j++)
{
int temp,index;
temp=test[j]-'a';
index=((a[temp]*k)+key3)%26;
printf("temp=%d,index=%d\n",temp,index);
test[j]=str[index];
}
}
void jiemi(const int k,char *str,int a[],const int n,char *test,const int key3)
{
int j=0;
printf("the key3 is %d\n",key3);
for(j;j<n;j++)
{
int temp,index;
temp=test[j]-'a';
if(a[temp]-key3>=0)
index=(a[temp]-key3)*k%26;
else
index=(a[temp]-key3+26)*k%26;
//index=(a[temp]-key3)>0?(a[temp]-key3)*k%26:-(a[temp]-key3)*k%26;
printf("temp=%d,index=%d\n",temp,index);
test[j]=str[index];
}
}