您的位置:首页 > 其它

ISCC-BASIC-50-easy?

2015-05-30 19:11 267 查看


[title2]easy?[/title2]


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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: