lcg入门
先看原题代码
from libnum import *
flag = 'flag{******************}'
flag = s2n(flag)
length = flag.bit_length()
a = generate_prime(length)
b = generate_prime(length)
n = generate_prime(length)
for i in range(10):
flag = (a * flag + b) % n
print("a =", a)
print("b =", b)
print("n =", n)
print("flag =", flag)
# a = 10580362976768902535288290537881894669438793788144555901400894449594743420700735933898091469
# b = 12282491670012215371979074133375864865383435870031708675997502402287216522639028762493710827
# n = 15544810823190562032492196545115274631091651502678197172285073194125696949924554440256408651
# flag = 14208190311706700229018574851578988188134550363358366844269050987652736462089394391688795530
通过分析代码可知这个程序是将flag进行转换后通过循环取模的方式对flag加密
循环中的公式是标准的lcg(线性同余方法)的形式
X n + 1 = ( a X n + b ) m o d m X_{n+1} = (aX_n + b)\ mod\ m X