首页 > 编程知识 正文

仿射密码在线转化,仿射密码

时间:2023-05-04 17:28:30 阅读:186228 作者:2870

合营公司密码

仿射密码是特别的密码,一对一置换~

加密函数为e(x )=AXB (modm ),其中a和m彼此为素数,m为字母数字。

解码函数是d(x ) a^-1 ) x-b ) (mod m ) )不能打a^-1乘法的逆矩阵

仿射例题

【攻防世界】- -范菲先出问题,这个问题来源于BITSCTF。 【主题链接】

下载附件,得到以下字符串: 长度不长,由大写字母和数字构成。Base64/32很容易想象解码。

mzyvmiwlgbl7cijogjqvoa3in 5b ly C3 nhi

简单详细介绍一下,就可以看到网络巨头这个base系列的加密解密

Base32 :将由"0-9"、" a-z "、" a-z "、/和后缀"="构成任意的字节串数据编码为ASCII字符串的Base32:"将任意的字节数据编码为32个字符的可打印字符a-z、2-z

但是,用Base64解码也什么都没有找到。 这个问题的脑洞真大! 呃! 怪不得“fanfie”-(幻想)

通过解决百度大佬的问题才知道:

带Base32加密BITSCTF的Base32加密网站

用IJEVIU2DKRDA====获得的此加密字符串与标题提供的字符串进行匹配

mzyvmiwlgbl7cijogjqvoa3in5b ly C3 nhiijeviu 2dk RDA==

我发现上面同样的文字对应的下面的文字也一致。 (像M - I,L - D那样) )既然如此,那里就没有痕迹了。

因为是Base32编码。 那么,对A-Z、2-7进行编码:

3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/3358 www.Sina.com.Sina.com/http://ww.Sina.com 01234567http://www.Sina.com/http://www.Sina.com/http://www.com 3358 www.Sina.com/http://www http://www.Sina.com/http://ww.com.3358 ww.Sina.com/http://www.Sina.com/http://www.Sina.com/3http://wa.com 1618192022232http://ww.Sina 3358 www.Sina.com/http://www.Sina.com/http://www.Sina.com/http://wa.Sina.com/3http://

由此,可以更直观地了解字母的对应关系

3 -11 4 -24 8 -12 20 -8 21-21 25-9 26-22

这个每个字符替换一个字符的替代密码是A

加密函数为e(x )=AXB (modm ),其中a和m彼此为素数,m为字母数字。

解码函数是d(x ) a^-1 ) x-b ) (mod m ) )不能打a^-1乘法的逆矩阵

如何进行仿射解密? 我们有两种方法:

进行肉眼测量和手动计算

python脚本自动奔跑

我们先看第一个。 根据上述所有条件,可以自豪地确定仿射密码的a=13 b=4

通过仿射解码获得:

mzyvmiwlgbl7cijogjqvoa3in5b ly C3 nhi-- ije viu2dkrdhwuzskz4VSM tun5rdewtnpu

第二个是上行脚本:参考大人物仿射密码解读脚本yhdxf算法进行乘法运算来求解逆元

加密仿射的a:13 b:4模式: 32第一步,已知求解关于模式32的13个逆矩阵

#欧几里德计算法最大公约数defget_gcd(a,b ) : k=a//bremainder=a % bwhileremainder!=0: a=bb=remainder k=a//bremainder=a % breturnb #求解改进yhdxf算法线性方程的x和ydef ge

t_(a, b): if b == 0: return 1, 0 else: k = a // b remainder = a % b x1, y1 = get_(b, remainder) x, y = y1, x1 - k * y1 return x, ya = input('a:')b = input('b:')a, b = int(a), int(b)# 将初始b的绝对值进行保存if b < 0: m = abs(b)else: m = bflag = get_gcd(a, b)# 判断最大公约数是否为1,若不是则没有逆元if flag == 1: x, y = get_(a, b) x0 = x % m # 对于Python '%'就是求模运算,因此不需要'+m' print("所求的逆元:", x0) # x0就是所求的逆元else: print("Do not have!")


