ISCC-BASIC-50-easy?

本文介绍了使用仿射函数进行加密的基本原理,并通过一个具体的例子展示了如何求解仿射加密的逆函数,进而实现对密文的有效解密。文中详细解释了逆元的求解过程及解密函数的具体计算步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值