from Crypto.Util.number import * from gmpy2 import *
defgongmogongji(n, c1, c2, e1, e2): defegcd(a, b): if b == 0: return a, 0 else: x, y = egcd(b, a % b) return y, x - (a // b) * y s = egcd(e1, e2) s1 = s[0] s2 = s[1]
# 求模反元素 if s1 < 0: s1 = - s1 c1 = invert(c1, n) elif s2 < 0: s2 = - s2 c2 = invert(c2, n) m = pow(c1, s1, n) * pow(c2, s2, n) % n return m
b' \nO wild West Wind, thou breath of Autum' b"n's being,\nThou, from whose unseen presence the leaves dead\nAre driven, like ghosts from an enchanter fleeing,\nYellow, a" b'nd black, and pale, and hectic red,\nPestilence-stricken multitudes: O thou,\nWho chariotest to their dark wintry bed\n'
from Crypto.Util.number import * from hashlib import *
defgenerate(x,r): returnround(r*x*(3-x), 6)
defget_r(data): for i inrange(len(data)-1): r = round(data[i] / round((data[i+1]*(3-data[i+1])),6),1) print("r:",r) # for i in range(len(data)-1): # print(i,generate(data[i],r),data[i+1],(generate(data[i],r)-data[i+1]))
defencrypt(pixel,key1,key2,x0,m,n): num = m*n//8 seqs = [] x = x0 bins = '' tmp = [] for i inrange(num): x = generate(x,1.2) tmp.append(x) seqs.append(int(x*22000)) for x in seqs: bin_x = bin(x)[2:] iflen(bin_x) < 16: bin_x = '0'*(16-len(bin_x))+bin_x bins += bin_x # bins相当于密钥序列 assert(len(pixel) == m*n) cipher = [ 0for i inrange(m) for j inrange(n)] for i inrange(m): for j inrange(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
defget_nums(): out = [] for i inrange(16*16): out.append((testimage[i]^testimage_enc[i])&0xff) print(out)
for bin_x in bins_l: x_list = [] for i inrange(len(bin_x) // 16): #print(i) # print(bin_x[i * 16:i * 16 + 16]) x = int(bin_x[i * 16:i * 16 + 16], 2) data = round(x / 22000, 6) if (int(data * 22000) == x): x_list.append(data) elif (int(round(data - 0.000001, 6) * 22000) == x): data = round(data - 0.000001, 6) x_list.append(data) elif (int(round(data + 0.000001, 6) * 22000) == x): data = round(data + 0.000001, 6) x_list.append(data) else: print("ERROR") exit(0) assertint(x_list[i] * 22000) == x print(x_list) get_r(x_list) print(keys_l[bins_l.index(bin_x)])
# 爆破初始x0,10^6次可以接受 key1, key2, r = 169, 78, 1.2 bin_s = "10111011001001011011100010101011101111001001110010110110010000001100000001001010101011111110111011001001001001111001111100100100110110110100001101110110000001011110011001100000010110000100000111010000111101011000111010001100111001010110111001011010111011001101001111100010100001111110001011100111010110010101010101111011110011011011001110010101101011011110001000000001011001000110000011011100101010100111001001110110111001010001111001011011110011011101010011001110100001011011110011100111101101000101010001110111" SEQS = [int(bin_s[i*16:i*16+16], 2) for i inrange(len(bin_s)//16)] print(SEQS) for x0 inrange(1000000): x = x0/1000000 seqs = [] for i inrange(16*16//8): x = generate(x, r) seqs.append(int(x*22000)) if SEQS==seqs: print(x0/1000000) break
# 这里需要用python2的md5...不管他了 x0 = 0.840264 flag = encrypt(flag_enc,key1, key2,x0,24,16) flag_bytes = "" for i in flag: flag_bytes+=chr(i) print(md5(flag_bytes.encode("utf-8")).hexdigest())