理论部分
- 仿射密码是移位密码的一个推广,其加密过程不仅包含移位操作,而且使用了乘法运算。与移位密码相同,仿射密码的明文空间M和密文空间C均为Z26,因此,在使用仿射密码体制对英文消息进行加密之前,需要在26个英文字母与Z26中的元素之间建立一一对应关系,然后才能应用仿射密码体制进行相应的加密计算和解密计算。
代码部分
C语言实现
#include
#include
#include
#define N 200
using namespace std;
void Affine(char *Input, char *Output, int length,int k1, int k2,int p){
int km=k1,ka=k2;
for(int i=0; i<length; i++){
if(Input[i]>='a'&&Input[i]<='z')
Output[i]=(km*(Input[i]-'a')+ka)%p+'a';
else
if(Input[i]>='A'&&Input[i]<='Z')
Output[i]=(km*(Input[i]-'A')+ka)%p+'A';
else
Output[i]=Input[i];
}
Output[length]='\0';
printf("The Input Text is: %s.\n",Input);
printf("The Output Text is: %s.\n",Output);
}
int EEA(int r0, int r1, int &r0_inverse, int &r1_inverse) {
int R0=r0,R1=r1;
if(r0==0 || r1==0){
printf("ERROR: One of the two input numbers is zero.\n");
return 0;
}
int q=0,r2=0,s0=1,s1=0,s2=0,t0=0,t1=1,t2=0;
while(r1!=0){
q=r0/r1;
r2=r0%r1;
s2=s0-s1*q;
t2=t0-t1*q;
r0=r1;r1=r2;
s0=s1;s1=s2;
t0=t1;t1=t2;
}
if(r0==1){
s0=(R1+(s0%R1))%R1;
t0=(R0+(t0%R0))%R0;
r0_inverse= s0;
r1_inverse= t0;
}else{
printf("THE GCD is: %d UNEQUAL TO 1, NO INVERSE EXITS.\n",r0) ;
return 1;
}
return 0;
}
int main(){
int p = 26, k1, k2;
int p_, k_1, flag;
char message[N + 1];
do {
flag = 0;
printf("\nPlease input the three affine cipher parameters:k1,k2,p,以逗号分隔:");
scanf("%d,%d,%d",&k1, &k2, &p);
printf("\nThe input keys are: k1=%d , k2= %d, p= %d \n",k1,k2,p);
getchar();
flag = EEA(p, k1, p_, k_1);
if (flag == 1)
printf("输入的密钥无效,请重新输入!\n");
} while(flag == 1);
printf("Input the message to process:");
scanf("%[^\n]", message);
printf("\nThe message/plaintext is:%s", message);
int length = strlen(message);
char cipher[length], decipher[length];
printf("对输入的文本进行加密处理:\n");
printf("消息加密前后对比如下:\n");
Affine(message, cipher, length, k1, k2, p);
printf("消息解密前后对比如下:\n");
Affine(cipher, decipher, length, k_1, ((p - k2) * k_1) % 26, p);
return 0;
}
运行结果截图
- gcd为1

- gcd不为1
