Есть некий алгоритм. Входные данные: m[16] - входная строка k[256] - ключ Выходные данные: c[8] - шифрованный текст Сам код выглядит так: Code (Text): for(int i = 0; i < 8; i++){ c[i] = (m[k[i*2]] << 4) | (m[k[i*2+1]]); } Подскажите, что это за чудо? И, что самое главное, как его можно реверснуть.
Почему-то я не могу отредактировать свое сообщение Я опечатался, код выглядит так: Code (Text): for(int i = 0; i < 8; i++){ c[i] = (k[m[i*2]] << 4) | (k[m[i*2+1]]); }
В принципе, зная ключ, можно пошаманить и подобрать несколько входов для нужного выхода, но если ключ каждый раз меняется?
Проблема решена, все оказалось гораздо проще Банальный перебор печатаемых символов. Интересно, кто-нибудь сталкивался с подобным?
Какой-то бред самопальный, который ещё половину битов ключа не использует. А там обычная табличная замена. Одной подстановкой c=k[m] заменить можно.
Не половину, а всего 25%. Для одной подстановки понадобится таблица размером в 64 кило. Алгоритм времен "непуганных программистов", когда было достаточно рег.инфу перевести в нечитабельный вид и чтоб было сложнее XOR.
Поскольку во входной строке только заглавные печатные буквы, то даже 10%. К тому же некоторые байты ключа повторяются... Здесь я не понял ход мыслей. Можно подробнее? Мое решение: Code (Text): var map: array[0..15] of char; table: array[0..255] of byte = ( $08, $00, $00, $00, $10, $00, $00, $00, $20, $00, $00, $00, $40, $00, $00, $00, $80, $02, $41, $50, $02, $43, $54, $02, $45, $5A, $01, $49, $41, $02, $4D, $55, $01, $51, $42, $01, $46, $43, $02, $4A, $56, $02, $42, $4E, $02, $44, $52, $02, $47, $57, $01, $4B, $44, $01, $4F, $45, $02, $53, $58, $01, $48, $46, $02, $4C, $59, $00, $08, $01, $09, $02, $06, $0A, $0E, $03, $07, $0B, $0F, $04, $08, $0C, $00, $05, $09, $0D, $01, $04, $07, $0A, $0D, $0F, $02, $8B, $C0, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $8B, $C0, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00, $00, $0A, $00, $00, $00, $00, $00, $00, $00, $64, $00, $00, $00, $00, $00, $00, $00, $E8, $03, $00, $00, $00, $00, $00, $00, $10, $27, $00, $00, $00, $00, $00, $00, $A0, $86, $01, $00, $00, $00, $00, $00, $40, $42, $0F, $00, $00, $00, $00, $00, $80, $96, $98, $00, $00, $00, $00, $00, $00, $E1, $F5, $05, $00, $00, $00 ); procedure CreateMap; var i, j: integer; begin for i := 0 to 15 do begin for j := $41 to $5A do begin if (table[j] = i) then begin map[i] := chr(j); break; end; end; end; end; procedure Generate; var i: integer; m: string; c: array[0..7] of byte; begin m := ''; for i := 0 to 7 do begin m:= m + map[(c[i] shr 4)] + map[(c[i] and $F)]; end; end; Да вообще хрень какая-то, после этого алгоритма еще и модифицированный Blowfish идет
Я про алгоритм proteus Там для всех пар символов заранее делаем "ИЛИ" + сдвиг и заполняем большую таблицу. Просто у него m - это уже слово из двух байт. Кстати, надо таблицу проанализировать - не исключено что там однозначное преобразование типа "перемешивания бит".