题目代码:
- # 导入所需的库和从secret模块加载"flag"
- from secret import flag
- from os import urandom
- from pwn import xor
- from Cryptodome.Util.number import *
-
- # 生成两个随机的 64 位素数,分别存储在变量 k1 和 k2 中
- k1 = getPrime(64)
- k2 = getPrime(64)
-
- # 定义常量 ROUND,它的值为 12
- ROUND = 12
-
- # 使用 XOR 操作,将 "flag" 和 k1 的二进制表示进行异或运算,生成密文
- ciphertext = xor(flag, long_to_bytes(k1))
-
- # 定义一个左循环移位函数 round_rotate_left,用于在后续的加密中进行位操作
- def round_rotate_left(num, step):
- return ((num) << step | num >> (64 - step)) & 0xffffffffffffffff
- # 定义一个加密函数 encrypt_key,用于对密钥 k1 进行一系列的操作
- def encrypt_key(key):
- for _ in range(ROUND):
- # 将密钥 key 左循环移位 3 位,并与 k2 进行按位异或操作
- key = round_rotate_left(key, 3) ^ k2
- return key
-
- # 打印输出密文、经过加密的 k1,以及 k2 的值
- print('ciphertext =', ciphertext)
- print('enc_k1 =', encrypt_key(k1))
- print('k2 =', k2)
这是一个简单的类似lfsr的循环补位 直接逆着rotate_right即可
exp:
- # 导入所需的库
- from pwn import xor
- from Crypto.Util.number import *
-
- # 给出的密文
- ciphertext = b'\x8dSyy\xd2\xce\xe2\xd2\x98\x0fth\x9a\xc6\x8e\xbc\xde`zl\xc0\x85\xe0\xe4\xdfQlc'
-
- # 给出的经过加密的 k1 和 k2 的值
- enc_k1 = 7318833940520128665
- k2 = 9982833494309156947
-
- # 定义一个右循环移位函数 round_rotate_right,用于在后续的解密中进行位操作
- def round_rotate_right(num, step):
- return ((num) >> step | num << (64 - step)) & 0xffffffffffffffff
- # 迭代 12 次来解密密文
- for _ in range(12):
- # 对 enc_k1 进行反向位操作,首先是异或操作
- enc_k1 ^= k2
- # 然后进行右循环移位 3 位
- enc_k1 = round_rotate_right(enc_k1, 3)
-
- # 最终,对解密后的 enc_k1 和密文进行异或操作,还原原始的 "flag"
- original_flag = xor(long_to_bytes(enc_k1), ciphertext)
-
- # 输出还原的 "flag"
- print(original_flag)
- #flag{z3_s0lv3r_15_bri11i4nt}