比赛中遇见的一些密码


1、曲路密码

脚本

# 曲路密码
import re


def encrypt_bend(string, col, row=10):
    ciphertext = ""
    temp = []
    for i in range(col):
        temp.append([])
    for index, i in enumerate(string):
        temp[index % col].append(i)
    re_temp = list(reversed(temp))
    for index, i in enumerate(re_temp):
        if index % 2 == 0:
            i = list(reversed(i))
        ciphertext += "".join(i)
    return ciphertext


def decrypt_bend(string, col, row=10):
    plaintext = ""
    length = len(string)
    min_row = length // col       # 最小的行数
    min_num = col - length % col  # 最小行数的列数
    # 分组
    temp = []
    index = 0
    for i in range(col):
        if i < min_num:
            temp.append(string[index:index+min_row])
            index += min_row
        else:
            temp.append(string[index:index+min_row+1])
            index += min_row + 1
    print(temp)
    # 改回列顺序
    for index, i in enumerate(temp):
        if index % 2 == 0:
            # print(re.findall(".{1}", temp[index]))
            temp[index] = "".join(list(reversed(re.findall(".{1}", temp[index]))))
    temp.reverse()
    for i in range(length):
        plaintext += temp[i % col][i // col]
    return plaintext


if __name__ == '__main__':
    col_ = 7
    row_ = 5
    ciphertext_ = encrypt_bend("i will beat you this day", col_, row_)
    plaintext_ = decrypt_bend(ciphertext_, col_, row_)
    print(f"{plaintext_} : {ciphertext_}")

2、仿射密码(Affine Cipher)

原理

仿射密码(Affine Cipher)是一种单表代换密码,字母表中的每个字母相应的值使用一个简单的数学函数映射到对应的数值,再把对应数值转换成字母。这个公式意味着每个字母加密都会返回一个相同的字母,意义着这种加密方式本质上是一种标准替代密码。因此,它具有所有替代密码的弱点。
加密函数:E(x)=(ax+b)(mod m)
a与b互质,a与m互质
m是编码系统中字符的数量(一般是26或者52)
解密函数:D(x) =a^-1(x-b)(mod m),其中a-1是a在Zm群的乘法逆元。
乘法逆元:
如果存在a,x,b满足线性同余方程ax ≡ 1(mod b)(即b除以整数ax − 1,或者换句话说,将ax除以整数b之后的余数为1),则我们称:
a关于模b的乘法逆元为x,表示为a ≡ x^-1 (mod b);
x关于模b的乘法逆元为a,表示为x ≡ a^-1 (mod b)
简单来说,求a的逆,就是找一个x,使得1 =(a∗x)(mod n) 
也可记作 a^− 1 ≡ x(mod n) 

这里所求的逆元a^-1 = gmpy2.invert(a,m)

加密脚本

c = []
a=
b=
def enc(plaintxt):
    for i in plaintxt:
        if i.islower():
            temp = ((ord(i) - 97) * a + b) % 26 + 97 
            c.append(chr(temp))
        elif i.isupper():
            temp = ((ord(i) - 65) * a + b) % 26 + 65 
            c.append(chr(temp))
        else:
            c.append(i)

遍历求a的逆元

# 遍历得到a的乘法逆元
def get_are(a):
	for i in range(1, 27):
		if a * i % 26 == 1:
			return i

解密脚本

import gmpy2
a=
b=
niyuan = gmpy2.invert(a,26)
p=[]
def dec(cipher):
    for i in cipher:
        if i.islower():
            temp = (((ord(i) - 97) - b) * niyuan) % 26 + 97
            p.append(chr(temp))
        elif i.isupper():
            temp = (((ord(i) - 65) - b) * niyuan) % 26 + 65
            p.append(chr(temp))
        else:
            p.append(i)

3、Alien’s_secret

https://uazu.net/notes/alien.html#s2

image-20221127200706901

4.怪异密码

image-20221208185239568

image-20221208185250317

5.宇宙终极问题

#(-80538738812075974)³+80435758145817515³+12602123297335631³=42
x=80538738812075974
y=80435758145817515
z=12602123297335631

6.Hill(希尔密码)

UTCTF 2020 Hill

s='wznqcaduqopfkqnwofDbzgeu'
flag_pre='utflag'
def getit(a1,b1,c1,a2,b2,c2,a3,b3,c3):
    for i in range(26):
        for j in range(26):
            if (a1 * i + b1 * j) % 26 == c1 and (a2 * i + b2 * j) % 26 == c2 and (a3 * i+b3*j) % 26 == c3:
                return (i,j)
x1=getit(22,25,20,13,16,5,2,0,0)
x2=getit(22,25,19,13,16,11,2,0,6)
import string
flag=''
for i in range(0, len(s),2):
    flag+=string.ascii_letters[(x1[0]*string.ascii_letters.index(s[i])+x1[1]*string.ascii_letters.index(s[i+1]))%26]
    flag+=string.ascii_letters[(x2[0]*string.ascii_letters.index(s[i])+x2[1]*string.ascii_letters.index(s[i+1]))%26]
print(flag)

#utflagdngeruscphertextqq

文章作者: f14g
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 f14g !
评论
  目录