Dann muss ich die nächsten 128 vollständigen 32-Bit-Werte vorhersagen.
Pythons Random verwendet MT19937, das einen internen Status mit 624 Elementen hat und normalerweise 624 aufeinanderfolgende vollständige 32-Bit-Ausgaben zur Wiederherstellung benötigt der Staat. Die Temperierungsfunktion ist umkehrbar, wenn Sie vollständige Ausgaben haben.
Das Problem ist, dass ich mehr als 624 Samples sammeln kann, diese aber alle auf 24 Bits gekürzt sind (es fehlen 8 Bits). Ich weiß auch nicht, welche Position im internen Zustand meiner ersten Beobachtung entspricht.
Wie kann ich den MT19937-Status wiederherstellen, um die nächsten 128 Zahlen vorherzusagen?
Code-Referenzen wären willkommen.
Programmcode:
Code: Select all
import random
import secrets
from flask import Flask, request, jsonify
FLAG = open("./flag.txt").read().strip()
random.seed(secrets.token_bytes(32))
app = Flask(__name__)
@app.get("/debug")
def debug():
return {"number": [random.getrandbits(24) for _ in range(64)]}
@app.post("/predict")
def predict():
if not request.is_json:
return jsonify({"error": True}), 400
data = request.json
if "predictions" not in data:
return jsonify({"error": True}), 400
predictions = data["predictions"]
if type(predictions) is not list or len(predictions) != 128:
return jsonify({"error": True}), 400
nums = [random.getrandbits(32) for _ in range(128)]
for nums, pred in zip(nums, predictions):
if nums != pred:
return jsonify({"success": False})
return jsonify({"success": True, "flag": FLAG})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=3000)
Mobile version