仿射密码Affine Cipher
加密如下
C
=
E
11
,
23
(
M
)
=
11
M
+
23
(
m
o
d
26
)
C=E_{11,23}(M)=11M+23 (mod 26) \\
C=E11,23(M)=11M+23(mod26)
解密如下
D
X
,
23
C
=
X
(
C
−
23
)
(
m
o
d
26
)
11
X
m
o
d
  
26
=
1
D_{X,23}C=X(C-23)(mod 26) \\ 11X\mod26 = 1
DX,23C=X(C−23)(mod26)11Xmod26=1
扩展欧几里得算法(extended Euclidean algorithm)
//applied to affine cipher
#include<stdio.h>
int main()
{
//ax mod 26 == 1
//ax + by = 1
int a,b;
int x1,x2,x3,y1,y2,y3;
int temp1,temp2,temp3;
int q;
printf("input a:");
scanf("%d",&a);
fflush(stdin);
printf("input b:");
scanf("%d",&b);
fflush(stdin);
x1 = 1;
x2 = 0;
x3 = a;
y1 = 0;
y2 = 1;
y3 = b;
printf("%d\n",11 / 26);
printf("q x1 x2 x3 y1 y2 y3\n");
printf("---------------------------------------------------\n");
printf("NONE %3d %3d %3d %3d %3d %3d\n",x1,x2,x3,y1,y2,y3);
while(y3 != 0)
{
q = x3 / y3;
temp1 = x1;
temp2 = x2;
temp3 = x3;
x1 = y1;
x2 = y2;
x3 = y3;
y1 = temp1 - q * y1;
y2 = temp2 - q * y2;
y3 = temp3 - q * y3;
printf("%3d %3d %3d %3d %3d %3d %3d\n",q,x1,x2,x3,y1,y2,y3);
}
printf("%dx mod 26 == 1 \n",a);
printf("%dx +%dy == 1 \n",a,b);
printf("x == %d \n y==%d\n",x1,x2);
printf("gcd(%d,%d) == %d\n",a,b,x3);
getchar();
return 0;
}
输入
input a:11
input b:26
输出
q x1 x2 x3 y1 y2 y3
---------------------------------------------------
NONE 1 0 11 0 1 26
0 0 1 26 1 0 11
2 1 0 11 -2 1 4
2 -2 1 4 5 -2 3
1 5 -2 3 -7 3 1
3 -7 3 1 26 -11 0
11x mod 26 == 1
11x +26y == 1
x == -7
y==3
gcd(11,26) == 1
-7 mod 26 = 19
所以,X=19。
a- 0 b- 1 c- 2 d- 3 e- 4
f- 5 g- 6 h- 7 i- 8 g- 9
k-10 l-11 m-12 n-13 o-14
p-15 q-16 r-17 s-18 t-19
u-20 v-21 w-22 x-23 y-24
z-25
eg,M=‘s’=18.
C = E 11 , 23 ( 18 ) = 11 × 18 + 23 = 13 m o d    26 C=E_{11,23}(18)=11\times 18+23 = 13 \mod 26 C=E11,23(18)=11×18+23=13mod26
D 19 , 23 ( 13 ) = 19 × ( 13 − 23 ) = 18 m o d    26 D_{19,23}(13)=19\times (13-23)=18 \mod 26 D19,23(13)=19×(13−23)=18mod26