Pod koniec sierpnia ze skrzynki pocztowej wyjąłem taką pocztówkę:
Pocztó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!
Nieźle już Cię znają na poczcie. Na pocztówce wystarczy tylko wpisać “KrzaQ” i korespondencja ląduje w Twojej skrzynce 😛
Bardzo możliwe, przyszła mi raz pocztówka na której nie było podanego numeru budynku, a ulica długa 🙂
propsuje za ruby