zoukankan      html  css  js  c++  java
  • Bugku-CTF加密篇之affine(y = 17x-8 flag{szzyfimhyzd})

    affine

    y = 17x-8 flag{szzyfimhyzd}
    答案格式:flag{*}
    来源:第七届山东省大学生网络安全技能大赛
     
     
     
    本题要点:仿射加密
     
     
    看到这道题目有点懵.....题目是affine.....查看中文释义是仿射。
     
    查阅资料,什么是仿射密码呢?
     
     
     仿射加密法 
     
    在仿射加密法中,字母表的字母被赋予一个数字,例如 a=0,b=1,c=2…z=25 。仿射加密法的密钥为0-25直接的数字对。
    仿射加密法与单码加密法没什么不同,因为明文的每个字母分别只映射到一个密文字母。
    仿射密码的加密算法就是一个线性变换,即对任意的明文字符x,对应的密文字符为 ,其中,a,b∈,且要求gcd(a,26)=1,函数e(x)称为仿射加密函数。
     
    注意:
    注1. 仿射加密函数要求gcd(a,26)=1,即要求a和26互素,否则就不是一个单射函数。
    注2. 从仿射加密函数的表达式易知,当a=1,b=3时,这种仿射密码就是著名的凯撒密码。
    注3. 在求解仿射解密函数时,需要求a在上的乘法逆元这可由扩展欧几里得算法求解,下表列出了在上所有与26互素元素的乘法逆元:
     
     举个栗子~ 
     
    假设e(x)为密文,x为明文。
    设仿射加密函数是
    由上表知:所以相应的仿射解密函数是
    若加密明文是  sorcery  ,首先把明文每个字母转换为数字 18,14,17,2,4,17,24 。然后对明文进行加密,这里以第一个字母s为例:
     
    e(x)=(11*18+6)mod 26
    e(x)=204 mod 26
    e(x)=22 
     
    对照下表:
     
     

     

     
    依次解密,最后得密文为   welcylk 
     
     
    那么,我们根据这个原理,写一个脚本解密一下~
    (这里又要借用大佬的py脚本了~)
     
    flag = "szzyfimhyzd"
    flaglist = []
    for i in flag:
        flaglist.append(ord(i)-97)
    flags = ""
    for i in flaglist:
        for j in range(0,26):
            c = (17 * j - 8) % 26
            if(c == i):
                flags += chr(j+97)
    print(flags)
     
     
     
     
    得到结果~~
     
     
     
    提交 flag{affineshift} 
     
     
     
     
     
     
     
    参考资料:
     
    https://baike.baidu.com/item/仿射加密法/1708885?fr=aladdin
    https://blog.csdn.net/qq_42777804/article/details/91484576
     
     
     
  • 相关阅读:
    C语言实现mq收发数据的函数
    4G通信模块在ARM平台下的应用
    4G 通信模块在ARM 平台下的应用
    修改web前端访问端口
    从零开始用 Flask 搭建一个网站(一)
    Python实现Windows定时关机
    前端和后端的数据交互(jquery ajax+python flask+mysql)
    python开源项目及示例代码
    Django读取Mysql数据并显示在前端
    C++关于string的一些用法
  • 原文地址:https://www.cnblogs.com/0yst3r-2046/p/12172757.html
Copyright © 2011-2022 走看看