[CISCN 2021初赛]imageencrypt

发布于:2024-05-01 ⋅ 阅读:(27) ⋅ 点赞:(0)

目录

1.题目

2.分析

3.解题

4.参考


1.题目

题目来源

chall.py:
import random
from flag import flag,image,r,key1,key2
import md5

assert(flag[:5]=='CISCN')
assert(len(str(r))==3)
data = ''.join(map(chr,image))
assert(flag[6:-1] == md5.new(data).hexdigest())
assert(key1<256)
assert(key2<256)

x0 = random.random()
x0 = round(x0,6)

def generate(x):
    return round(r*x*(3-x),6)


def encrypt(pixel,key1,key2,x0,m,n):
    num = m*n/8    
    seqs = []
    x = x0
    bins = ''
    tmp = []
    for i in range(num):
        x = generate(x)
        tmp.append(x)
        seqs.append(int(x*22000))
    for x in seqs:
        bin_x  = bin(x)[2:]
        if len(bin_x) < 16:
            bin_x = '0'*(16-len(bin_x))+bin_x
        bins += bin_x
    assert(len(pixel) == m*n)
    cipher = [ 0 for i in range(m) for j in range(n)]
    for i in range(m):
        for j in range(n):
            index = n*i+j
            ch = int(bins[2*index:2*index+2],2)
            pix = pixel[index]
            if ch == 0:
                pix = (pix^key1)&0xff
            if ch == 1:
                pix = (~pix^key1)&0xff
            if ch == 2:
                pix = (pix^key2)&0xff
            if ch == 3:
                pix = (~pix^key2)&0xff
            cipher[index] = pix 
    return cipher

flagimage = image
testimage = []
for i in range(16*16):
    testimage.append(random.randint(0,255))
print testimage
print encrypt(testimage,key1,key2,x0,16,16)
print encrypt(flagimage,key1,key2,x0,24,16)



out:

