Имеем ключ отбеливания (правую половинку ключа Виаксесс) 8 байт r0 r1 r2 r3 r4 r5 r6 r7 ----------------------------------------------------------------------- АЛГО Via-16 В ГРАФИЧЕСКОМ ВИДЕ : (вычислять для Decrypt/Hash в порядке сверху вниз) ( - // - Crypt/DeHash в порядке снизу вверх) Наксоривать на данные побайтно d0 d1 d2 d3 d4 d5 d6 d7 следующие треугольники : r0*d3^r4 r0*d3^r4 r0*d3^r4 r0*d3^r4 r1*d2^r5 r1*d2^r5 r1*d2^r5 r2*d1^r6 r2*d1^r6 r3*d0^r7 r0*d4^r4 r0*d4^r4 r0*d4^r4 r0*d4^r4 r1*d5^r5 r1*d5^r5 r1*d5^r5 r2*d6^r6 r2*d6^r6 r3*d7^r7 r4*d7^r0 r4*d7^r0 r4*d7^r0 r4*d7^r0 r5*d6^r1 r5*d6^r1 r5*d6^r1 r6*d5^r2 r6*d5^r2 r7*d4^r3 r4*d0^r0 r4*d0^r0 r4*d0^r0 r4*d0^r0 r5*d1^r1 r5*d1^r1 r5*d1^r1 r6*d2^r2 r6*d2^r2 r7*d3^r3 Проделать это перед DES и после DES. ----------------------------------------------------------------------- Идея реализации Алго состоит из 4-х треугольников. В каждом треугольнике нужно вычислить по 10-ть произведений. На каждый байт данных наксорить по 5-ть. Но ведь в системе команд MMX есть команда PMULLW, которая считает сразу по 4-е произведения ! И выполняется всего за два такта на P5 и за один на P6. Надо ею и воспользоваться !!! В итоге отбеливание вычисляется исполнением всего 62-х команд процессора : ----------------------------------------------------------------------- ПРОТЕСТИРОВАННАЯ НАИБЫСТРЕЙШАЯ ПРОЦЕДУРА ОТБЕЛИВАНИЯ MMX (C) Ethereal ;До главного цикла (присвоение значений константам) db 00fh, 076h, 0f6h ; pcmpeqd mm6, mm6 db 00fh, 0efh, 0ffh ; pxor mm7, mm7 db 00fh, 071h, 0d6h, 008h ; psrlw mm6, 8 ;Процедура отбеливания Decrypt/Hash. Данные esi-edi. Ключ отбеливания ebx-ebp mov ecx, ebx mov edx, ebp bswap ecx bswap edx db 00fh, 06eh, 0c6h ; movd mm0, esi db 00fh, 06eh, 0c9h ; movd mm1, ecx db 00fh, 060h, 0c7h ; punpcklbw mm0, mm7 db 00fh, 060h, 0cfh ; punpcklbw mm1, mm7 db 00fh, 0d5h, 0c1h ; pmullw mm0, mm1 db 00fh, 0dbh, 0c6h ; pand mm0, mm6 db 00fh, 067h, 0c7h ; packuswb mm0, mm7 db 00fh, 07eh, 0c0h ; movd eax, mm0 xor eax, edx xor edi, eax shl eax, 8 xor edi, eax shl eax, 8 xor edi, eax shl eax, 8 xor edi, eax ; db 00fh, 06eh, 0c3h ; movd mm0, ebx db 00fh, 06eh, 0cfh ; movd mm1, edi db 00fh, 06eh, 0d2h ; movd mm2, edx db 00fh, 060h, 0c7h ; punpcklbw mm0, mm7 db 00fh, 060h, 0cfh ; punpcklbw mm1, mm7 db 00fh, 060h, 0d7h ; punpcklbw mm2, mm7 db 00fh, 0d5h, 0c1h ; pmullw mm0, mm1 db 00fh, 0d5h, 0cah ; pmullw mm1, mm2 db 00fh, 0dbh, 0c6h ; pand mm0, mm6 db 00fh, 0dbh, 0ceh ; pand mm1, mm6 db 00fh, 067h, 0c7h ; packuswb mm0, mm7 db 00fh, 067h, 0cfh ; packuswb mm1, mm7 db 00fh, 07eh, 0c0h ; movd eax, mm0 db 00fh, 07eh, 0cah ; movd edx, mm1 xor eax, ebp xor edx, ecx xor esi, eax shrd eax, edx, 8 xor esi, edx shr edx, 8 xor esi, eax shrd eax, edx, 8 shr edx, 8 xor esi, eax shrd eax, edx, 8 xor esi, eax ; db 00fh, 06eh, 0c5h ; movd mm0, ebp db 00fh, 06eh, 0ceh ; movd mm1, esi db 00fh, 060h, 0c7h ; punpcklbw mm0, mm7 db 00fh, 060h, 0cfh ; punpcklbw mm1, mm7 db 00fh, 0d5h, 0c1h ; pmullw mm0, mm1 db 00fh, 0dbh, 0c6h ; pand mm0, mm6 db 00fh, 067h, 0c7h ; packuswb mm0, mm7 db 00fh, 07eh, 0c0h ; movd eax, mm0 xor eax, ebx xor edi, eax shr eax, 8 xor edi, eax shr eax, 8 xor edi, eax shr eax, 8 xor edi, eax