合营公司密码
仿射密码是特别的密码,一对一置换~
加密函数为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 (点击下载哦~)
里面聚合编码转换古典密码密码学其他编码实用工具!!
还是老规矩 :关于以上链接引用【侵权删】
若有错误之处,还请多多指正~~
【转载请放链接】