第3关:仿射密码
任务描述
仿射密码为单表加密的一种,字母系统中所有字母都利用一个简单数学方程加密,对应至数值或转回字母。
本关任务:用 c++ 实现仿射密码,然后对输入的密文字符串进行仿射解密后打印输出。
相关知识
为了完成本关任务,你需要掌握:
1.同余方程;
2.欧拉函数;
3.逆元;
4.仿射密码的密码体制;
5.费马小定理;
在仿射密码中,加密函数定义成为:e(x)=(ax+b)(mod 26)我们知道,密码体制需要满足单射性,在当前密码体制下,一个明文只能对应一个密文,所以为了保证上面加密的式子的单射性,我们需要加一些限制条件,这些限制条件由一些定理来支撑,下面给出这些定理。
同余方程
定义 设a∈Zm,对任意的b∈Zm,同余方程ax≡b(mod m)有唯一解x∈Zm的充分必要条件是gcd(a,m)=1(这里的gcd的意思是最大公约数的意思)。
下面我们会看到只有a和m互质,a才会有关于m的逆元,才会有唯一解。假设m=26,因为26=2×13,故所有的与26互质的数为a=1,3,5,7,9,11,15,17,19,21,23,25。b的取值可以是Z26中的任何数。因此仿射密码的密钥空间为12×26=312。下面是代码实现:
constexpr int m=26; // 模数 mod 取值为26
cout<<"a=";
for(int i=1; i<m; i++)
if(m%i!=0) //判断m是否可以整除i
cout<<i<<' '; //输出与m互质的数
输出结果:
a=1 3 5 7 9 11 15 17 19 21 23 25
欧拉函数
定义 设