[205, 237, 6, 158, 24, 119, 213, 32, 74, 151, 142, 186, 57, 28, 113, 62, 165, 20, 190, 37, 159, 137, 196, 44, 97, 37, 7, 222, 220, 95, 4, 66, 0, 28, 199, 142, 95, 105, 119, 232, 250, 215, 60, 162, 91, 211, 63, 30, 91, 108, 217, 206, 80, 193, 230, 42, 221, 71, 136, 115, 22, 176, 91, 57, 61, 3, 87, 73, 250, 121, 51, 72, 83, 120, 77, 199, 236, 190, 249, 116, 45, 6, 134, 110, 149, 94, 214, 232, 153, 213, 119, 98, 81, 203, 240, 114, 240, 29, 122, 188, 156, 53, 128, 185, 40, 147, 245, 204, 47, 101, 80, 229, 41, 150, 28, 195, 25, 235, 119, 6, 192, 8, 73, 255, 159, 172, 77, 94, 254, 104, 236, 219, 141, 91, 195, 162, 97, 56, 252, 173, 163, 43, 167, 214, 50, 73, 115, 190, 254, 53, 61, 77, 138, 192, 15, 4, 190, 27, 37, 108, 101, 135, 90, 215, 106, 243, 112, 111, 106, 89, 143, 150, 185, 142, 192, 176, 48, 138, 164, 185, 61, 77, 72, 0, 17, 203, 210, 71, 186, 49, 162, 250, 218, 219, 195, 63, 248, 220, 155, 180, 219, 132, 219, 94, 144, 247, 211, 95, 70, 227, 222, 31, 69, 24, 13, 216, 185, 108, 137, 57, 186, 211, 55, 27, 158, 241, 223, 21, 134, 106, 152, 127, 187, 245, 246, 131, 176, 177, 228, 100, 112, 11, 84, 61, 193, 42, 41, 69, 229, 145, 254, 138, 3, 153, 123, 31]
[131, 92, 72, 47, 177, 57, 131, 118, 4, 38, 192, 19, 119, 82, 63, 143, 235, 165, 15, 140, 209, 223, 117, 133, 47, 148, 81, 144, 138, 246, 173, 235, 177, 181, 110, 39, 9, 192, 57, 166, 180, 153, 141, 19, 234, 157, 142, 80, 234, 197, 151, 152, 249, 143, 176, 155, 147, 17, 57, 194, 191, 254, 13, 144, 140, 85, 25, 248, 172, 208, 154, 249, 5, 201, 27, 137, 69, 23, 175, 34, 156, 72, 208, 32, 195, 16, 127, 65, 207, 131, 57, 203, 7, 98, 89, 36, 65, 75, 211, 21, 45, 132, 214, 239, 102, 58, 68, 130, 97, 204, 225, 76, 152, 216, 74, 149, 79, 165, 198, 72, 150, 94, 7, 177, 46, 226, 252, 247, 79, 62, 69, 106, 60, 21, 106, 236, 47, 145, 170, 28, 18, 101, 14, 152, 131, 7, 37, 15, 168, 99, 115, 27, 220, 150, 89, 82, 232, 170, 107, 221, 212, 46, 235, 129, 36, 66, 217, 222, 36, 15, 217, 192, 247, 192, 113, 230, 129, 196, 13, 247, 148, 228, 225, 86, 71, 133, 132, 238, 236, 127, 11, 83, 107, 141, 114, 150, 182, 146, 213, 250, 141, 53, 114, 16, 198, 70, 133, 17, 247, 173, 136, 73, 236, 78, 188, 150, 239, 58, 199, 136, 11, 122, 134, 77, 47, 167, 137, 188, 55, 195, 41, 49, 245, 92, 160, 213, 254, 0, 85, 205, 193, 69, 2, 140, 143, 155, 127, 236, 179, 199, 168, 35, 85, 40, 45, 174]
[198, 143, 247, 3, 152, 139, 131, 84, 181, 180, 252, 177, 192, 25, 217, 179, 136, 107, 190, 62, 4, 6, 90, 53, 105, 238, 117, 44, 5, 116, 132, 195, 214, 171, 113, 209, 18, 31, 194, 174, 228, 212, 196, 14, 27, 41, 211, 56, 139, 135, 225, 214, 89, 122, 178, 212, 185, 231, 204, 150, 204, 212, 160, 142, 213, 173, 186, 166, 65, 238, 5, 32, 45, 31, 25, 189, 148, 38, 78, 79, 33, 56, 227, 48, 103, 163, 31, 189, 37, 124, 106, 249, 86, 188, 86, 233, 41, 250, 89, 7, 212, 234, 111, 104, 245, 102, 227, 96, 160, 67, 181, 13, 26, 192, 214, 210, 188, 84, 216, 215, 243, 72, 233, 2, 122, 166, 107, 251, 70, 128, 94, 190, 185, 210, 34, 85, 77, 29, 182, 77, 115, 208, 228, 252, 73, 198, 151, 70, 10, 97, 138, 235, 21, 117, 239, 102, 129, 2, 253, 80, 53, 61, 184, 220, 41, 82, 37, 140, 23, 143, 179, 53, 153, 113, 213, 211, 111, 197, 248, 65, 60, 69, 1, 81, 48, 254, 251, 89, 195, 8, 93, 190, 66, 174, 97, 175, 210, 191, 66, 112, 123, 128, 33, 230, 237, 104, 16, 192, 239, 173, 44, 10, 120, 231, 114, 151, 140, 63, 103, 44, 243, 222, 242, 73, 51, 46, 98, 137, 163, 152, 147, 95, 223, 3, 15, 112, 85, 215, 133, 131, 240, 239, 224, 195, 140, 124, 70, 156, 221, 241, 37, 245, 1, 99, 9, 157, 99, 150, 47, 118, 225, 16, 13, 141, 135, 99, 18, 119, 63, 160, 6, 247, 27, 68, 45, 199, 86, 193, 252, 21, 135, 32, 42, 103, 114, 241, 49, 249, 182, 52, 18, 155, 157, 61, 4, 246, 158, 52, 118, 242, 195, 54, 139, 232, 100, 31, 11, 233, 58, 100, 101, 137, 83, 145, 209, 7, 241, 96, 57, 148, 207, 29, 237, 124, 177, 166, 161, 20, 116, 122, 61, 71, 46, 82, 18, 157, 253, 130, 112, 66, 94, 57, 221, 243, 222, 192, 147, 5, 130, 201, 174, 26, 160, 16, 188, 103, 187, 11, 238, 182, 144, 4, 137, 33, 84, 100, 7, 239, 219, 83, 112, 189, 166, 58, 93, 141, 30, 198, 220, 196, 118, 172, 5, 45]

