今年の新年ゲームはここまでとなります。ご参加いただいた皆様に感謝を申し上げ、改めて新年のご挨拶をさせていただきます。
ゲームの解析
まず、今回のゲームの謎解きプロセスをご紹介します:
@电脑星人 さんによる非常に詳細な解析に感謝します。元々謎解きの主要な流れを事前に書いておいたのですが、彼の方がずっと上手く書いていたので、詳細な謎解きプロセスを知りたい方はぜひ上記リンクをご覧ください😂。
いくつかのデータ
今年のゲームは1月20日から12日間開催され、ルールに従って合計49回のパスワード送信があり、5名の方が赤包を獲得しました。1月21日13時23分に、@FantasyLand の 暗梦 さんが最初に謎を解き明かしました。また、ある方はスクリプトを使って答えを総当たりで送信し、合計540回もの解答を送信しました。事前にQPS制限を設定しており、比較的早期に発見できたため、当該ユーザーのIPに対しては短時間のアクセス制限のみを行いました。
補足
なぜステガノグラフィの情報はBGR順なのかRGB順ではないのか
この問題は確かに私のミスでした>﹏<。ステガノグラフィスクリプト(LSB-Steganography)はOpenCVを使用しており、OpenCVは画像を読み込む際にデフォルトでBGR形式で読み込むため、ステガノグラフィの情報も自然にBGR順になってしまいます。RGB順にしたい場合は、以下のようにスクリプトを修正する必要があります:
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) # BGR形式をRGB形式に変換
steg = LSBSteg(in_img)
lossy_formats = ["jpeg", "jpg"]
if args['encode']:
# 非可逆形式の処理
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) # RGB形式をBGR形式に戻す、そうしないと画像の色が反転する
cv2.imwrite(out_f+'.png', res)
elif args["decode"]:
...
このようにすることで、生成される画像のステガノグラフィ情報はRGB順になります。

ステガノグラフィ画像 RGB順