古典密码----仿射密码加解密
理论部分
-
仿射密码是移位密码的一个推广,其加密过程不仅包含移位操作,而且使用了乘法运算。与移位密码相同,仿射密码的明文空间M和密文空间C均为Z26,因此,在使用仿射密码体制对英文消息进行加密之前,需要在26个英文字母与Z26中的元素之间建立一一对应关系,然后才能应用仿射密码体制进行相应的加密计算和解密计算。
代码部分
C语言实现
#include <stdio.h> #include <math.h> #include<string.h> #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]= ;//字符串时及时添加结束标志以防额外增加数组长度。 printf("The Input Text is: %s. ",Input); // fflush(stdin); printf("The Output Text is: %s. ",Output); // fflush(stdin); } 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. "); 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、s0、s1、t0、t1 r0=r1;r1=r2; s0=s1;s1=s2; t0=t1;t1=t2; } //printf("THE GCD of R0 AND R1 IS: %d . ", r0); //printf("Original s0 and t0: %d , %d. ",s0,t0); if(r0==1){ s0=(R1+(s0%R1))%R1; t0=(R0+(t0%R0))%R0; //printf("Afterwards [P+( x mod P)]mod P: s0 = %d ,t0= %d. ",s0,t0); r0_inverse= s0; r1_inverse= t0; //printf("The inverse of %d mod %d is: %d ",R1,R0,r1_inverse) ; }else{ printf("THE GCD is: %d UNEQUAL TO 1, NO INVERSE EXITS. ",r0) ; return 1; } return 0; } int main(){ int p = 26, k1, k2;//仿射密钥 c=k1*m+k2 mod p 古典密码p=26 int p_, k_1, flag; char message[N + 1]; do { flag = 0; printf(" Please input the three affine cipher parameters:k1,k2,p,以逗号分隔:"); //读取数值时,默认以空格分隔,如需逗号则在%d后面指定格式:scanf("%d,%d",&k1,&k2); scanf("%d,%d,%d",&k1, &k2, &p); printf(" The input keys are: k1=%d , k2= %d, p= %d ",k1,k2,p); //getchar()在scanf()后,可以吸收回车符,以便输入下一个字符/串。特别是在后续需输入含空格的字符串时 getchar(); flag = EEA(p, k1, p_, k_1); if (flag == 1) printf("输入的密钥无效,请重新输入! "); } while(flag == 1); printf("Input the message to process:"); //以回车(换行)作为字符串读取的结束,默认遇空格、回车、跳格键结束。 scanf("%[^ ]", message); printf(" The message/plaintext is:%s", message); int length = strlen(message); char cipher[length], decipher[length]; printf("对输入的文本进行加密处理: "); printf("消息加密前后对比如下: "); Affine(message, cipher, length, k1, k2, p); //补充解密部分 printf("消息解密前后对比如下: "); Affine(cipher, decipher, length, k_1, ((p - k2) * k_1) % 26, p); return 0; }
-
gcd为1 gcd不为1
下一篇:
javaEE基于SSM社区失物招领网站