Энтропия

Тема в разделе "WASM.CRYPTO", создана пользователем _faq_, 22 июн 2009.

  1. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    //продолжение оффтоп
    открой в иде через хекс-рейс файл aeheur.dll и сам все поймешь
     
  2. pr0mix

    pr0mix New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    107
    //Re[3] offtop
    ok, спс
     
  3. pr0mix

    pr0mix New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2008
    Сообщения:
    107
    //продолжение

    можем сделать так, данные (покриптованные) разместить определенным образом - к примеру, запихать их в той же секции кода (или по кускам в разных местах). Вполне норма будет, если секция кода распухнет. Так вот, в таком случае для этой секции важна будет та самая энтропия.
    ps: файл пока не смотрел за исключением неимения сего ав. Было получено экспериментальнвм путем.
     
  4. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    Со времен моих собственных экспериментов со стеганографией и алгоритмами сжатия у меня есть алгоритм, преобразующий входной текст в некое подобие бинарного кода Intel80386.

    Например, вот случайную строчку длиной в 55 байт
    æ¿-<é !¡3À¨#ê_sñ88<û(_-¯ò|áU&_æ_ZSb¦Å/óTxÖ%7Ã
    он превращает в 86 двоичных байт, в дизасме выглядящих вот так :
    Код (Text):
    1. 00000000: 050BF2                       add       ax,0F20B ;"Є♂"
    2. 00000003: 0100                         add       [bx][si],ax
    3. 00000005: E9CD11                       jmp       0000011D5
    4. 00000008: 0100                         add       [bx][si],ax
    5. 0000000A: 7340                         jae       00000004C   -------- (1)
    6. 0000000C: E9FC21                       jmp       00000220B
    7. 0000000F: 0100                         add       [bx][si],ax
    8. 00000011: 8A5C0A                       mov       bl,[si][0000A]
    9. 00000014: 7238                         jb        00000004E   -------- (2)
    10. 00000016: 6855F0                       push      0F055 ;"ЁU"
    11. 00000019: 0100                         add       [bx][si],ax
    12. 0000001B: EB07                         jmps      000000024   -------- (3)
    13. 0000001D: 7CC3                         jl        0FFFFFFE2
    14. 0000001F: EB78                         jmps      000000099
    15. 00000021: 730F                         jae       000000032   -------- (4)
    16. 00000023: 734B                         jae       000000070
    17. 00000025: 68A0E2                       push      0E2A0 ;"та"
    18. 00000028: 0100                         add       [bx][si],ax
    19. 0000002A: 760D                         jbe       000000039   -------- (5)
    20. 0000002C: A3F7CE                       mov       [0CEF7],ax
    21. 0000002F: 0100                         add       [bx][si],ax
    22. 00000031: EB81                         jmps      0FFFFFFB4
    23. 00000033: 66F2                         repne
    24. 00000035: 650100                       add       gs:[bx][si],ax
    25. 00000038: 756F                         jne       0000000A9
    26. 0000003A: 2B4115                       sub       ax,[bx][di][00015]
    27. 0000003D: E9CF5A                       jmp       000005B0F
    28. 00000040: 0100                         add       [bx][si],ax
    29. 00000042: 754A                         jne       00000008E
    30. 00000044: 7636                         jbe       00000007C
    31. 00000046: C1CF35                       ror       di,035 ;"5"
    32. 00000049: 6BF478                       imul      si,sp,078 ;"x"
    33. 0000004C: 050253                       add       ax,05302 ;"S☻"
    34. 0000004F: 0100                         add       [bx][si],ax
    35. 00000051: E8C7C3                       call      00000C41B
    36. 00000054: 0100                         add       [bx][si],ax
    Если считать, что энтропия входного текста 8.0, то на выходе алгоритма примерно 5.1-5.3.
    Обратное преобразование тоже можно в принципе дописать ...

    Если кому нужно - обращайтесь в личку, код на Паскале.
     
  5. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    P.S. Извиняюсь за 16-битный output дизассемблера в прошлом посте
    Код (Text):
    1. 00000000: 050BF20100                   add       eax,00001F20B ;" ☺Є♂"
    2. 00000005: E9CD110100                   jmp       0000111D7
    3. 0000000A: 7340                         jae       00000004C   -------- (1)
    4. 0000000C: E9FC210100                   jmp       00001220D
    5. 00000011: 8A5C0A72                     mov       bl,[edx][ecx][00072]
    6. 00000015: 386855                       cmp       [eax][00055],ch
    7. 00000018: F0                           lock
    8. 00000019: 0100                         add       [eax],eax
    9. 0000001B: EB07                         jmps      000000024   -------- (2)
    10. 0000001D: 7CC3                         jl        0FFFFFFE2
    11. 0000001F: EB78                         jmps      000000099
    12. 00000021: 730F                         jae       000000032   -------- (3)
    13. 00000023: 734B                         jae       000000070
    14. 00000025: 68A0E20100                   push      00001E2A0 ;" ☺та"
    15. 0000002A: 760D                         jbe       000000039   -------- (4)
    16. 0000002C: A3F7CE0100                   mov       [00001CEF7],eax
    17. 00000031: EB81                         jmps      0FFFFFFB4
    18. 00000033: 66F2                         repne
    19. 00000035: 650100                       add       gs:[eax],eax
    20. 00000038: 756F                         jne       0000000A9
    21. 0000003A: 2B4115                       sub       eax,[ecx][00015]
    22. 0000003D: E9CF5A0100                   jmp       000015B11
    23. 00000042: 754A                         jne       00000008E
    24. 00000044: 7636                         jbe       00000007C
    25. 00000046: C1CF35                       ror       edi,035 ;"5"
    26. 00000049: 6BF478                       imul      esi,esp,078 ;"x"
    27. 0000004C: 0502530100                   add       eax,000015302 ;" ☺S☻"
    28. 00000051: E8C7C30100                   call      00001C41D
     
  6. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    Набросал ради собственного интереса демо - перестановочный шифр на базе ослабленного (только 12 раундов) блочного шифра TEA :
    Код (Text):
    1. function TransTEA(const s:string):string;  // на входе строка строго из 256 символов
    2. var i,a,y,z,sum,iteration:longword; OrigPos,NewPos:byte; TmpChar:char;
    3. begin
    4. Result:=s;
    5. for i:=0 to 31 do  // 32*8=256 перестановок
    6.     begin
    7.     y:=0; // сюда на практике можно записывать порядковый номер блока
    8.     z:=i;  // сюда записываем порядковый номер 8-байтного куска внутри блока
    9.     // в итоге пара (y:z) будет всегда уникальна и давать новую перестановку
    10.     // дальше собственно TEA (четыре 32-битных ключа KEY0..KEY3 - для демо hard-coded)
    11.     sum:=0;
    12.     for iteration:=0 to 11 do
    13.       begin
    14.       inc(sum,$9E3779B9);
    15.       inc(y,((z shl 4)+$76DA83E1{KEY0}) xor (z+sum) xor ((z shr 5)+$D9F2AB86{KEY1}));
    16.       inc(z,((y shl 4)+$529FA0CD{KEY2}) xor (y+sum) xor ((y shr 5)+$FA1077D3{KEY3}));
    17.       end;
    18.     // на базе получившихся 8 зашифрованных байт (4 байта в y и 4 байта в z) делаем 8 перестановок
    19.     // внутри строки Result
    20.     for a:=0 to 3 do
    21.         begin
    22.         OrigPos:=(i shl 3)+a; NewPos:=y and $FF; y:=y shr 8;
    23.         TmpChar:=Result[NewPos+1]; Result[NewPos+1]:=Result[OrigPos+1]; Result[OrigPos+1]:=TmpChar;
    24.         OrigPos:=OrigPos+4; NewPos:=z and $FF; z:=z shr 8;
    25.         TmpChar:=Result[NewPos+1]; Result[NewPos+1]:=Result[OrigPos+1]; Result[OrigPos+1]:=TmpChar;
    26.         end;
    27.     end;
    28. end;
    Вот результат :
    вход - "Губернатор Южной Каролины Марк Сэнфорд (Mark Sanford), загадочное исчезновение которого в последнее время бурно обсуждалось в американской прессе, в среду, 24 июня, предстал перед публикой и рассказал, что отдыхал в Аргентине. Об этом сообщает Reuters."
    выход - "кеиаооовсо б чn)ро оз ьо еонсйрЮбар2 еoоаоексиасзеарнг рсоеСбвaS4 епйtлве,ря,иоу.akд,ад е u вMу сымМ еж ачдй,этнао т асрвинГэреи рсиад нeеыинеалсгсдвтоп тпфояу уrкгжбондюно кдт fа, ренмрреsд dоеб аRхлримз. уал ечАОботщсотнепrкrкс онл нте(о e лрлК н пр"

    Посимвольная энтропия (как и у любого перестановочного шифра) естественно осталась неизменной.
     
  7. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    Код (Text):
    1.               // Ïåðåñòàíîâî÷íûé øèôð äëÿ áëîêà â 256 áàéò íà áàçå îñëàáëåííîãî
    2.               // (12 ðàóíäîâ) áëî÷íîãî øèôðà TEA   (C) OLS, 2009
    3.  
    4.               // íà âõîäå DS:EDI -> 256-áàéòíûé áëîê, EAX - ïîðÿäêîâûé íîìåð ýòîãî áëîêà
    5.               // ESI - position, EAX - Y, EDX - Z, EDI - SUM
    6.  
    7.           pushad
    8.             push eax
    9.              xor esi,esi
    10. @@pCycle32:  pop eax          // Y
    11.             push eax
    12.              mov edx,esi      // Z
    13.             push edi          // storing block address
    14.              xor edi,edi      // SUM
    15.  
    16.              mov ecx,12       // 12 rounds of TEA
    17. @@pTEA:      add edi,9E3779B9h
    18.  
    19.              xor ebx,ebx      // updating y ...
    20.             push edx
    21.              pop edx          // ((z shl 4)+$76DA83E1{KEY0})
    22.             push edx
    23.              shl edx,4
    24.              add edx,76DA83E1h
    25.              xor ebx,edx      // XOR
    26.              pop edx          // (z+sum)
    27.             push edx
    28.              add edx,edi
    29.              xor ebx,edx      // XOR
    30.              pop edx          // ((z shr 5)+$D9F2AB86{KEY1})
    31.             push edx
    32.              shr edx,5
    33.              add edx,0D9F2AB86h
    34.              xor ebx,edx      // XOR
    35.              add eax,ebx      // y updated
    36.              pop edx
    37.  
    38.              xor ebx,ebx      // updating z ...
    39.             push eax
    40.              pop eax          // ((y shl 4)+$529FA0CD{KEY2})
    41.             push eax
    42.              shl eax,4
    43.              add eax,529FA0CDh
    44.              xor ebx,eax      // XOR
    45.              pop eax          // (y+sum)
    46.             push eax
    47.              add eax,edi
    48.              xor ebx,eax      // XOR
    49.              pop eax          // ((y shr 5)+$FA1077D3{KEY3})
    50.             push eax
    51.              shr eax,5
    52.              add eax,0FA1077D3h
    53.              xor ebx,eax      // XOR
    54.              add edx,ebx      // z updated
    55.              pop eax
    56.  
    57.             loop @@pTEA
    58.              pop edi          // restoring block address
    59.  
    60.              xor ecx,ecx      // clearing high-order bytes for addressing
    61.              mov ebp,0
    62. @@pTrans:    mov cl,al        // TRANS from Y
    63.              shr eax,8
    64.              mov bl,[edi+esi]
    65.              mov bh,[edi+ecx]
    66.              mov [edi+esi],bh
    67.              mov [edi+ecx],bl
    68.              inc esi
    69.  
    70.              mov cl,dl        // TRANS from Z
    71.              shr edx,8
    72.              mov bl,[edi+esi]
    73.              mov bh,[edi+ecx]
    74.              mov [edi+esi],bh
    75.              mov [edi+ecx],bl
    76.              inc esi
    77.  
    78.              inc ebp
    79.              cmp ebp,4
    80.               jb @@pTrans
    81.  
    82.              cmp esi,100h
    83.               jb @@pCycle32
    84.              pop eax
    85.            popad
    (слегка изменен порядок выборки байт перестановок для простоты)
     
  8. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    Код (Text):
    1.               // Перестановочный шифр для блока в 256 байт на базе ослабленного
    2.               // (12 раундов) блочного шифра TEA   (C) OLS, 2009
    3.  
    4.               // на входе DS:EDI -> 256-байтный блок, EAX - порядковый номер этого блока
    5.               // ESI - position, EAX - Y, EDX - Z, EDI - SUM
     
  9. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    Ну шифр он по определению полностью случайные данные даёт. Т.е. абсолютный шум.
    Если это не так, то он просто ненадёжный и его скорее всего можно раколоть без ключа.
    Как бы не изврашялся в хафманом и прочим, по сути будет тоже самое всё. Проще зашифрованное разбавлять.
     
  10. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    Перестановочные вообще не меняют посимвольную энтропию
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Если данные например сжаты, то такой шифр теряет свой смысл. Кто-нибудь думал в сторону применения регрессионных уравнений? Суть уменьшения энтропии в следующем: чем больше частота каждого байта, т.е. меньше различных байт в данных, тем ниже энтропия. Так? Если так, то линейное уравнение регрессии y' = Ax + B даст такие значение, в которых разброс y' будет во много раз меньше, чем y. Но остается проблема обратимости - получить y, имея А В х y' просто невозможно. Кто-нибудь думал в продолжение этой темы?
     
  12. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    Объясни поподробнее ?
     
  13. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    энтропия считается на основе частоты появления байт, так? Если данные уже сжаты, т.е. энтропия высокая, то перестановка байт местами никакой роли совершенно не сыграет. Вот если б данные не были пожаты, тогда да. Или я неправильно понял твои высказывания о перестановках?
     
  14. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    Как я лично понял автора топика, ему нужно спрятать свой бинарный код в чужом бинарном коде, да еще и пошифровать свой при этом (стеганография или еще что похуже ...). Перестановочные шифры здесь как никогда к месту.
     
  15. Proteus

    Proteus Member

    Публикаций:
    0
    Регистрация:
    19 июн 2004
    Сообщения:
    344
    Адрес:
    Russia
    Перестановка мягко говоря не шифр. Она все данные на виду осталяет.
     
  16. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Proteus
    ты видимо не совсем понял суть вопроса. Если человеку нужна криптостойкость, то ему глубоко пох на энтропию, логично? Тут, я так полагаю, вопрос можно перефразировать примерно так: "как спрятать данные от антивируса и сохранить при этом энтропию на низком уровне?". Поэтому перестановочный шифр очень здорово поможет в ситуации с неупакованными файлами
     
  17. OLS

    OLS New Member

    Публикаций:
    0
    Регистрация:
    8 янв 2005
    Сообщения:
    322
    Адрес:
    Russia
    Proteus
    Ты прав и не прав одновременно.
    Мне кстати самому эти вопросы очень интересны.

    Вот новый экземпляр. Можно назвать его - challenge.
    Исходный код :
    Код (Text):
    1. function TransTEA(const s:string; blockid:longword):string;
    2. var a,y,z,sum,iteration,Position:longword; NewPos:byte; TmpChar:char;
    3. begin
    4. Result:=s; position:=0;
    5. repeat
    6.   y:=blockid; z:=position;
    7.   sum:=0;
    8.   for iteration:=0 to 11 do
    9.     begin
    10.     inc(sum,$9E3779B9);
    11.     inc(y,((z shl 4)+$XXXXXXXX{KEY0}) xor (z+sum) xor ((z shr 5)+$XXXXXXXX{KEY1}));
    12.     inc(z,((y shl 4)+$XXXXXXXX{KEY2}) xor (y+sum) xor ((y shr 5)+$XXXXXXXX{KEY3}));
    13.     end;
    14.   for a:=0 to 3 do
    15.       begin
    16.       NewPos:=y and $FF; y:=y shr 8;
    17.       TmpChar:=Result[NewPos+1]; Result[NewPos+1]:=Result[Position+1]; Result[Position+1]:=TmpChar; inc(Position);
    18.       NewPos:=z and $FF; z:=z shr 8;
    19.       TmpChar:=Result[NewPos+1]; Result[NewPos+1]:=Result[Position+1]; Result[Position+1]:=TmpChar; inc(Position);
    20.       end;
    21. until position=$100;
    22. end;
    Т.е. самый базовый TEA + очень сильно ослабленный тем, что взяты только 12 раундов. Но размер блока - 256 байт.

    Шифруются 64-битные вектора (y;z) - (0;0), (0;8), (0;16), ..., (0,248).
    Получившиеся после шифрования первого блока (y=0;z=0) 8 байт используются
    для 8 последовательных перестановок в шифруемом блоке :
    s[0]<->s[y0], s[1]<->s[z0], s[2]<->s[y1], ...
    После второго блока (y=0;z=8)
    s[8]<->s[y0], s[9]<->s[z0], s[10]<->[y1], ...
    и т.д.

    Вот зашифрованный блок (256 символов), 128-битный ключ TEA закомментирован в коде как $XXXXXXXX:
    Код (Text):
    1.  згрсдьМпущгенвледдзннийосенз ЕонИтагосихо,еио оеао,Сйроналла Не
    2. не шиноиово.мо  тн еьйкояз  м  уве ууи еосг норденд м-лчсм л йап
    3. ищо-есньсмремтген,нкб   о К,вп наухдуроилтткниа дыяуИб  еасмлыыс
    4. а ;ндган,й д ся к еуплоыбюммл й аН овуждИетмтнмеыаовддербетотнпь
    (отечественная классика)
    Насколько сложно его взломать/подобрать/вычислить по каким-либо частотным характеристикам ?