Помогите подобрать симмитричный криптоалгоритм удовлетворяющий следующим условиям: 1) Очень высокая производительность (важнейшее условие) 2) Достаточная криптостойкость (но ей можно подертвовать в пользу производительности) 4) Длина ключа 96-256 бит 5) Наличие оптимизированого исходника на си 6) Возможность оптимальной работы на amd64 (производительность должна повышаться при компиляции в 64 битный код). 7) Очень жалательно отсутствие таблиц (s-boxes), малый размер кода и простая реализация. За одно, также подскажите какую-нибудт реализацию ассиметрики (rsa, dsa, и.т.д) подходящую под следующие требования: 1) Наличие исходника на сях, компилирующегося в 64 битный код (обязательно) 2) Наличие совместимого с ним исходника на асме (32 битный код), заточеного под минимальный размер кода (желательно). 3) Простота и понятность исходников приветствуется. По части RSA мне удавалось найти только громдные библиотеки (crypto++, ssl, pgp и.т.д.) содержищие просто огромного размера и фиговой производительности код, который к тому же будет проблематично оттуда извлечь. Еще удавалось найти парочку библиотек для работы с большими числами (вроде BigLib, mircal), но они либо так же монструозны, либо идут без сорцов и непригодны для компиляции в 64. Короче говоря, в гугл меня посылать не стоит (я там был и не раз). Просто если кто-нибудь увидит сорцы хоть немного подходящие под эти требования, то прошу отписатсья в теме.
PE386 Бери любую реализацию алгоритма из разряда "Сеть Файстеля", это ГОСТ28147-89, ТwoFish и ряд других. А что по поводу таблиц, то один раз с генерируй хорошую, на мертво вбей в тело кода! Это не ухудшит шифрование, но надо подобрать хорошую таблицу!!! Ключ генерируй хэшируя парольную фразу, пункт 6, можешь не бояться ГОСТ28147-89 еще очень даже силен! >За одно, также подскажите как Ты что нить об опенсорсе слышал?
А ты внимательно читал? Опенсорс это по большей частью огромная куча говна, из которой даже извлечь нужный код проблематично. Ну а размеры этого когда обычно далеки от идеала... Помимо известного опенсорса, я думаю существуют малоизвестные простые примеры и библиотеки, (среди говна можно найти конфетку), о которых я собственно и спрашиваю.
К слову о производительности. Тест скорости криптоалгоритмов в TrueCrypt выдал лучший результат 65мб/с у TwoFish. Мне же необходимо получить скорости порядка 200-250мб/с
А как насчет Tiny Encryption Algorithm (TEA) http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm Вроде бы подходит под твои требования. Или я чего-то путаю?
qtime Представленные реализации ТЕА, BTEA, XTEA работают только на 32битных числах. Под 64битную арифметику необходимо переделать.
Немного переделал реализацию blowfish от Шнаера, получил 115мб/с (на одно ядро процессора). Если уменьшить число раундов до 8, то скорость удваивается (хотя понижается криптостойкость). Единственный недостаток - наличие s-boxes.
странно, но tea показал производительность всего 42мб/с непонятно, почему столь простой алгоритм показывает такую хреновую производительность. к примеру, если в основном цикле алгоритма Код (Text): for (i=0; i < 32; i++) { sum += delta; v0 += (v1<<4)+k0 ^ v1+sum ^ (v1>>5)+k1; v1 += (v0<<4)+k2 ^ v0+sum ^ (v0>>5)+k3; } закомментировать одну из строчек шифрующих данные, то скорость резко поднимается до 160.
потому что 32 раунда. но еще есть версии сбольшим их числом, отсюда вывод - уменьшиить количество раундов до 16, но все равно TEA медленный алго а RC4 раз в 5 быстрее TEA(32) . а так RC4 - и никаких таблиц и с режимами шифрования мудить не надо. тебе как раз наверное RC4 лучше всего и подойдет
rc4 дает те же 115мб/с, что и blowfish. в общем то неплохо, наверно остановлюсь на нем. ок, посмотрю что это за зверь и скажу о нем свое мнение
возьми RSAREF - прекрасно компилится из сишного сорца и под 32 и под 64 бита, маленький размер - и от RSA Labs (там кроме RSA собственно есть и DES и 3DES). А насчет асм кода - при компиляции lst файл создай просто - и будет тебе асм код с комментами в виде частей сорца.
Написал свою реализацию rc4 на фасме, получил скорость порядка 210-215мб/с (в среднем в два раза выше, чем оптимизированый си код скомпиленый с полной оптимизацией в vc2006). Код писался от фонаря (я в оптимизации не спец), поэтому результат меня удивляет. Неужели VC совсем не имеет никакого оптимизатора? Код (Text): format MS COFF include '%fasminc%\win32a.inc' public rc4_prepare_key as '_rc4_prepare_key@12' public rc4_crypt as '_rc4_crypt@12' struct rc4_key state rb 256 x db ? y db ? ends rc4_prepare_key: ; u_char *key_data, int key_len, rc4_key *key push ebp mov ebp, esp push esi push edi push edx push ebx ; mov esi, [ebp+10h] ; esi - key mov edi, [ebp+08h] ; edi - key_data mov byte [esi+rc4_key.x], 0 mov byte [esi+rc4_key.y], 0 lea esi, [esi+rc4_key.state] ; create initial state xor ecx, ecx @@: mov byte [esi+ecx], cl inc ecx cmp ecx, 255 jbe @B ; ebx - idx1, edx - idx2 xor ebx, ebx xor edx, edx ; mix state and key data xor ecx, ecx @@: add dl, byte [edi+ebx] ; idx2 += key_data[idx1] mov ah, byte [esi+ecx] ; t = state[num] add dl, ah ; idx2 += t ; mov al, byte [esi+edx] ; al = state[idx2] mov byte [esi+ecx], al ; state[num] = state[idx2] mov byte [esi+edx], ah ; state[idx2] = t; ; lea ax, [bx+1] ; div byte [ebp+0Ch] ; idx1 = (idx1 + 1) % key_len; mov bl, ah ; ; inc ecx cmp ecx, 255 jbe @B ; pop ebx pop edx pop edi pop esi pop ebp retn 0Ch rc4_crypt: ; u_char *buf, int len, rc4_key *key push ebp mov ebp, esp push esi push edi push edx push ebx ; load params mov esi, [ebp+10h] ; esi - key mov edi, [ebp+08h] ; edi - buf mov ecx, [ebp+0Ch] ; ecx - len ; init regs movzx eax, [esi+rc4_key.x] ; eax - x movzx ebx, [esi+rc4_key.y] ; ebx - y lea ebp, [esi+rc4_key.state] ; ebp - state ; crypt loop @@: inc al ; x++; mov dl, byte [ebp+eax] ; t = state[x] add bl, dl ; y += t mov dh, byte [ebp+ebx] ; z = state[y] mov byte [ebp+eax], dh ; state[x] = z mov byte [ebp+ebx], dl ; state[y] = t add dl, dh movzx edx, dl ; idx = state[x] + state[y]; mov dh, [ebp+edx] ; xor byte [edi], dh ; *buf ^= state[idx] inc edi ; buf++ dec ecx ; len-- jnz @B ; store params mov [esi+rc4_key.x], al mov [esi+rc4_key.y], bl ; pop ebx pop edx pop edi pop esi pop ebp retn 0Ch Вот код, может кто даст советы по дальнейшему ускорению алгоритма. Сейчас буду писать 64 битную версию этого кода.
По надежности и быстродействии самый оптимальный RC4 или RC6 (по медленней будет) Да и реолизовать их проще (разрядность не вожна так как оперирует байтами но можно модиффицировать и на большую разрядность)
а вот моя реалищзация RC4 на FASM, насчет оптимизации тоже ничего сказать не могу ибо не спец Код (Text): ; ----------------------------------------------------- ; ; RC4 Encryption Algorithm ( Stream Cipher ) ; ; by RSA Data Security, Inc ; ; ; ; Block Size: N/A ; ; Max Key Size: 2048 bits ; ; ----------------------------------------------------- ; rc4_table db 256 dup(?) proc RC4_Init Key:PBYTE,KeySize:DWORD push ebx edi esi mov edi,[Key] mov esi,[KeySize] xor ecx,ecx @@: mov [rc4_table+ecx],cl inc ecx cmp ecx,255 jle @b shr esi,3 je @_rc4_init_end cmp esi,256 jle @f mov esi,256 @@: xor ecx,ecx xor ebx,ebx @@: mov eax,ecx xor edx,edx div si add bl,[edi+edx] mov ah,[rc4_table+ecx] add bl,ah mov al,[rc4_table+ebx] mov [rc4_table+ecx],al mov [rc4_table+ebx],ah inc ecx cmp ecx,255 jle @b @_rc4_init_end: pop esi edi ebx ret endp proc RC4_Crypt Data:PBYTE,DataSize:DWORD push ebx edi esi mov edi,[Data] xor eax,eax xor ecx,ecx xor edx,edx @@: cmp ecx,[DataSize] jnl @f mov esi,ecx inc esi and esi,255 mov al,[rc4_table+esi] add dl,al mov bl,[rc4_table+edx] mov [rc4_table+esi],bl mov [rc4_table+edx],al add al,bl mov al,[rc4_table+eax] xor [edi+ecx],al inc ecx jmp @b @@: pop esi edi ebx ret endp
Вот код под 64 бита Код (Text): format MS64 COFF include '%fasminc%\win32a.inc' public rc4_prepare_key as 'rc4_prepare_key' public rc4_crypt as 'rc4_crypt' struct rc4_key state rb 256 x db ? y db ? ends rc4_prepare_key: ; u_char *key_data, int key_len, rc4_key *key push rbx mov [r8+rc4_key.x], 0 mov [r8+rc4_key.y], 0 mov ebx, edx ; create initial state xor r11, r11 @@: mov byte [r8+r11], r11b inc r11 cmp r11, 255 jbe @B ; r9 - idx1, r10 - idx2 xor r9, r9 xor r10, r10 ; mix state and key data xor r11, r11 @@: add r10b, byte [rcx+r9] ; idx2 += key_data[idx1] mov al, byte [r8+r11] ; t = state[num] add r10b, al ; idx2 += t mov dl, byte [r8+r10] ; z = state[idx2] mov byte [r8+r10], al ; state[idx2] = t mov byte [r8+r11], dl ; state[num] = z lea eax, [r9d+1] ; div bl ; shr eax, 8 ; idx1 = (idx1 + 1) % key_len; mov r9b, al ; inc r11 cmp r11, 255 jbe @B pop rbx ret rc4_crypt: ; u_char *buf, int len, rc4_key *key ; load params movzx r9, byte [r8+rc4_key.x] movzx r10, byte [r8+rc4_key.y] xor rax, rax ; crypt loop @@: inc r9b ; x++ mov al, byte [r8+r9] ; t = state[x] add r10b, al ; y += t mov r11b, byte [r8+r10] ; z = state[y] mov byte [r8+r9], r11b ; state[x] = z mov byte [r8+r10], al ; state[y] = t add al, r11b ; idx = t+z mov al, byte [r8+rax] ; xor byte [rcx], al ; *buf ^= state[idx] inc rcx ; buf++ dec rdx ; len-- jnz @B ; store params mov byte [r8+rc4_key.x], r9b mov byte [r8+rc4_key.y], r10b ret Может кто-нибудь подскажет еще и оптимизированую реализацию md5?