2.分析

需要求解出:

r,key1,key2,x0

分析r:

import random

assert(len(str(r))==3)

def generate(x):
    return round(r*x*(3-x),6)

这个函数的返回值应该是收敛在一个合适的范围内的,所以r的值不会太大,相应的r的值也不会太小,又根据断言那句,我们大概知道r的范围在(0.1~9.9)之间,我们进行简单爆破:

import random

t = float('inf')
t = -t
r = 0
for i in range(1, 100):
    r = round(r+0.1, 6)
    x0 = random.random()
    x0 = round(x0,6)
    for j in range(100):
        x0 = generate(x0)
    if(x0 == t or x0 * 22000 < 1 or x0 * 22000 > 65536):
        print(r, "  no")
    else:
        print(r, "  yes")

最终得到r的初步范围应该是:0.4~1.3

分析key1,key2:

cipher = [ 0 for i in range(m) for j in range(n)]
    for i in range(m):
        for j in range(n):
            index = n*i+j
            ch = int(bins[2*index:2*index+2],2)
            pix = pixel[index]
            if ch == 0:
                pix = (pix^key1)&0xff
            if ch == 1:
                pix = (~pix^key1)&0xff
            if ch == 2:
                pix = (pix^key2)&0xff
            if ch == 3:
                pix = (~pix^key2)&0xff
            cipher[index] = pix 
    return cipher

这几行代码说明在进行加密时只是进行了异或加密,所以将密文和明文进行异或就能够得到key1和key2,但是里面又有先取反再异或,所以应该是会有四种值:

for i in range(len(a)):
    print((a[i] ^ b[i])&0xff) 

#得到的四种值为:78, 86, 169, 177

然后我们注意到78和177,86和169应该各自分为一组,因为x^y和~x^y的结果相加等于255

然后我们进一步尝试获取所有可能的key组合:


from itertools import product
k1 = [78, 177]
k2 = [86 ,169]

s = []
for i in product(k1, k2):
    s.append(i)

for i in product(k2, k1):
    s.append(i)

print(s)
#[(78, 86), (78, 169), (177, 86), (177, 169), (86, 78), (86, 177), (169, 78), (169, 177)]

3.解题

接下来开始进行正式解题:

1.尝试所有的key组合,得到可能的bins序列

s = [(78, 86), (78, 169), (177, 86), (177, 169), (86, 78), (86, 177), (169, 78), (169, 177)] 
bins_ = []
for i in s:
    print(i)
    k1, k2 = i[0],i[1]
    k1_, k2_ = 255-k1, 255 - k2
    bins = ''
    for j in range(len(a)):
        t = a[j]^b[j]
        if(t == k1):
            bins+='00'
        elif t == k1_:
            bins += '01'
        elif t == k2:
            bins += '10'
        else:
            bins += '11'
    bins_.append(bins)

print(bins_)

