This year’s New Year puzzle game has come to an end—thank you all for joining in, and once again, happy new year!
Game Walkthrough
First, here’s the full solving process for this year’s game:
Many thanks to @电脑星人 for the incredibly detailed write-up. I had drafted a rough outline of the key steps in advance, but their version is far better than mine, so I’ll just link to it here. If you want to see the full walkthrough, check it out 😂.
Some Stats
The game ran for 12 days starting on January 20. Under the rules, 49 correct passwords were submitted, and five players received red-envelope rewards. At 13:23 on January 21, the puzzle was first cracked by @FantasyLand の 暗梦. One other player tried brute-forcing answers with a script, submitting 540 guesses in total. Thanks to a pre-set QPS limit and quick detection, we only had to impose a brief IP restriction on that player.
Afterword
Why the steganographic message is in BGR order instead of RGB
This was my oversight >﹏<. The steganography script (LSB-Steganography) uses OpenCV, which reads images in BGR by default, so the embedded message naturally follows BGR order. To switch to RGB order, modify the script like this:
def main():
args = docopt.docopt(__doc__, version="0.2")
in_f = args["--in"]
out_f = args["--out"]
in_img = cv2.cvtColor(cv2.imread(in_f), cv2.COLOR_BGR2RGB) # Convert BGR to RGB.
steg = LSBSteg(in_img)
lossy_formats = ["jpeg", "jpg"]
if args['encode']:
# Handling lossy format
out_f, out_ext = out_f.split(".")
if out_ext in lossy_formats:
out_f = out_f + ".png"
print("Output file changed to ", out_f)
data = open(args["--file"], "rb").read()
res = cv2.cvtColor(steg.encode_binary(data), cv2.COLOR_RGB2BGR) # Convert RGB back to BGR or the image colors invert.
cv2.imwrite(out_f+'.png', res)
elif args["decode"]:
...
With this change, the steganographic image will carry the message in RGB order.

Steganography image in RGB order