(线性同余生成器)
# LCG参数
a = 1664525
c = 1013904223
m = 2**32 # 妙蛙种子
seed = ......... # 生成伪随机数
def lcg(seed, n):
numbers = []
for _ in range(n):
seed = (a * seed + c) % m
numbers.append(seed)
return numbers # 给你5个伪随机数
random_numbers = lcg(seed, 5)
print(random_numbers)
#[3771924608, 3319331295, 583630258, 2401321321, 611326900]
简单分析一下:
我们需要通过输出的5组数据来倒推出seed(伪随机数)
LCG 的生成公式如下:
Xi+1=(a⋅Xi+c)modm
其中:
a
是乘数。c
是增量。m
是模数(这里为 2322^{32}232)。X_i
是当前生成的随机数。X_{i+1}
是下一个生成的随机数。如果我们已知 X_i 和 X_{i+1},可以通过逆运算推导 X_i 的值,进一步还原最初的种子。
由 LCG 公式可以得到:
Xi=(Xi+1−c)⋅a−1modm
其中:
a^{-1}
是 a
在模 m
下的乘法逆元。X_i
是通过 X_{i+1}
逆向计算得到的前一个数,从而还原出种子。def recover_seed(x0, x1):
a = 1664525
c = 1013904223
m = 2**32 # 计算a的逆元
a_inv = pow(a, -1, m) # 计算种子
seed = (x0 - c) * a_inv % m
return seed # 假设已知的随机数
x0 = 3771924608
x1 = 3319331295
x2 = 583630258
x3 = 2401321321
x4 = 611326900
seed = recover_seed(x0, x1)
print(seed) # 输出恢复的种子
def xor_encrypt_decrypt(data, key):
key_bytes = key.to_bytes((key.bit_length() + 7) // 8, 'big')
key_length = len(key_bytes)
result = bytearray()
for i in range(len(data)):
result.append(data[i] ^ key_bytes[i % key_length])
return bytes(result)
flag = "NSSCTF{........................................}"
flag_bytes = flag.encode('utf-8')
# 使用妙蛙种子进行加密,如果你没有妙蛙种子,请先去克莱伯那里拿妙蛙种子
key = seed
encrypted_bytes = xor_encrypt_decrypt(flag_bytes, key)
# 输出加密后的字节和字符串
print("Encrypted Bytes:", encrypted_bytes)
#Encrypted Bytes: b"n2!&t'\t\x06A\x14\x01\x00\x00\x16\x17EA\x13\x17ET\t\x17EC\x0e\x1e\nR\x12R\x0cNA\x06\rEA\x16\x04R\n\x0f"
同样,来简单分析一下:
这段代码实现了一个基于 XOR(异或)操作的加密和解密函数。它的工作原理是使用一个整数作为密钥,将密钥转换为字节后,通过逐字节的异或操作对数据进行加密或解密。
def xor_encrypt_decrypt(data, key):
key_bytes = key.to_bytes((key.bit_length() + 7) // 8, 'big')
key_length = len(key_bytes)
result = bytearray()
for i in range(len(data)):
result.append(data[i] ^ key_bytes[i % key_length])
return bytes(result)
ok了,理论结束,开始实践:
def xor_encrypt_decrypt(data, key):
key_bytes = key.to_bytes((key.bit_length() + 7) // 8, 'big')
key_length = len(key_bytes)
result = bytearray()
for i in range(len(data)):
result.append(data[i] ^ key_bytes[i % key_length])
return bytes(result)
encrypted_bytes = b"n2!&t'\t\x06A\x14\x01\x00\x00\x16\x17EA\x13\x17ET\t\x17EC\x0e\x1e\nR\x12R\x0cNA\x06\rEA\x16\x04R\n\x0f"
key = 543257189
decrypted_bytes = xor_encrypt_decrypt(encrypted_bytes, key)
decrypted_flag = decrypted_bytes.decode('utf-8')
print("Decrypted Flag:", decrypted_flag)
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。