Zaszyfrowana pocztówka od foxtrot_charlie

Pod koniec sierpnia ze skrzynki pocztowej wyjąłem taką pocztówkę:

PocztówkaPocztówka

Jej nadawcą, jeśli zawierzyć podpisowi, był foxtrot_charlie

Przepisane:

HEX = <<HEX
28 18 0E 01 07 04 1F 1A
02 14 4B 01 04 0B 0F 03
04 06 02 14 05 18 0A 51
11 51 0C 1E 19 10 08 14
01 51 28 19 04 03 1C 10
08 1B 02 50 00 00 00 00
HEX

i jako tablica liczb

ELEMS = HEX.split.map{ |s| s.to_i(16) }

Może to Duża Liczba?

 
VAL = HEX.split.join.to_i(16)
 
(1..256).each do |n|
    v = VAL / n
    str = v.to_s(16)
    str = '0' + str if str.size % 2 == 1
    puts str
        .each_codepoint
        .each_slice(2)
        .map{ |arr| arr.map(&:chr).join.to_i(16) }
        .map(&:chr)
        .join
end
 
(1..1338).each do |n|
    v = VAL * n
    str = v.to_s(16)
    str = '0' + str if str.size % 2 == 1
    puts str
        .each_codepoint
        .each_slice(2)
        .map{ |arr| arr.map(&:chr).join.to_i(16) }
        .map(&:chr)
        .join
end

Wyniki to same śmieci, więc nie.

Składanie liter z zestawów znaków

Wiadomość ma 48 bajtów, a 48 jest liczbą, która ładnie się dzieli. Może trzeba wykonać jakieś operacje logiczne na paczkach bajtów?

(2..8).to_a.product([:^, :&, :|, :*, :+, :-]).each do |n, op|
    out = ELEMS
        .each_slice(n)
        .map{ |a| a.inject op }
        .reject{ |c| c > 255 or c < 0}
        .map(&:chr)
 
    p [n, op, out]
end
[2, :^, ["0", "\x0F", "\x03", "\x05", "\x16", "J", "\x0F", "\f", "\x02", "\x16", "\x1D", "[", "@", "\x12", "\t", "\x1C", "P", "1", "\a", "\f", "\x13", "R", "\x00", "\x00"]]
[2, :&, ["\b", "\x00", "\x04", "\x1A", "\x00", "\x01", "\x00", "\x03", "\x04", "\x00", "\x00", "\x00", "\x11", "\f", "\x10", "\x00", "\x01", "\b", "\x00", "\x10", "\b", "\x00", "\x00", "\x00"]]
// ...
[7, :+, ["y", "\x8B", "7", "\xFF", "\xBF", "o", "R"]]
[7, :-, []]
[8, :^, ["9", "_", "R", "G", "j", "A"]]
[8, :&, ["\x00", "\x00", "\x00", "\x00", "\x00", "\x00"]]
[8, :|, ["?", "_", "_", "_", "\x7F", "["]]
[8, :*, ["\x00"]]
[8, :+, ["\x93", "\x83", "\x98", "\xD1", "\xC6", "u"]]
[8, :-, []]
[Finished in 0.1s]

Również śmieci.

Może trzeba odwrócić kolejność liter w bajtach?

p HEX.split.map(&:reverse).map{ |s| s.to_i(16).chr }
["\x82", "\x81", "\xE0", "\x10", "p", "@", "\xF1", "\xA1", " ", "A", "\xB4", "\x10", "@", "\xB0", "\xF0", "0", "@", "`", " ", "A", "P", "\x81", "\xA0", "\x15", "\x11", "\x15", "\xC0", "\xE1", "\x91", "\x01", "\x80", "A", "\x10", "\x15", "\x82", "\x91", "@", "0", "\xC1", "\x01", "\x80", "\xB1", " ", "\x05", "\x00", "\x00", "\x00", "\x00"]

Też nie bardzo.

Jakiś prosty xor?

Po sprawdzeniu kilku haseł:

 
# XOR = [ 0x3, 0x13, 0x37 ]
# XOR = [ 0x13, 0x37 ]
# XOR = [ 123, 125, 124, 101, 98, 103 ]
# XOR = 'KrzaQ'.each_codepoint.to_a
# XOR = 'KrzaQ'.downcase.each_codepoint.to_a
# XOR = 'KQ'.each_codepoint.to_a
XOR = 'kq'.each_codepoint.to_a
 
OUT = ELEMS.each_with_index.map do |el, i|
    el ^ XOR[i % XOR.size]
end.map(&:chr).join
 
p ELEMS
p OUT

Moim oczom ukazał się następujący wynik:

[40, 24, 14, 1, 7, 4, 31, 26, 2, 20, 75, 1, 4, 11, 15, 3, 4, 6, 2, 20, 5, 24, 10, 81, 17, 81, 12, 30, 25, 16, 8, 20, 1, 81, 40, 25, 4, 3, 28, 16, 8, 27, 2, 80, 0, 0, 0, 0]
"Cieplutkie pozdrowienia z goracej Chorwacji!kqkq"

Bardzo dziękuję za pocztówkę, foxtrot_charlie!

3 thoughts on “Zaszyfrowana pocztówka od foxtrot_charlie

    1. Bardzo możliwe, przyszła mi raz pocztówka na której nie było podanego numeru budynku, a ulica długa 🙂

Leave a Reply

Your email address will not be published.