【Sword系列】第七届全国残疾人职业技能大赛样题-网络安全-affine

举报
剑豪 发表于 2023/06/17 22:37:41 2023/06/17
【摘要】 仿射密码是一种基于数学运算的加密算法,它将明文中的每个字母通过一系列的数学变换,转化为密文中的一个字母。

前言

1.仿射密码

仿射密码是一种基于数学运算的加密算法,它将明文中的每个字母通过一系列的数学变换,转化为密文中的一个字母。

具体算法:

设明文中的一个字母为x,加密后的字母为y,加密密钥为(a, b),则仿射密码的加密公式为:

y = (ax + b) % n

其中,n为字母表的大小(通常为26),% 表示取余运算。

换算:

为了解密密文,需要求出加密密钥的逆元,然后按照逆元的公式进行解密。

设密文中的一个字母为y,解密后的字母为x,加密密钥为(a, b),则仿射密码的解密公式为:

x = a' * (y - b) % n

其中,a'为a的逆元,% 表示取余运算。

2.逆元

逆元,指在模运算下,对于给定的整数a和模数m,如果存在一个整数x,使得(a * x) % m = 1,则称x为a在模m下的逆元。逆元在密码学中有重要的作用,例如在RSA算法、ElGamal算法、椭圆曲线密码等密码算法中均有应用。

具体算法:

  1. 暴力枚举算法:枚举[0, m-1]之间所有数x,逐一验证(a * x) % m是否等于1,时间复杂度为O(m)。

  2. 扩展欧几里得算法:根据扩展欧几里得算法,可以在O(log m)的时间复杂度内求出a在模m下的逆元。具体算法步骤如下:

    (1)使用欧几里得算法求出a和m的最大公约数d,如果d不等于1,则a在模m下不存在逆元。

    (2)求出方程 ax + my = d 的一组整数解(x0, y0),可以使用扩展欧几里得算法求解。

    (3)方程 ax + my = d 的任意一组整数解(x, y) 都可以表示为(x0 + tm, y0 - tn),其中t为任意整数。

    (4)如果将等式 ax = 1 - my 代入其中,得到 x = x0 + t(m/d),由于x是a在模m下的逆元,因此x需要满足0 <= x < m。

    (5)因此,求出x = (x0 + t(m/d))%m,即为a在模m下的逆元。

简单案例:

例如,计算在模26下,字母D的逆元。由于D在字母表中是第4个字母(A为第0个字母),因此D在模26下的值为4。要求D的逆元,需要找到一个整数x,满足(4 * x) % 26 = 1。通过暴力枚举,可以验证当x等于7或者19时,满足条件。因此D在模26下的逆元为7或者19。

一、affine

1.打开题目

在这里插入图片描述

2.解题

ord(i)函数是Python中的一个内置函数,用于获取一个字符的ASCII码值,即字符对应的整数表示。例如,ord('a')返回数值97,ord('b')返回数值98,以此类推。

在ASCII码表中,小写字母a的ASCII码值为97,因此ord(i)-97表示将字符i转换为小写字母a的偏移量,也就是i与a之间的距离。例如,当i等于'b'时,ord(i)返回数值98,减去97后得到1,表示'b'与'a'相差1个单位。这个偏移量在密码学中常常用来进行模运算和数组索引操作。例如,在Caesar密码中,就使用了这个偏移量对明文进行加密,具体方法是将明文中的每个字母都向后移动k个单位,其中k为给定的密钥。

flag = "szzyfimhyzd"
flaglist = []#取与a位置的偏移量
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:flag{affineshift}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。