From 40a42ca7a14c74812971587a90f57720f6a6c6ef Mon Sep 17 00:00:00 2001 From: Jack Kingsman Date: Thu, 12 Feb 2026 11:15:43 -0800 Subject: [PATCH] Update cracker to support two-word mode --- frontend/package.json | 2 +- frontend/src/components/CrackerPanel.tsx | 36 ++++++++++++++++++++---- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 58ab401..80be53b 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -30,7 +30,7 @@ "d3-force": "^3.0.0", "leaflet": "^1.9.4", "lucide-react": "^0.562.0", - "meshcore-hashtag-cracker": "^1.6.0", + "meshcore-hashtag-cracker": "^1.7.0", "nosleep.js": "^0.12.0", "react": "^18.3.1", "react-dom": "^18.3.1", diff --git a/frontend/src/components/CrackerPanel.tsx b/frontend/src/components/CrackerPanel.tsx index 3bccbe3..400c7a1 100644 --- a/frontend/src/components/CrackerPanel.tsx +++ b/frontend/src/components/CrackerPanel.tsx @@ -76,6 +76,7 @@ export function CrackerPanel({ const [retryFailedAtNextLength, setRetryFailedAtNextLength] = useState(false); const [decryptHistorical, setDecryptHistorical] = useState(true); const [turboMode, setTurboMode] = useState(false); + const [twoWordMode, setTwoWordMode] = useState(false); const [progress, setProgress] = useState(null); const [queue, setQueue] = useState>(new Map()); const [crackedRooms, setCrackedRooms] = useState([]); @@ -94,6 +95,7 @@ export function CrackerPanel({ const maxLengthRef = useRef(6); const decryptHistoricalRef = useRef(true); const turboModeRef = useRef(false); + const twoWordModeRef = useRef(false); const undecryptedIdsRef = useRef>(new Set()); const seenPayloadsRef = useRef>(new Set()); @@ -226,6 +228,10 @@ export function CrackerPanel({ turboModeRef.current = turboMode; }, [turboMode]); + useEffect(() => { + twoWordModeRef.current = twoWordMode; + }, [twoWordMode]); + // Keep undecrypted IDs ref in sync - used to skip packets already decrypted by other means useEffect(() => { undecryptedIdsRef.current = new Set(undecryptedGroupText.map((p) => p.id)); @@ -311,9 +317,14 @@ export function CrackerPanel({ useSenderFilter: true, useTimestampFilter: true, useUtf8Filter: true, + useTwoWordCombinations: twoWordModeRef.current, ...(turboModeRef.current && { gpuDispatchMs: 10000 }), // For retries, skip dictionary and shorter lengths - we already checked those - ...(isRetry && { useDictionary: false, startingLength: targetLength }), + ...(isRetry && { + useDictionary: false, + useTwoWordCombinations: false, + startingLength: targetLength, + }), }, (prog) => { setProgress(prog); @@ -482,6 +493,16 @@ export function CrackerPanel({ )} + +