Post date: Dec 19, 2014 1:9:12 AM
"You are given a text file of comma-separated ASCII values. This text has been produced by taking 'common English words' and XOR-ing them with a repeating sequence of 3 lower-case ASCII characters. Decode the text and sum the ASCII values (because entering the text into a web form would be a lot of work)."
This problem is terrible. Other than detail about the keys, which is straightforward and understandable, the only clue we get is that the message we need to decrypt "contains common English words." Unfortunately, it contains neither "only* common English words, nor only words, nor only letters. It contains various text, and happens to have a lot of common English words along with it.
Now if I could filter out results with symbols and numbers, it would cut out most options, but I can't do that. The problem doesn't even tell you that there are spaces between the words, with sentences and punctuation. It is very easy to recognize the output by eye, but that is human intelligence, not artificial intelligence.
The right answer is the only one that has a lot of common words, but I'm not going to build a dictionary of common English words for this answer, because that would be a huge task. Instead, I am going to take my knowledge that the words contain spaces (which I got from calculating all the possibilities and then looking at them), and search for the most common English word, " the " (note the spaces). This works, but there easily could have have been more than one match, by chance. If so, I would have thrown in a few other common words.
This is pretty sketchy, but to be honest, code-breaking is itself pretty sketchy, especially when the code is complex (which this isn't).
DECLARE @len int
-- Load the message into a table, one letter per row.
DECLARE @message nvarchar(max) = '79,59,12,2,79,35,8,28,20,2,3,68,8,9,68,45,0,12,9,67,68,4,7,5,23,27,1,21,79,85,78,79,85,71,38,10,71,27,12,2,79,6,2,8,13,9,1,13,9,8,68,19,7,1,71,56,11,21,11,68,6,3,22,2,14,0,30,79,1,31,6,23,19,10,0,73,79,44,2,79,19,6,28,' + '68,16,6,16,15,79,35,8,11,72,71,14,10,3,79,12,2,79,19,6,28,68,32,0,0,73,79,86,71,39,1,71,24,5,20,79,13,9,79,16,15,10,68,5,10,3,14,1,10,14,1,3,71,24,13,19,7,68,32,0,0,73,79,87,71,39,1,71,12,22,2,14,16,2,11,68,2,25,1,21,22,16,15,6,10,0,79,16,15,10,22,2,79,13,20,' +
'65,68,41,0,16,15,6,10,0,79,1,31,6,23,19,28,68,19,7,5,19,79,12,2,79,0,14,11,10,64,27,68,10,14,15,2,65,68,83,79,40,14,9,1,71,6,16,20,10,8,1,79,19,6,28,68,14,1,68,15,6,9,75,79,5,9,11,68,19,7,13,20,79,8,14,9,1,71,8,13,17,10,23,71,3,13,0,7,16,71,27,11,71,10,18,2,29,29,' +
'8,1,1,73,79,81,71,59,12,2,79,8,14,8,12,19,79,23,15,6,10,2,28,68,19,7,22,8,26,3,15,79,16,15,10,68,3,14,22,12,1,1,20,28,72,71,14,10,3,79,16,15,10,68,3,14,22,12,1,1,20,28,68,4,14,10,71,1,1,17,10,22,71,10,28,19,6,10,0,26,13,20,7,68,14,27,74,71,89,68,32,0,0,71,28,1,9,27,' +
'68,45,0,12,9,79,16,15,10,68,37,14,20,19,6,23,19,79,83,71,27,11,71,27,1,11,3,68,2,25,1,21,22,11,9,10,68,6,13,11,18,27,68,19,7,1,71,3,13,0,7,16,71,28,11,71,27,12,6,27,68,2,25,1,21,22,11,9,10,68,10,6,3,15,27,68,5,10,8,14,10,18,2,79,6,2,12,5,18,28,1,71,0,2,71,7,13,20,79,16,' + '2,28,16,14,2,11,9,22,74,71,87,68,45,0,12,9,79,12,14,2,23,2,3,2,71,24,5,20,79,10,8,27,68,19,7,1,71,3,13,0,7,16,92,79,12,2,79,19,6,28,68,8,1,8,30,79,5,71,24,13,19,1,1,20,28,68,19,0,68,19,7,1,71,3,13,0,7,16,73,79,93,71,59,12,2,79,11,9,10,68,16,7,11,71,6,23,71,27,12,2,79,16,' +
'21,26,1,71,3,13,0,7,16,75,79,19,15,0,68,0,6,18,2,28,68,11,6,3,15,27,68,19,0,68,2,25,1,21,22,11,9,10,72,71,24,5,20,79,3,8,6,10,0,79,16,8,79,7,8,2,1,71,6,10,19,0,68,19,7,1,71,24,11,21,3,0,73,79,85,87,79,38,18,27,68,6,3,16,15,0,17,0,7,68,19,7,1,71,24,11,21,3,0,71,24,5,20,79,' +
'9,6,11,1,71,27,12,21,0,17,0,7,68,15,6,9,75,79,16,15,10,68,16,0,22,11,11,68,3,6,0,9,72,16,71,29,1,4,0,3,9,6,30,2,79,12,14,2,68,16,7,1,9,79,12,2,79,7,6,2,1,73,79,85,86,79,33,17,10,10,71,6,10,71,7,13,20,79,11,16,1,68,11,14,10,3,79,5,9,11,68,6,2,11,9,8,68,15,6,23,71,0,19,9,79,' +
'20,2,0,20,11,10,72,71,7,1,71,24,5,20,79,10,8,27,68,6,12,7,2,31,16,2,11,74,71,94,86,71,45,17,19,79,16,8,79,5,11,3,68,16,7,11,71,13,1,11,6,1,17,10,0,71,7,13,10,79,5,9,11,68,6,12,7,2,31,16,2,11,68,15,6,9,75,79,12,2,79,3,6,25,1,71,27,12,2,79,22,14,8,12,19,79,16,8,79,6,2,12,11,' +
'10,10,68,4,7,13,11,11,22,2,1,68,8,9,68,32,0,0,73,79,85,84,79,48,15,10,29,71,14,22,2,79,22,2,13,11,21,1,69,71,59,12,14,28,68,14,28,68,9,0,16,71,14,68,23,7,29,20,6,7,6,3,68,5,6,22,19,7,68,21,10,23,18,3,16,14,1,3,71,9,22,8,2,68,15,26,9,6,1,68,23,14,23,20,6,11,9,79,11,21,79,' +
'20,11,14,10,75,79,16,15,6,23,71,29,1,5,6,22,19,7,68,4,0,9,2,28,68,1,29,11,10,79,35,8,11,74,86,91,68,52,0,68,19,7,1,71,56,11,21,11,68,5,10,7,6,2,1,71,7,17,10,14,10,71,14,10,3,79,8,14,25,1,3,79,12,2,29,1,71,0,10,71,10,5,21,27,12,71,14,9,8,1,3,71,26,23,73,79,44,2,79,19,6,28,' +
'68,1,26,8,11,79,11,1,79,17,9,9,5,14,3,13,9,8,68,11,0,18,2,79,5,9,11,68,1,14,13,19,7,2,18,3,10,2,28,23,73,79,37,9,11,68,16,10,68,15,14,18,2,79,23,2,10,10,71,7,13,20,79,3,11,0,22,30,67,68,19,7,1,71,8,8,8,29,29,71,0,2,71,27,12,2,79,11,9,3,29,71,60,11,9,79,11,1,79,16,15,10,68,' +
'33,14,16,15,10,22,73'
CREATE TABLE #Message (id INT IDENTITY(1,1) NOT NULL PRIMARY KEY, value int NOT NULL)
WHILE 1 = 1
BEGIN
SET @len = NULL
SELECT @len = CHARINDEX(',', @message)
IF @len = 0 BREAK
INSERT INTO #Message (value) VALUES (LEFT(@message,@len-1))
SET @message = stuff(@message,1,@len,'')
END -- While
INSERT INTO #Message VALUES (@message)
-- Now XOR the message with every combination of 3 lowercase letters. This surprisingly doesn't take a lot of time.
; WITH Letters (a) AS
(
SELECT 97
UNION ALL
SELECT a + 1
FROM Letters
WHERE a < 122
),
Keys (k1, k2, k3) AS
(
SELECT l1.a, l2.a, l3.a
FROM Letters l1
CROSS JOIN Letters l2
CROSS JOIN Letters l3
),
VariousDecodings ([key], id, value) AS
(
SELECT CONCAT(k.k1,'.',k.k2,'.',k.k3)
, m.id
,value ^ CASE m.id % 3 WHEN 1 THEN k.k1 WHEN 2 THEN k.k2 WHEN 0 THEN k.k3 END
FROM #Message m
CROSS JOIN Keys k
)
SELECT *
INTO #Decodings
FROM VariousDecodings
SELECT TOP 1 (SELECT SUM(value) FROM #Decodings d WHERE d.[key] = vd1.[key])
/* -- The translation isn't important to the problem, but if you want to look at it...
(SELECT N'' + CHAR(value) FROM #Decodings vd
WHERE vd.[key] = vd1.[key]
ORDER BY id
FOR XML PATH(''), TYPE).value('text()[1]','nvarchar(max)') AS TheTranslation
*/
FROM #Decodings vd1
INNER JOIN #Decodings vd2
ON vd1.[key] = vd2.[key] AND vd2.id = vd1.id + 1
INNER JOIN #Decodings vd3
ON vd1.[key] = vd3.[key] AND vd3.id = vd2.id + 1
INNER JOIN #Decodings vd4
ON vd1.[key] = vd4.[key] AND vd4.id = vd3.id + 1
INNER JOIN #Decodings vd5
ON vd1.[key] = vd5.[key] AND vd5.id = vd4.id + 1
WHERE vd1.value = 32 -- space
AND vd2.value = 116 -- t
AND vd3.value = 104 -- h
AND vd4.value = 101 -- e
AND vd5.value = 32 -- space
GROUP BY vd1.[key]
DROP TABLE #Decodings
DROP TABLE #Message