easy?
50
密文mzdvezc是用仿射函数y=5x+12加密得到的,试对其解密。
分析:
查了查百科,了解了什么是仿射函数。
仿射函数里用0~25表示字母a~z。
加密函数其实是y=(5x+12)mod 26,那么如何算出解密函数呢?
设解密函数为y=(m*x+n)mod 26
先求5的逆元。m是5关于Z26的逆元,则有(5*m)mod 26=1,不难算出m=21。
再求n。
解密函数就是加密函数的逆函数,即(x,y)是加密函数的一组解,那么(y,x)就是解密函数的一组解。
那么假设x=3,y=(5*3+12)mod 26=1。相应的逆函数的解就因该是(1,3)。即 3=(21*1+n)mod 26,式子可以写成26*N+3=21*1+n,那么取N=1,则 n=8,故y=(21x+8)mod 26。
当然,这里N取不同值,n的值就会不同,但是得到的函数其实是一样的,只是相差26的整数倍而已,用来计算的话,得到的答案都是一样的。
比如,N=0,n=-18,则y=(21x-18)mod 26,它和y=(21x+8)mod 26算出来的答案是一样的,只要n之间的差是26的整数倍就可以了,
8-(-18)=26, 34-8=26, 所以n=34也可以,以此类推。
然后代码实现:
#include<iostream>
using namespace std;
int main()
{
char a[]={'m','z','d','v','e','z','c'};
for(int i=0;i<7;i++)
{
int t;
t=a[i]-'a';
t=(21*t+8)%26;
a[i]=t+'a';
cout<<a[i];
}
return 0;
}
答案就是anthony