k1:仿射加密函数中的a

k2:仿射加密函数中的b

k3:13关于 模32 的逆元


输入到下面java代码中

import java.util.Scanner;public class Main{ public static void main(String[] args) { char[] form = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '2', '3', '4', '5', '6', '7'}; Scanner sc = new Scanner(System.in); System.out.println("请输入待加密的明文:"); String MingWen = sc.nextLine(); MingWen=MingWen.toUpperCase(); final int K1 = 13; //仿射加密函数中的a final int K2 = 4; //仿射加密函数中的b final int K3 = 5; // 13关于 模32 的逆元 int [] cipherNum=new int[MingWen.length()];//用来存储数字化的密文 encryption(MingWen,form,K1,K2,K3,cipherNum); } public static void encryption(String MingWen,char[] form,int K1,int K2,int k3,int[] cipherNum){ char[] pla=new char[MingWen.length()]; for (int i = 0; i <MingWen.length() ; i++) { pla[i]=MingWen.charAt(i); } int[] MingWenNumber=new int[pla.length]; for (int i = 0; i <pla.length ; i++) { for (int j = 0; j <form.length ; j++) { if (form[j]==pla[i]) { MingWenNumber[i] = j; } } } //通过脚标将明文全部转化为数字 char[] cipher = new char[MingWen.length()]; char[] JieMI = new char[MingWen.length()]; int len = MingWen.length();//cipher密码数组 用来存储密文 for (int i = 0; i <MingWen.length() ; i++) { int a= Math.floorMod((K1*MingWenNumber[i]+K2),32); cipherNum[i]=a; cipher[i]=form[a]; //计算密文并存入数组中 } System.out.println("加密结果是:"); System.out.println(cipher); for (int i =0;i<len;i++){ JieMI[i]=form[Math.floorMod(k3*(MingWenNumber[i]-K2),32)]; } System.out.println("解密结果是:"); System.out.println(JieMI); }}


IJEVIU2DKRDHWUZSKZ4VSMTUN5RDEWTNPU

最后一步啦~ 对脚本跑出的代码进行 Base32 解码 。网站同上。


BITSCTF{S2VyY2tob2Zm}

再来一简单题!

【bugkuCtf】 – affine

题目链接 请戳这里


u1s1,该题目就非常实诚。直接给出 a / b 以及 密文 并且 affine 直接明示 这是 仿射解密 。


E**(x) = (ax + b) (mod m)** a=17 b = -8szzyfimhyzd

话不多说,我们可以继续使用上面的脚本 也可以使用下面一种更快的脚本 搬自这位大佬


def get(a, b): if b == 0: return 1, 0 else: k = a //b remainder = a % b x1, y1 = get(b, remainder) x, y =y1, x1 - k * y1 return x, ys = input("请输入解密字符:").upper()a = int(input("请输入a:"))b = int(input("请输入b:"))#求a关于26的乘法逆元x, y = get(a, 26)a1 = x % 26l= len(s)for i in range(l): cipher = a1 * (ord(s[i])- 65 - b) % 26 res=chr(cipher + 65) print(res, end='')


因为题目已经明确给出 ,所以直接进行解析就好。


preflag = "szzyfimhyzd"flags = []for i in preflag: flags.append(ord(i)-97)flag = ""for i in flags: for j in range(0,26): a = (17 * j - 8) % 26 if(a == i): flag += chr(j+97)print(flag)

那最后的flag就是:

affineshift
⭐结语

最后:其实我蛮惊奇的。 fanfie && affine 取名上十分巧妙。

( 前一题是不是有暗示的意味在呢~~手动狗头 )


【强烈安利】 无意间知道了这个神仙软件 captfencoder (点击下载哦~)

里面聚合编码转换古典密码密码学其他编码实用工具!!


还是老规矩 :关于以上链接引用【侵权删】

若有错误之处,还请多多指正~~

【转载请放链接】

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。