DASCTF密码第一题,bbcrypto

貌似叫这个名字。

# -*- coding:utf-8 -*-
import A,SALT
from itertools import *

def encrypt(m, a, si):
    c=""
    for i in range(len(m)):
        c+=hex(((ord(m[i])) * a + ord(next(si))) % 128)[2:].zfill(2)
    return c
if __name__ == "__main__":
    m = 'flag{********************************}'
    a = A
    salt = SALT
    assert(len(salt)==3)
    assert(salt.isalpha())
    si = cycle(salt.lower())
    print("明文内容为:")
    print(m)
    print("加密后的密文为:")
    c=encrypt(m, a, si)
    print(c)
    #加密后的密文为:
    #177401504b0125272c122743171e2c250a602e3a7c206e014a012703273a3c0160173a73753d

仿射密码,求a,b

a与128互质可得a为1-127的奇数

b为三个字母的循环,可以理解为明文中n,n+3的字母采用相同的a,b加密。

已知明文攻击

已知明文为开头为flag,f和g采用相同的a,b加密。

f-->0x17,g-->0x50

仿射加密公式(ax+b)%n=y

a*(f-g)%n=0x17-0x50-->a=57,满足与128互质。

下面求b

m='177401504b0125272c122743171e2c250a602e3a7c206e014a012703273a3c0160173a73753d'
m=bytes.fromhex(m)
x=b'flag'
y=m[:3]
a=57
b=[]
for x1,y1 in zip(x,y):
    temp=(y1-a*x1)%128
    b.append(chr(temp))
print(b)
# ['a', 'h', 'h']

根据a,b及仿射的解密公式


m='177401504b0125272c122743171e2c250a602e3a7c206e014a012703273a3c0160173a73753d'
m=bytes.fromhex(m).decode()


def decrypt(m, a, si):
    c=""
    for i in range(len(m)):
        c+=hex(pow(a,-1,128)*((ord(m[i]))  -ord(next(si))) % 128)[2:].zfill(2)
    return c
a=57
si=cycle('ahh')
y=decrypt(m,a,si)
print(bytes.fromhex(y))
# b'flag{ad7d973ffdd285b476a1a727b3a8fbc4}'

如果熟悉同余相关概念应该很简单。

用爆破找flag字符串的方式也很快。

import string,itertools
from itertools import *


def encrypt(m, a, si):
    c=""
    for i in range(len(m)):
        c+=hex(((ord(m[i])) * a + ord(next(si))) % 128)[2:].zfill(2)
    return c


comb =string.ascii_lowercase
m='177401504b0125272c122743171e2c250a602e3a7c206e014a012703273a3c0160173a73753d'
m=bytes.fromhex(m).decode()

for a in range(1,128,2):
    for i in itertools.product(comb, repeat=3):
        salt= '{}{}{}'.format(*i)
        si = cycle(salt.lower())
        res=encrypt('flag',a,si)
        if '17740150' == res:
            print('found',a,si,salt)
            break
    else:
        continue
# found 57  ahh

你可能感兴趣的:(python,ctf,crypto)