iscc2016-basic-find-to-me

额 第一题就暴力搜索了

 

已知仿射加密变换为c=(11m+8)mod26,试对密文sjoyuxzr解密

 

#include <stdio.h>

int main(void)
{
    int m,c;
    while(scanf("%c",&m))
    {
        c = (11 * (m -97)+ 8)%26;
        printf("%c",c+97);
    }
    return 0;
}

看了大神的代码 有所醒悟

c= Ek(m)=(k1m+k2) mod n

{
c-k2 = k1 *m mod n

令k3*k1 mod n =1

得(c - k2) * k3 = m mod n

m = (c - k2) * k3
}


m=Dk(c)=k3(c- k2) mod n(其中(k3 ×k1)mod26 = 1)

 

 

def extendedGCD1(a, b):
    # a*xi + b*yi = ri
    if b == 0:
        return (1, 0, a)
    (x, y, r) = extendedGCD1(b, a%b)
    """
    gcd(a, b) = a*xi + b*yi
    gcd(b, a %  b) = b*xi+1 + (a - [a/b]*b)*yi+1
    gcd(a, b) = gcd(b, a %  b)   =>   a*xi + b*yi = a*yi+1 + b*(xi+1 - [a/b]*yi+1)
    xi = yi+1
    yi = xi+1 - [a/b]*yi+1
    """
    tmp = x
    x = y
    y = tmp - (a/b) * y
    return (x, y, r)

  

posted @ 2016-05-30 20:10  ailx10  阅读(275)  评论(0编辑  收藏  举报