Что это за алгоритм?

Тема в разделе "WASM.CRYPTO", создана пользователем mastermind88, 7 дек 2009.

  1. mastermind88

    mastermind88 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2009
    Сообщения:
    5
    Есть некий алгоритм.
    Входные данные:
    m[16] - входная строка
    k[256] - ключ
    Выходные данные:
    c[8] - шифрованный текст

    Сам код выглядит так:
    Код (Text):
    1. for(int i = 0; i < 8; i++){
    2.   c[i] = (m[k[i*2]] << 4) | (m[k[i*2+1]]);
    3. }
    Подскажите, что это за чудо? И, что самое главное, как его можно реверснуть.
     
  2. mastermind88

    mastermind88 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2009
    Сообщения:
    5
    Почему-то я не могу отредактировать свое сообщение :dntknw:
    Я опечатался, код выглядит так:

    Код (Text):
    1. for(int i = 0; i < 8; i++){
    2.   c[i] = (k[m[i*2]] << 4) | (k[m[i*2+1]]);
    3. }
     
  3. mastermind88

    mastermind88 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2009
    Сообщения:
    5
    В принципе, зная ключ, можно пошаманить и подобрать несколько входов для нужного выхода, но если ключ каждый раз меняется?
     
  4. mastermind88

    mastermind88 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2009
    Сообщения:
    5
    Проблема решена, все оказалось гораздо проще :) Банальный перебор печатаемых символов.
    Интересно, кто-нибудь сталкивался с подобным?
     
  5. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    Какой-то бред самопальный, который ещё половину битов ключа не использует.
    А там обычная табличная замена. Одной подстановкой c=k[m] заменить можно.
     
  6. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105

    Не половину, а всего 25%. Для одной подстановки понадобится таблица размером в 64 кило.
    Алгоритм времен "непуганных программистов", когда было достаточно рег.инфу перевести в нечитабельный вид и чтоб было сложнее XOR.
     
  7. mastermind88

    mastermind88 New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2009
    Сообщения:
    5
    Поскольку во входной строке только заглавные печатные буквы, то даже 10%. К тому же некоторые байты ключа повторяются...

    Здесь я не понял ход мыслей. Можно подробнее?

    Мое решение:
    Код (Text):
    1. var
    2. map: array[0..15] of char;
    3. table: array[0..255] of byte = (
    4.     $08, $00, $00, $00, $10, $00, $00, $00, $20, $00, $00, $00, $40, $00, $00, $00,
    5.     $80, $02, $41, $50, $02, $43, $54, $02, $45, $5A, $01, $49, $41, $02, $4D, $55,
    6.     $01, $51, $42, $01, $46, $43, $02, $4A, $56, $02, $42, $4E, $02, $44, $52, $02,
    7.     $47, $57, $01, $4B, $44, $01, $4F, $45, $02, $53, $58, $01, $48, $46, $02, $4C,
    8.     $59, $00, $08, $01, $09, $02, $06, $0A, $0E, $03, $07, $0B, $0F, $04, $08, $0C,
    9.     $00, $05, $09, $0D, $01, $04, $07, $0A, $0D, $0F, $02, $8B, $C0, $00, $00, $00,
    10.     $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    11.     $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $8B,
    12.     $C0, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    13.     $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    14.     $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00, $00,
    15.     $00, $00, $00, $00, $00, $00, $00, $00, $00, $01, $00, $00, $00, $00, $00, $00,
    16.     $00, $0A, $00, $00, $00, $00, $00, $00, $00, $64, $00, $00, $00, $00, $00, $00,
    17.     $00, $E8, $03, $00, $00, $00, $00, $00, $00, $10, $27, $00, $00, $00, $00, $00,
    18.     $00, $A0, $86, $01, $00, $00, $00, $00, $00, $40, $42, $0F, $00, $00, $00, $00,
    19.     $00, $80, $96, $98, $00, $00, $00, $00, $00, $00, $E1, $F5, $05, $00, $00, $00
    20. );
    21.  
    22. procedure CreateMap;
    23. var
    24.   i, j: integer;
    25. begin
    26.   for i := 0 to 15 do begin
    27.     for j := $41 to $5A do begin
    28.       if (table[j] = i) then begin
    29.         map[i] := chr(j);
    30.         break;
    31.       end;
    32.     end;
    33.   end;
    34. end;
    35.  
    36. procedure Generate;
    37. var
    38.   i: integer;
    39.   m: string;
    40.   c: array[0..7] of byte;
    41. begin
    42.   m := '';
    43.   for i := 0 to 7 do begin
    44.     m:= m + map[(c[i] shr 4)] + map[(c[i] and $F)];
    45.   end;
    46. end;
    Да вообще хрень какая-то, после этого алгоритма еще и модифицированный Blowfish идет :)
     
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Я про алгоритм proteus

    Там для всех пар символов заранее делаем "ИЛИ" + сдвиг и заполняем большую таблицу. Просто у него m - это уже слово из двух байт.
    Кстати, надо таблицу проанализировать - не исключено что там однозначное преобразование типа "перемешивания бит".