//продолжение можем сделать так, данные (покриптованные) разместить определенным образом - к примеру, запихать их в той же секции кода (или по кускам в разных местах). Вполне норма будет, если секция кода распухнет. Так вот, в таком случае для этой секции важна будет та самая энтропия. ps: файл пока не смотрел за исключением неимения сего ав. Было получено экспериментальнвм путем.
Со времен моих собственных экспериментов со стеганографией и алгоритмами сжатия у меня есть алгоритм, преобразующий входной текст в некое подобие бинарного кода Intel80386. Например, вот случайную строчку длиной в 55 байт æ¿-<é!¡3À¨#ê_sñ88<û(_-¯ò|áU&_æ_ZSb¦Å/óTxÖ%7à он превращает в 86 двоичных байт, в дизасме выглядящих вот так : Код (Text): 00000000: 050BF2 add ax,0F20B ;"Є♂" 00000003: 0100 add [bx][si],ax 00000005: E9CD11 jmp 0000011D5 00000008: 0100 add [bx][si],ax 0000000A: 7340 jae 00000004C -------- (1) 0000000C: E9FC21 jmp 00000220B 0000000F: 0100 add [bx][si],ax 00000011: 8A5C0A mov bl,[si][0000A] 00000014: 7238 jb 00000004E -------- (2) 00000016: 6855F0 push 0F055 ;"ЁU" 00000019: 0100 add [bx][si],ax 0000001B: EB07 jmps 000000024 -------- (3) 0000001D: 7CC3 jl 0FFFFFFE2 0000001F: EB78 jmps 000000099 00000021: 730F jae 000000032 -------- (4) 00000023: 734B jae 000000070 00000025: 68A0E2 push 0E2A0 ;"та" 00000028: 0100 add [bx][si],ax 0000002A: 760D jbe 000000039 -------- (5) 0000002C: A3F7CE mov [0CEF7],ax 0000002F: 0100 add [bx][si],ax 00000031: EB81 jmps 0FFFFFFB4 00000033: 66F2 repne 00000035: 650100 add gs:[bx][si],ax 00000038: 756F jne 0000000A9 0000003A: 2B4115 sub ax,[bx][di][00015] 0000003D: E9CF5A jmp 000005B0F 00000040: 0100 add [bx][si],ax 00000042: 754A jne 00000008E 00000044: 7636 jbe 00000007C 00000046: C1CF35 ror di,035 ;"5" 00000049: 6BF478 imul si,sp,078 ;"x" 0000004C: 050253 add ax,05302 ;"S☻" 0000004F: 0100 add [bx][si],ax 00000051: E8C7C3 call 00000C41B 00000054: 0100 add [bx][si],ax Если считать, что энтропия входного текста 8.0, то на выходе алгоритма примерно 5.1-5.3. Обратное преобразование тоже можно в принципе дописать ... Если кому нужно - обращайтесь в личку, код на Паскале.
P.S. Извиняюсь за 16-битный output дизассемблера в прошлом посте Код (Text): 00000000: 050BF20100 add eax,00001F20B ;" ☺Є♂" 00000005: E9CD110100 jmp 0000111D7 0000000A: 7340 jae 00000004C -------- (1) 0000000C: E9FC210100 jmp 00001220D 00000011: 8A5C0A72 mov bl,[edx][ecx][00072] 00000015: 386855 cmp [eax][00055],ch 00000018: F0 lock 00000019: 0100 add [eax],eax 0000001B: EB07 jmps 000000024 -------- (2) 0000001D: 7CC3 jl 0FFFFFFE2 0000001F: EB78 jmps 000000099 00000021: 730F jae 000000032 -------- (3) 00000023: 734B jae 000000070 00000025: 68A0E20100 push 00001E2A0 ;" ☺та" 0000002A: 760D jbe 000000039 -------- (4) 0000002C: A3F7CE0100 mov [00001CEF7],eax 00000031: EB81 jmps 0FFFFFFB4 00000033: 66F2 repne 00000035: 650100 add gs:[eax],eax 00000038: 756F jne 0000000A9 0000003A: 2B4115 sub eax,[ecx][00015] 0000003D: E9CF5A0100 jmp 000015B11 00000042: 754A jne 00000008E 00000044: 7636 jbe 00000007C 00000046: C1CF35 ror edi,035 ;"5" 00000049: 6BF478 imul esi,esp,078 ;"x" 0000004C: 0502530100 add eax,000015302 ;" ☺S☻" 00000051: E8C7C30100 call 00001C41D
Набросал ради собственного интереса демо - перестановочный шифр на базе ослабленного (только 12 раундов) блочного шифра TEA : Код (Text): function TransTEA(const s:string):string; // на входе строка строго из 256 символов var i,a,y,z,sum,iteration:longword; OrigPos,NewPos:byte; TmpChar:char; begin Result:=s; for i:=0 to 31 do // 32*8=256 перестановок begin y:=0; // сюда на практике можно записывать порядковый номер блока z:=i; // сюда записываем порядковый номер 8-байтного куска внутри блока // в итоге пара (y:z) будет всегда уникальна и давать новую перестановку // дальше собственно TEA (четыре 32-битных ключа KEY0..KEY3 - для демо hard-coded) sum:=0; for iteration:=0 to 11 do begin inc(sum,$9E3779B9); inc(y,((z shl 4)+$76DA83E1{KEY0}) xor (z+sum) xor ((z shr 5)+$D9F2AB86{KEY1})); inc(z,((y shl 4)+$529FA0CD{KEY2}) xor (y+sum) xor ((y shr 5)+$FA1077D3{KEY3})); end; // на базе получившихся 8 зашифрованных байт (4 байта в y и 4 байта в z) делаем 8 перестановок // внутри строки Result for a:=0 to 3 do begin OrigPos:=(i shl 3)+a; NewPos:=y and $FF; y:=y shr 8; TmpChar:=Result[NewPos+1]; Result[NewPos+1]:=Result[OrigPos+1]; Result[OrigPos+1]:=TmpChar; OrigPos:=OrigPos+4; NewPos:=z and $FF; z:=z shr 8; TmpChar:=Result[NewPos+1]; Result[NewPos+1]:=Result[OrigPos+1]; Result[OrigPos+1]:=TmpChar; end; end; end; Вот результат : вход - "Губернатор Южной Каролины Марк Сэнфорд (Mark Sanford), загадочное исчезновение которого в последнее время бурно обсуждалось в американской прессе, в среду, 24 июня, предстал перед публикой и рассказал, что отдыхал в Аргентине. Об этом сообщает Reuters." выход - "кеиаооовсо б чn)ро оз ьо еонсйрЮбар2 еoоаоексиасзеарнг рсоеСбвaS4 епйtлве,ря,иоу.akд,ад е u вMу сымМ еж ачдй,этнао т асрвинГэреи рсиад нeеыинеалсгсдвтоп тпфояу уrкгжбондюно кдт fа, ренмрреsд dоеб аRхлримз. уал ечАОботщсотнепrкrкс онл нте(о e лрлК н пр" Посимвольная энтропия (как и у любого перестановочного шифра) естественно осталась неизменной.
Код (Text): // Ïåðåñòàíîâî÷íûé øèôð äëÿ áëîêà â 256 áàéò íà áàçå îñëàáëåííîãî // (12 ðàóíäîâ) áëî÷íîãî øèôðà TEA (C) OLS, 2009 // íà âõîäå DS:EDI -> 256-áàéòíûé áëîê, EAX - ïîðÿäêîâûé íîìåð ýòîãî áëîêà // ESI - position, EAX - Y, EDX - Z, EDI - SUM pushad push eax xor esi,esi @@pCycle32: pop eax // Y push eax mov edx,esi // Z push edi // storing block address xor edi,edi // SUM mov ecx,12 // 12 rounds of TEA @@pTEA: add edi,9E3779B9h xor ebx,ebx // updating y ... push edx pop edx // ((z shl 4)+$76DA83E1{KEY0}) push edx shl edx,4 add edx,76DA83E1h xor ebx,edx // XOR pop edx // (z+sum) push edx add edx,edi xor ebx,edx // XOR pop edx // ((z shr 5)+$D9F2AB86{KEY1}) push edx shr edx,5 add edx,0D9F2AB86h xor ebx,edx // XOR add eax,ebx // y updated pop edx xor ebx,ebx // updating z ... push eax pop eax // ((y shl 4)+$529FA0CD{KEY2}) push eax shl eax,4 add eax,529FA0CDh xor ebx,eax // XOR pop eax // (y+sum) push eax add eax,edi xor ebx,eax // XOR pop eax // ((y shr 5)+$FA1077D3{KEY3}) push eax shr eax,5 add eax,0FA1077D3h xor ebx,eax // XOR add edx,ebx // z updated pop eax loop @@pTEA pop edi // restoring block address xor ecx,ecx // clearing high-order bytes for addressing mov ebp,0 @@pTrans: mov cl,al // TRANS from Y shr eax,8 mov bl,[edi+esi] mov bh,[edi+ecx] mov [edi+esi],bh mov [edi+ecx],bl inc esi mov cl,dl // TRANS from Z shr edx,8 mov bl,[edi+esi] mov bh,[edi+ecx] mov [edi+esi],bh mov [edi+ecx],bl inc esi inc ebp cmp ebp,4 jb @@pTrans cmp esi,100h jb @@pCycle32 pop eax popad (слегка изменен порядок выборки байт перестановок для простоты)
Код (Text): // Перестановочный шифр для блока в 256 байт на базе ослабленного // (12 раундов) блочного шифра TEA (C) OLS, 2009 // на входе DS:EDI -> 256-байтный блок, EAX - порядковый номер этого блока // ESI - position, EAX - Y, EDX - Z, EDI - SUM
Ну шифр он по определению полностью случайные данные даёт. Т.е. абсолютный шум. Если это не так, то он просто ненадёжный и его скорее всего можно раколоть без ключа. Как бы не изврашялся в хафманом и прочим, по сути будет тоже самое всё. Проще зашифрованное разбавлять.
Если данные например сжаты, то такой шифр теряет свой смысл. Кто-нибудь думал в сторону применения регрессионных уравнений? Суть уменьшения энтропии в следующем: чем больше частота каждого байта, т.е. меньше различных байт в данных, тем ниже энтропия. Так? Если так, то линейное уравнение регрессии y' = Ax + B даст такие значение, в которых разброс y' будет во много раз меньше, чем y. Но остается проблема обратимости - получить y, имея А В х y' просто невозможно. Кто-нибудь думал в продолжение этой темы?
энтропия считается на основе частоты появления байт, так? Если данные уже сжаты, т.е. энтропия высокая, то перестановка байт местами никакой роли совершенно не сыграет. Вот если б данные не были пожаты, тогда да. Или я неправильно понял твои высказывания о перестановках?
Как я лично понял автора топика, ему нужно спрятать свой бинарный код в чужом бинарном коде, да еще и пошифровать свой при этом (стеганография или еще что похуже ...). Перестановочные шифры здесь как никогда к месту.
Proteus ты видимо не совсем понял суть вопроса. Если человеку нужна криптостойкость, то ему глубоко пох на энтропию, логично? Тут, я так полагаю, вопрос можно перефразировать примерно так: "как спрятать данные от антивируса и сохранить при этом энтропию на низком уровне?". Поэтому перестановочный шифр очень здорово поможет в ситуации с неупакованными файлами
Proteus Ты прав и не прав одновременно. Мне кстати самому эти вопросы очень интересны. Вот новый экземпляр. Можно назвать его - challenge. Исходный код : Код (Text): function TransTEA(const s:string; blockid:longword):string; var a,y,z,sum,iteration,Position:longword; NewPos:byte; TmpChar:char; begin Result:=s; position:=0; repeat y:=blockid; z:=position; sum:=0; for iteration:=0 to 11 do begin inc(sum,$9E3779B9); inc(y,((z shl 4)+$XXXXXXXX{KEY0}) xor (z+sum) xor ((z shr 5)+$XXXXXXXX{KEY1})); inc(z,((y shl 4)+$XXXXXXXX{KEY2}) xor (y+sum) xor ((y shr 5)+$XXXXXXXX{KEY3})); end; for a:=0 to 3 do begin NewPos:=y and $FF; y:=y shr 8; TmpChar:=Result[NewPos+1]; Result[NewPos+1]:=Result[Position+1]; Result[Position+1]:=TmpChar; inc(Position); NewPos:=z and $FF; z:=z shr 8; TmpChar:=Result[NewPos+1]; Result[NewPos+1]:=Result[Position+1]; Result[Position+1]:=TmpChar; inc(Position); end; until position=$100; 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): згрсдьМпущгенвледдзннийосенз ЕонИтагосихо,еио оеао,Сйроналла Не не шиноиово.мо тн еьйкояз м уве ууи еосг норденд м-лчсм л йап ищо-есньсмремтген,нкб о К,вп наухдуроилтткниа дыяуИб еасмлыыс а ;ндган,й д ся к еуплоыбюммл й аН овуждИетмтнмеыаовддербетотнпь (отечественная классика) Насколько сложно его взломать/подобрать/вычислить по каким-либо частотным характеристикам ?