@yossiz
אני שם לב שאם המפתח גדול בהרבה מהגודל של המספרים העוקבים, הXOR הכי גדול שאתה יכול להגיע אליו מכיל פחות ביטים מהמפתח עצמו, מה ששוב עושה שאי אפשר לגלות את המספר המקורי.
מאחר ומדובר במספרים עוקבים שמייצגים מספר כניסה, אפשר להניח שהם לא יעברו את ה100,000,000 בבטחה, לא? כמו כן ניתן להניח שלא יהיו להם תוצאות של יותר מ-10,000 כניסות עוקבות.
בוא נעמיד את זה לבדיקה:
const KEY = 200_000_000
const nums = makeRange(100_000_000, 10_000)
const [len, bits] = extractXORKeySeq(nums.map(i => i ^ KEY))
console.log(`Extracted last ${len} bits of the key: ${bits.toString(2).padStart(len, '0')}`)
console.log(`Real key is: ${KEY.toString(2)}`)
console.assert(KEY.toString(2).padStart(32, '0').endsWith(bits.toString(2).padStart(len, '0')))
והתוצאה:
Extracted last 17 bits of the key: 11100001000000000
Real key is: 1011111010111100001000000000
(זה לא יפה מצידי למצוא איפה הקוד שלך נכשל, בעוד שאני בכלל לא הצלחתי להגיע לשום פיתרון)