#['00010001110010100001001100000001000101110010011100011000101111110111111110110000000001010100010001110010110010010010010111001011011000011011110110011000111110100100100010001111101000111011111001101111010110100011010000110111010010101000010010100000010001110110110101001100001110010100110001001001101000101010101010010001011101100001110100101010000001100100110011111110100010111000111101100111000000001001110010011000010010101110010010100001011101100110101101110100001110100001011101001001000110111010101110011001', '00010001100011110001001000000001000101100011011000011100111010100110101011100000000001010100010001100011100011010011010110001110011100011110100111011100101011110100110011001010111100101110101101111010010111110010010000100110010011111100010011110000010001100111100101001000001011010100100001001101111100111111111111010001011001110001100100111111000001110100100010101011110011101100101001110110000000001101100011011100010011111011010011110001011001110111111001100100001011110001011001001101000111101111111011011101', '01000100110110100100011101010100010000110110001101001001101111110011111110110101010100000001000100110110110110000110000011011011001001001011110010001001111110100001100110011111101001111011111000101111000010100111000101110011000110101001000110100101000100110010110000011101011110000001110100011000101001101010101010000100001100100100110001101010010100100001110111111110100110111001111100100011010101011000110110001001000110101110000110100100001100100010101100110001011110100100001100011000010010111010101110001000', '01000100100111110100011001010100010000100111001001001101111010100010101011100101010100000001000100100111100111000111000010011110001101001110100011001101101011110001110111011010111101101110101100111010000011110110000101100010000111111101000111110101000100100011100000011001011011000001100100011100111101111111111111000100001000110100100001111111010100110001100110101011110111101101101000110010010101011100100111001101000111111011000111110100001000110011111000100001011011110100001000011100010011101111111011001100', '10111011011000001011100110101011101111011000110110110010000101011101010100011010101011111110111011011000011000111000111101100001110010110001011100110010010100001110001000100101000010010001010011000101111100001001111010011101111000000010111000001010111011011100011111100110100100111110011011100011000010000000000000111011110111001011011110000000101011001110011001010100001000010010010111001101101010100011011000110010111000000100111000001011110111001100000111011110100100001011110111100011101100010000000100110011', '11101110011100001110110111111110111010011100100111100011000101011001010100011111111110101011101110011100011100101100101001110001100011100001011000100011010100001011001100110101000011010001010010000101101000001101101111011001101100000011101100001111101110011000011010110111110100101011011110110010000011000000000000101110100110001110011011000000111110001011011101010100001100010011010110001001111111110010011100100011101100000100101100001110100110001000000110011011110100001110100110110010111000010000000100100010', '10111011001001011011100010101011101111001001110010110110010000001100000001001010101011111110111011001001001001111001111100100100110110110100001101110110000001011110011001100000010110000100000111010000111101011000111010001100111001010110111001011010111011001101001111100010100001111110001011100111010110010101010101111011110011011011001110010101101011011110001000000001011001000110000011011100101010100111001001110110111001010001111001011011110011011101010011001110100001011011110011100111101101000101010001110111', '11101110001101011110110011111110111010001101100011100111010000001000000001001111111110101011101110001101001101101101101000110100100111100100001001100111000001011011011101110000010111000100000110010000101001011100101111001000101101010111101101011111101110001001001010110011110001101011001110110110010111010101010101101110100010011110001011010101111110011011001100000001011101000111000010011000111111110110001101100111101101010001101101011110100010011001010010001011110001011110100010110110111001000101010001100110']

2.得到所有的整数nums_

nums_ = []

for i in bins_:
    nums = []
    for j in range(0, len(i), 16):
        nums.append(int(i[j:j+16], 2))
    nums_.append(nums)
    print(nums)

#[4554, 4865, 5927, 6335, 32688, 1348, 29385, 9675, 25021, 39162, 18575, 41918, 28506, 13367, 19076, 41031, 27980, 14668, 18850, 43665, 30237, 10758, 19710, 35727, 26368, 40088, 19172, 41334, 27508, 14871, 18715, 43929]
#[4495, 4609, 5686, 7402, 27360, 1348, 25485, 13710, 29161, 56495, 19658, 62187, 31327, 9254, 20420, 61510, 31048, 11592, 19955, 65489, 26393, 16135, 18603, 52938, 30208, 55516, 20404, 61799, 32356, 12054, 19742, 65245]
#[17626, 18260, 17251, 18879, 16309, 20497, 14040, 24795, 9404, 35322, 6559, 42942, 12042, 29043, 6801, 42259, 11293, 30749, 6310, 43652, 12876, 27218, 7678, 39839, 9045, 36233, 6881, 42034, 11057, 31299, 6219, 43912]
#[17567, 18004, 17010, 19946, 10981, 20497, 10140, 28830, 13544, 52655, 7642, 63211, 14863, 24930, 8145, 62738, 14361, 27673, 7415, 65476, 9032, 32595, 6571, 57050, 12885, 51661, 8113, 62499, 15905, 28482, 7246, 65228]
#[47968, 47531, 48525, 45589, 54554, 45038, 55395, 36705, 51991, 12880, 57893, 2324, 50672, 40605, 57390, 2797, 51174, 37862, 58120, 59, 56503, 32940, 58964, 8485, 52650, 13874, 57422, 3036, 49630, 37053, 58289, 307]
#[61040, 60926, 59849, 58133, 38175, 64187, 40050, 51825, 36374, 9040, 45877, 3348, 34208, 56281, 45115, 4025, 34487, 53943, 45580, 46, 39142, 49400, 46932, 12597, 35327, 10019, 45131, 3736, 33179, 53481, 45793, 290]
#[47909, 47275, 48284, 46656, 49226, 45038, 51495, 40740, 56131, 30213, 58976, 22593, 53493, 36492, 58734, 23276, 54242, 34786, 59225, 21883, 52659, 38317, 57857, 25696, 56490, 29302, 58654, 23501, 54478, 34236, 59316, 21623]
#[60981, 60670, 59608, 59200, 32847, 64187, 36150, 55860, 40514, 26373, 46960, 23617, 37029, 52168, 46459, 24504, 37555, 50867, 46685, 21870, 35298, 54777, 45825, 29808, 39167, 25447, 46363, 24201, 38027, 50664, 46820, 21606]

