Помогите выбрать криптоалгоритмы

Тема в разделе "WASM.WIN32", создана пользователем PE386, 29 авг 2006.

  1. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    Помогите подобрать симмитричный криптоалгоритм удовлетворяющий следующим условиям:

    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.

    Короче говоря, в гугл меня посылать не стоит (я там был и не раз). Просто если кто-нибудь увидит сорцы хоть немного подходящие под эти требования, то прошу отписатсья в теме.
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    PE386
    Бери любую реализацию алгоритма из разряда "Сеть Файстеля", это ГОСТ28147-89, ТwoFish и ряд других. А что по поводу таблиц, то один раз с генерируй хорошую, на мертво вбей в тело кода! Это не ухудшит шифрование, но надо подобрать хорошую таблицу!!! Ключ генерируй хэшируя парольную фразу, пункт 6, можешь не бояться ГОСТ28147-89 еще очень даже силен! :)

    >За одно, также подскажите как
    Ты что нить об опенсорсе слышал?
     
  3. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    А ты внимательно читал?

    Опенсорс это по большей частью огромная куча говна, из которой даже извлечь нужный код проблематично. Ну а размеры этого когда обычно далеки от идеала...
    Помимо известного опенсорса, я думаю существуют малоизвестные простые примеры и библиотеки, (среди говна можно найти конфетку), о которых я собственно и спрашиваю.
     
  4. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    К слову о производительности. Тест скорости криптоалгоритмов в TrueCrypt выдал лучший результат 65мб/с у TwoFish. Мне же необходимо получить скорости порядка 200-250мб/с
     
  5. qtime

    qtime New Member

    Публикаций:
    0
    Регистрация:
    29 авг 2006
    Сообщения:
    1
    А как насчет Tiny Encryption Algorithm (TEA)
    http://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm

    Вроде бы подходит под твои требования.

    Или я чего-то путаю?
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    qtime
    Представленные реализации ТЕА, BTEA, XTEA работают только на 32битных числах. Под 64битную арифметику необходимо переделать.
     
  7. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    Немного переделал реализацию blowfish от Шнаера, получил 115мб/с (на одно ядро процессора). Если уменьшить число раундов до 8, то скорость удваивается (хотя понижается криптостойкость).
    Единственный недостаток - наличие s-boxes.
     
  8. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    libtomcrypt + libtommath
     
  9. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    странно, но tea показал производительность всего 42мб/с
    непонятно, почему столь простой алгоритм показывает такую хреновую производительность.
    к примеру, если в основном цикле алгоритма

    Код (Text):
    1. for (i=0; i < 32; i++)
    2.      {                            
    3.          sum += delta;
    4.          v0 += (v1<<4)+k0 ^ v1+sum ^ (v1>>5)+k1;
    5.          v1 += (v0<<4)+k2 ^ v0+sum ^ (v0>>5)+k3;        
    6.      }
    закомментировать одну из строчек шифрующих данные, то скорость резко поднимается до 160.
     
  10. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    Быстрее потоковых шифров все равно ничего не придумаешь - RC4, например.
     
  11. BaGiE

    BaGiE New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2005
    Сообщения:
    84
    Адрес:
    Mordor
    потому что 32 раунда. но еще есть версии сбольшим их числом, отсюда вывод - уменьшиить количество раундов до 16, но все равно TEA медленный алго а RC4 раз в 5 быстрее TEA(32) . а так RC4 - и никаких таблиц и с режимами шифрования мудить не надо. тебе как раз наверное RC4 лучше всего и подойдет
     
  12. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    повторюсь - libtomcrypt / libtommath
     
  13. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    rc4 дает те же 115мб/с, что и blowfish. в общем то неплохо, наверно остановлюсь на нем.

    ок, посмотрю что это за зверь и скажу о нем свое мнение :)
     
  14. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    возьми RSAREF - прекрасно компилится из сишного сорца и под 32 и под 64 бита, маленький размер - и от RSA Labs (там кроме RSA собственно есть и DES и 3DES).
    А насчет асм кода - при компиляции lst файл создай просто - и будет тебе асм код с комментами в виде частей сорца.
     
  15. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    [deleted]
     
  16. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    Написал свою реализацию rc4 на фасме, получил скорость порядка 210-215мб/с (в среднем в два раза выше, чем оптимизированый си код скомпиленый с полной оптимизацией в vc2006).
    Код писался от фонаря (я в оптимизации не спец), поэтому результат меня удивляет. Неужели VC совсем не имеет никакого оптимизатора?

    Код (Text):
    1. format MS COFF
    2.  
    3. include '%fasminc%\win32a.inc'
    4.  
    5. public rc4_prepare_key as '_rc4_prepare_key@12'
    6. public rc4_crypt       as '_rc4_crypt@12'
    7.  
    8. struct rc4_key
    9.   state rb 256
    10.   x     db ?
    11.   y     db ?
    12. ends
    13.  
    14. rc4_prepare_key: ; u_char *key_data, int key_len, rc4_key *key
    15.   push      ebp
    16.   mov       ebp, esp
    17.   push      esi
    18.   push      edi
    19.   push      edx
    20.   push      ebx
    21.   ;
    22.   mov       esi, [ebp+10h]  ; esi - key
    23.   mov       edi, [ebp+08h]  ; edi - key_data
    24.   mov       byte [esi+rc4_key.x], 0
    25.   mov       byte [esi+rc4_key.y], 0
    26.   lea       esi, [esi+rc4_key.state]
    27.   ; create initial state
    28.   xor       ecx, ecx
    29. @@:
    30.   mov       byte [esi+ecx], cl
    31.   inc       ecx
    32.   cmp       ecx, 255
    33.   jbe       @B
    34.   ; ebx - idx1, edx - idx2
    35.   xor       ebx, ebx
    36.   xor       edx, edx
    37.   ; mix state and key data
    38.   xor       ecx, ecx
    39. @@:
    40.   add       dl, byte [edi+ebx] ; idx2 += key_data[idx1]
    41.   mov       ah, byte [esi+ecx] ; t = state[num]
    42.   add       dl, ah             ; idx2 += t
    43.   ;
    44.   mov       al, byte [esi+edx] ; al = state[idx2]
    45.   mov       byte [esi+ecx], al ; state[num]  = state[idx2]
    46.   mov       byte [esi+edx], ah ; state[idx2] = t;
    47.   ;
    48.   lea       ax, [bx+1]         ;
    49.   div       byte [ebp+0Ch]     ; idx1 = (idx1 + 1) % key_len;
    50.   mov       bl, ah             ;
    51.   ;
    52.   inc       ecx
    53.   cmp       ecx, 255
    54.   jbe       @B
    55.   ;
    56.   pop       ebx
    57.   pop       edx
    58.   pop       edi
    59.   pop       esi
    60.   pop       ebp
    61.   retn      0Ch
    62.  
    63.  
    64. rc4_crypt:       ; u_char *buf, int len, rc4_key *key
    65.   push      ebp
    66.   mov       ebp, esp
    67.   push      esi
    68.   push      edi
    69.   push      edx
    70.   push      ebx
    71.   ; load params
    72.   mov       esi, [ebp+10h]           ; esi - key
    73.   mov       edi, [ebp+08h]           ; edi - buf
    74.   mov       ecx, [ebp+0Ch]           ; ecx - len
    75.   ; init regs
    76.   movzx     eax, [esi+rc4_key.x]     ; eax - x
    77.   movzx     ebx, [esi+rc4_key.y]     ; ebx - y
    78.   lea       ebp, [esi+rc4_key.state] ; ebp - state
    79.   ; crypt loop
    80. @@:
    81.   inc       al                       ; x++;
    82.   mov       dl, byte [ebp+eax]       ; t = state[x]
    83.   add       bl, dl                   ; y += t
    84.   mov       dh, byte [ebp+ebx]       ; z = state[y]
    85.   mov       byte [ebp+eax], dh       ; state[x] = z
    86.   mov       byte [ebp+ebx], dl       ; state[y] = t
    87.   add       dl, dh
    88.   movzx     edx, dl                  ; idx = state[x] + state[y];
    89.   mov       dh, [ebp+edx]            ;
    90.   xor       byte [edi], dh           ; *buf ^= state[idx]
    91.   inc       edi                      ;  buf++
    92.   dec       ecx                      ;  len--
    93.   jnz       @B
    94.   ; store params
    95.   mov       [esi+rc4_key.x], al
    96.   mov       [esi+rc4_key.y], bl
    97.   ;
    98.   pop       ebx
    99.   pop       edx
    100.   pop       edi
    101.   pop       esi
    102.   pop       ebp
    103.   retn      0Ch
    Вот код, может кто даст советы по дальнейшему ускорению алгоритма.
    Сейчас буду писать 64 битную версию этого кода.
     
  17. SWR

    SWR New Member

    Публикаций:
    0
    Регистрация:
    11 май 2006
    Сообщения:
    226
    Адрес:
    Russia
    По надежности и быстродействии самый оптимальный RC4 или RC6 (по медленней будет)
    Да и реолизовать их проще (разрядность не вожна так как оперирует байтами но можно модиффицировать и на большую разрядность)
     
  18. BaGiE

    BaGiE New Member

    Публикаций:
    0
    Регистрация:
    27 мар 2005
    Сообщения:
    84
    Адрес:
    Mordor
    а вот моя реалищзация RC4 на FASM, насчет оптимизации тоже ничего сказать не могу ибо не спец :)
    Код (Text):
    1. ; ----------------------------------------------------- ;
    2. ;       RC4 Encryption Algorithm ( Stream Cipher )      ;
    3. ;              by RSA Data Security, Inc                ;
    4. ;                                                       ;
    5. ; Block Size: N/A                                       ;
    6. ; Max Key Size: 2048 bits                               ;
    7. ; ----------------------------------------------------- ;
    8.  
    9. rc4_table db 256 dup(?)  
    10.  
    11. proc RC4_Init Key:PBYTE,KeySize:DWORD
    12.      push ebx edi esi
    13.      mov edi,[Key]
    14.      mov esi,[KeySize]
    15.      xor ecx,ecx
    16. @@:  mov [rc4_table+ecx],cl
    17.      inc ecx
    18.      cmp ecx,255
    19.      jle @b
    20.      shr esi,3
    21.      je @_rc4_init_end
    22.      cmp esi,256
    23.      jle @f
    24.      mov esi,256
    25. @@:  xor ecx,ecx
    26.      xor ebx,ebx
    27. @@:  mov eax,ecx
    28.      xor edx,edx
    29.      div si
    30.      add bl,[edi+edx]
    31.      mov ah,[rc4_table+ecx]
    32.      add bl,ah
    33.      mov al,[rc4_table+ebx]
    34.      mov [rc4_table+ecx],al
    35.      mov [rc4_table+ebx],ah
    36.      inc ecx
    37.      cmp ecx,255
    38.      jle @b
    39. @_rc4_init_end:
    40.      pop esi edi ebx
    41.      ret
    42. endp
    43.  
    44. proc RC4_Crypt Data:PBYTE,DataSize:DWORD
    45.      push ebx edi esi
    46.      mov edi,[Data]
    47.      xor eax,eax
    48.      xor ecx,ecx
    49.      xor edx,edx
    50. @@:  cmp ecx,[DataSize]
    51.      jnl @f
    52.      mov esi,ecx
    53.      inc esi
    54.      and esi,255
    55.      mov al,[rc4_table+esi]
    56.      add dl,al
    57.      mov bl,[rc4_table+edx]
    58.      mov [rc4_table+esi],bl
    59.      mov [rc4_table+edx],al
    60.      add al,bl
    61.      mov al,[rc4_table+eax]
    62.      xor [edi+ecx],al
    63.      inc ecx
    64.      jmp @b
    65. @@:  pop esi edi ebx
    66.      ret
    67. endp
     
  19. PE386

    PE386 New Member

    Публикаций:
    0
    Регистрация:
    7 авг 2006
    Сообщения:
    127
    Вот код под 64 бита

    Код (Text):
    1. format MS64 COFF
    2.  
    3. include '%fasminc%\win32a.inc'
    4.  
    5. public rc4_prepare_key as 'rc4_prepare_key'
    6. public rc4_crypt       as 'rc4_crypt'
    7.  
    8. struct rc4_key
    9.   state rb 256
    10.   x     db ?
    11.   y     db ?
    12. ends
    13.  
    14. rc4_prepare_key: ; u_char *key_data, int key_len, rc4_key *key
    15.   push      rbx
    16.   mov       [r8+rc4_key.x], 0
    17.   mov       [r8+rc4_key.y], 0
    18.   mov       ebx, edx
    19.   ; create initial state
    20.   xor       r11, r11
    21. @@:
    22.   mov       byte [r8+r11], r11b
    23.   inc       r11
    24.   cmp       r11, 255
    25.   jbe       @B
    26.   ; r9  - idx1, r10 - idx2
    27.   xor       r9, r9
    28.   xor       r10, r10
    29.   ; mix state and key data
    30.   xor       r11, r11
    31. @@:
    32.   add       r10b, byte [rcx+r9] ; idx2 += key_data[idx1]
    33.   mov       al, byte [r8+r11]   ; t = state[num]
    34.   add       r10b, al            ; idx2 += t
    35.   mov       dl, byte [r8+r10]   ; z = state[idx2]
    36.   mov       byte [r8+r10], al   ; state[idx2] = t
    37.   mov       byte [r8+r11], dl   ; state[num] = z
    38.   lea       eax, [r9d+1]        ;
    39.   div       bl                  ;
    40.   shr       eax, 8              ; idx1 = (idx1 + 1) % key_len;
    41.   mov       r9b, al             ;
    42.   inc       r11
    43.   cmp       r11, 255
    44.   jbe       @B
    45.   pop       rbx
    46.   ret
    47.  
    48.  
    49. rc4_crypt:       ; u_char *buf, int len, rc4_key *key
    50.   ; load params
    51.   movzx     r9,  byte [r8+rc4_key.x]
    52.   movzx     r10, byte [r8+rc4_key.y]
    53.   xor       rax, rax
    54.   ; crypt loop
    55. @@:
    56.   inc       r9b                        ; x++
    57.   mov       al, byte [r8+r9]           ; t = state[x]
    58.   add       r10b, al                   ; y += t
    59.   mov       r11b, byte [r8+r10]        ; z = state[y]
    60.   mov       byte [r8+r9], r11b         ; state[x] = z
    61.   mov       byte [r8+r10], al          ; state[y] = t
    62.   add       al, r11b                   ; idx = t+z
    63.   mov       al, byte [r8+rax]          ;
    64.   xor       byte [rcx], al             ; *buf ^= state[idx]
    65.   inc       rcx                        ;  buf++
    66.   dec       rdx                        ;  len--
    67.   jnz       @B
    68.   ; store params
    69.   mov       byte [r8+rc4_key.x], r9b
    70.   mov       byte [r8+rc4_key.y], r10b
    71.   ret
    Может кто-нибудь подскажет еще и оптимизированую реализацию md5?