3.把bins_序列转化为x的数组:

seqs_ = []
for i in bins_:
    seqs = []
    for j in range(0, len(i), 16):
        t = int(i[j:j+16], 2)
        seqs.append(round(t / 22000, 6))
    seqs_.append(seqs)

print(len(seqs_))

4.根据得到的x数组,寻找符合预期的序列:

ps = []
for i in seqs_:
    p = []
    for j in range(1, len(i)):
        p.append(i[j] / (3 - i[j-1])/i[j - 1])
    ps.append(p)
    print(p, '\n')

'''
[0.38248831187700094, 0.4384149524926448, 0.3914315879093941, 1.902585138376287, 0.027234878989934888, 7.41779258981588, 0.19782864603919587, 1.0101244356659462, 0.8402752543535491, 0.3888090886585403, 1.0468566397546573, 0.6212491767256544, 0.27514312141709846, 0.5965102610922789, 1.0084452152241943, 0.600837471496798, 0.3033427350247632, 0.5507759689851457, 1.0808444794693974, 0.6820904794057798, 0.21886765388181217, 0.7296394840208197, 0.8614807403355565, 0.5363492987759609, 0.8439446992474398, 0.4060458037243463, 1.012877468039914, 0.5935750422520809, 0.30898231138662763, 0.5415080605607077, 1.0920958991714405]
[0.36676647245254934, 0.442098339960974, 0.474839314670701, 1.3877340999789858, 0.02805183865782334, 6.43329602119069, 0.2921189922838395, 0.8948884515880595, 1.156971137952641, 0.8053785088631983, 1.501786993145552, 2.906535573116763, 0.18743105964823292, 0.8554882894509734, 1.4539125594613418, 2.47322795740419, 0.23500402872906936, 0.6960703261823065, 1.5680394810591805, 17.351111672743027, 0.33957121505862625, 0.5086756595646945, 1.3208587922762869, 0.9610978891779333, 1.1296215848099933, 0.7712467823773763, 1.4613756971986949, 2.741841429457357, 0.24360788874559902, 0.6679187344478515, 1.5717803052755617]
[0.47114829662008284, 0.4353650546888014, 0.49388021311585023, 0.4033262908168713, 0.5564268376661726, 0.3311765168520589, 0.7477394217649568, 0.20249849589840027, 1.4600546124750242, 0.13316418459072493, 2.423157601354087, 0.2675578345159534, 0.9833527694495706, 0.13939807794390818, 2.3091666979830916, 0.24763595154679877, 1.0949685059834704, 0.1280705632375598, 2.549741632403642, 0.29037624169695153, 0.8754010536924499, 0.16002371844036145, 1.957269733322237, 0.19092734968623554, 1.547344410355415, 0.14035738941503614, 2.273235063828749, 0.24147030561869398, 1.133452845234755, 0.1259711398602659, 2.598495182437728]
[0.4655356092241428, 0.43306484171321036, 0.5265825964789305, 0.26299117981320075, 0.7463778384583415, 0.2391829246292838, 1.1197695605450175, 0.27805591115113015, 1.630498321119462, 0.2392610063041776, 3.118225167135753, 1.8547575550198925, 0.7216111973785467, 0.17501144104516672, 2.929015011456209, 1.5438039955344187, 0.8209494434978462, 0.1538055991343328, 3.3159484421547227, 5.791565742846807, 1.3936675746385567, 0.132767552784906, 3.2140174855025334, 0.5551734875619014, 1.660671483262913, 0.24094763806872985, 2.9277433961514574, 1.5991617181103526, 0.7864385615983944, 0.14918025948106867, 3.370703415147666]
[1.2089385954026606, 1.216096190205899, 1.1827692492476078, 1.289807248289577, 1.586796723845671, 1.2908671737464006, 1.3745703669236995, 1.0637316093948161, 0.3890482257674857, 1.8615493382391162, 0.10893591393901923, 7.533214278839049, 1.1501349986431186, 1.2244220406302078, 0.12453005669867795, 6.368587064312309, 1.0978750435934876, 1.200194079573534, 0.0028343411461208587, 319.4899491450353, 1.350480312912445, 1.1911959370502803, 0.44994785040202556, 2.3734929388369497, 0.43425474889273513, 1.746807728398757, 0.13560015233881562, 5.711798276263685, 1.003351251622518, 1.1955901495689358, 0.015027194052440124]
[4.427192418875688, 4.259190482111271, 3.474102674180797, 1.8364101183789414, 1.3293995521822748, 7.571481982721823, 1.097039339248537, 1.0893101479254144, 0.18455548458650856, 1.9601049406206215, 0.07978492896114084, 3.58781019191708, 1.1385153875272385, 1.8145129485826177, 0.09397974188169095, 3.041548135460992, 1.0919749933417118, 1.5417817000765388, 0.0010873498249884617, 283.8232033794828, 1.0337917353180819, 1.2590904650770678, 0.3096818516206696, 1.155305061308034, 0.2034154655497102, 1.7702420825089629, 0.08726748607298924, 3.137923998559087, 1.0804562312247448, 1.5047102658136922, 0.006894864432251824]
[1.1999818353741436, 1.1999761552822477, 1.1999443945337438, 1.199950345972579, 1.1999701953375392, 1.19998552713574, 1.1999439302513892, 1.1999718214785804, 1.1998873453417698, 1.1999932831800277, 1.1998767335341765, 1.2000127756721022, 1.199969398999608, 1.1999820715289913, 1.1999019045429904, 1.1999911419833003, 1.1999351733410353, 1.1999793263550171, 1.1998160961536133, 1.2000032774354457, 1.1999227350744135, 1.1999800268047502, 1.1999087639870654, 1.1999980371777235, 1.1999622831445278, 1.1999984251738407, 1.1999425591582278, 1.199993461936535, 1.1999327350076314, 1.1999865146593065, 1.1998604069542362]
[4.360994415282484, 4.055324899071274, 3.4182487428913793, 1.7950953693213743, 1.296734989198807, 6.834183161535337, 1.1388617339341558, 1.5735801957136066, 0.5619212405244304, 0.9885528985828675, 0.581101829194464, 0.8138570819488585, 1.069846381299869, 1.4164575562432369, 0.5938038766990997, 0.8125444752431089, 1.047574687204347, 1.3342543663964737, 0.5335796970623088, 0.8046187933729642, 1.1119985984889453, 1.6399034861964656, 0.7093157327714807, 0.7987254612452666, 0.5326841565029208, 0.9884042159824045, 0.5848023611390234, 0.8270192483166385, 1.0478304831756389, 1.3256916257627371, 0.5293185742765095]
'''

明显第7组的数据比较接近,大约都为1.2,所以得到r的准确值1.2,对应s中第7组的key,故

key1 = 169, key2 = 78

r = 1.2
key1 = 169
key2 = 78

5.找到初始值x0

t = 0
for  i in range(1000000):
    t = round(i / 1000000, 6)
    tmp=[]
    for j in range(len(nums)):
        t = generate(t)
        tmp.append(int(t*22000))
    flag = True
    for j in range(len(nums)):
        if(tmp[j] != nums[j]):
            flag = False
            break
    if(flag):
        print(i)

#840264

这一步不知道是怎么一会事,总是会有问题,就决定按照原本加密的过程,完整的弄了一遍,不然总是会有一些问题,丢失了一定的精度导致找不到数

得到:

x0 = 0.840264

6.剩下的其实利用原本的加密程序就可以进行解密了:

x0=0.840264
r=1.20
key1 = 169
key2 = 78
def decrypt(pixel,key1,key2,x0,m,n):
    num = int(m*n//8)
    seqs = []
    x = x0
    bins = ''
    tmp = []
    for i in range(num):
        x = generate(x)
        tmp.append(x)
        seqs.append(int(x*22000))
    for x in seqs:
        bin_x  = bin(x)[2:]
        if len(bin_x) < 16:
            bin_x = '0'*(16-len(bin_x))+bin_x
        bins += bin_x
    assert(len(pixel) == m*n)
    cipher = [ 0 for i in range(m) for j in range(n)]
    for i in range(m):
        for j in range(n):
            index = n*i+j
            ch = int(bins[2*index:2*index+2],2)
            pix = pixel[index]
            if ch == 0:
                pix = (pix^key1)&0xff
            if ch == 1:
                pix = (~pix^key1)&0xff
            if ch == 2:
                pix = (pix^key2)&0xff
            if ch == 3:
                pix = (~pix^key2)&0xff
            cipher[index] = pix
    return cipher

image = decrypt(c,key1,key2,x0,24,16)

#[136, 62, 185, 178, 49, 197, 213, 2, 251, 5, 178, 24, 142, 87, 151, 2, 198, 218, 15, 151, 74, 80, 235, 156, 39, 95, 35, 98, 83, 221, 45, 106, 103, 2, 216, 120, 68, 182, 140, 224, 170, 154, 117, 191, 170, 103, 98, 118, 58, 46, 175, 128, 240, 52, 228, 101, 247, 177, 125, 39, 101, 154, 246, 39, 100, 251, 244, 23, 23, 71, 172, 145, 123, 174, 79, 243, 61, 143, 24, 25, 144, 118, 181, 126, 49, 237, 182, 20, 115, 42, 36, 80, 0, 21, 255, 191, 152, 172, 240, 174, 101, 91, 57, 62, 187, 207, 82, 46, 238, 234, 4, 164, 171, 142, 128, 132, 234, 26, 105, 153, 165, 30, 167, 76, 203, 232, 218, 82, 247, 214, 247, 15, 8, 156, 139, 27, 3, 180, 224, 252, 194, 158, 77, 178, 248, 136, 193, 247, 92, 55, 196, 189, 67, 35, 185, 48, 215, 179, 179, 225, 132, 148, 9, 138, 103, 227, 140, 61, 89, 217, 229, 99, 215, 63, 100, 133, 222, 139, 81, 15, 149, 236, 168, 7, 102, 176, 173, 240, 149, 70, 244, 23, 243, 248, 208, 6, 156, 241, 12, 62, 45, 49, 136, 168, 187, 217, 70, 142, 94, 227, 122, 92, 209, 177, 195, 217, 218, 105, 41, 157, 66, 119, 67, 31, 130, 120, 52, 32, 18, 49, 34, 17, 145, 170, 89, 38, 27, 102, 52, 42, 65, 161, 182, 114, 194, 205, 16, 53, 139, 167, 115, 92, 87, 210, 95, 44, 210, 63, 158, 223, 183, 161, 91, 36, 201, 53, 92, 222, 105, 246, 80, 94, 170, 10, 132, 110, 0, 151, 77, 91, 209, 110, 100, 206, 195, 88, 103, 183, 7, 98, 163, 42, 44, 115, 82, 184, 200, 122, 56, 188, 106, 159, 221, 166, 213, 81, 162, 64, 116, 213, 43, 32, 5, 223, 135, 182, 64, 54, 111, 218, 126, 75, 92, 205, 231, 15, 8, 66, 34, 52, 115, 246, 96, 227, 92, 211, 76, 204, 217, 20, 239, 144, 139, 90, 136, 142, 197, 83, 43, 96, 248, 76, 17, 70, 13, 49, 18, 69, 95, 31, 198, 181, 32, 119, 253, 42, 73, 70, 106, 29, 38, 20, 232, 108, 244, 219, 72, 144, 109, 146, 32, 250, 83, 99]

7.将得到的信息转化为flag:

flag = "NSSCTF{" + hashlib.md5(''.join(map(chr,image)).encode()).hexdigest() +"}"
#NSSCTF{5813da1f5edefadf8b7046abbf415ee7}

其实这样子得到的结果是错的,因为源码是使用python2中的库进行加密,我是用的python3进行解密的所以得到后多次提交也没有通过,查询后知道了应该修改为(即是指定编码格式):

flag = "NSSCTF{" + hashlib.md5(''.join(map(chr,image)).encode("latin1")).hexdigest() +"}"
#NSSCTF{7fa176002ced947e49f1752c1eb9dd62}

4.参考

关于python2和python3版本编码的差异

文章1


网站公告

今日签到

点亮在社区的每一天
去签到