Поделитесь классом для работы с RSA

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ZagZag, 27 Oct 2009.

  1. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Уже не первый день сижу и изобретаю велосипед.
    Написал процедуру генерации ключей, но с процедурой шифрования сплошные траблы.
    Использую библиотеку gmp для работы с большими числами, но лучше бы от нее избавиться.
    Прошу ссылок на вменяемые классы для работы с RSA
     
  2. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    http://openssl.org/
     
  3. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Мне нужен класс только для RSA. Без сторонних библиотек и наворотов.
     
  4. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    ну подруби только то, что нужно, из хедеров.
     
  5. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Всеравно эта либа огромная. Вчера полвечера проплясал с бубном в одной руке и напильником в другой, пытаясь скомпилить OpenSSL без лишних модулей. MD5, HMAC и SHA отключить так и не удалось. В итоге получилась либа libcrypto.a 2Мб и libssl.a 390Кб, а простой экзешник с генерацией ключей и шифрованием файла занимает 700+ Кб.
    Еще линкер требует из-за libcrypto подключать libgdi32, т.к. отсутствуют функции CreateDC и т.п.
    К плюсам OpenSSL можно отнести простоту написания программы, все очень удобно.
    Но мне придется искать другие варианты. Кроме OpenSSL еще что-нибудь можете посоветовать?
     
  6. ZagZag

    ZagZag Elder - Старейшина

    Joined:
    22 Feb 2007
    Messages:
    149
    Likes Received:
    22
    Reputations:
    1
    Вот релиз от z0mbie, но на TASM32: http://z0mbie.daemonlab.org/rsalib6.zip
    Размер 3Кб, но как его приделать к проекту на C++?
     
  7. desTiny

    desTiny Elder - Старейшина

    Joined:
    4 Feb 2007
    Messages:
    1,006
    Likes Received:
    444
    Reputations:
    94
    Code:
    
    ; input:
    ;   IN  ECX      = length    = l  (in BITs)
    ;   IN  ESI[ECX] = dividend  = x
    ;   IN  EDI[ECX] = divisor   = y
    ;   OUT EAX[ECX] = result    = d
    ;   OUT EDX[ECX] = remainder = m
    ; modify:
    ;   none
    
    x                       =       [esp].pusha_esi
    y                       =       [esp].pusha_edi
    d                       =       [esp].pusha_eax
    m                       =       [esp].pusha_edx
    
    divmod:                 pusha
    
                            lea     ebx, [ecx-1]    ; for (i=KEYLEN-1; i>=0; i--)
    
                            shr     ecx, 5          ; EBP = length in DWORD's
                            mov     ebp, ecx
    
                            mov     edi, eax        ; d = 0
                            xor     eax, eax
                            rep     stosd
    
                            mov     edi, edx        ; m = 0
                            mov     ecx, ebp
                            rep     stosd
    __main_cycle:                                   ; {//for i
    
                            mov     edi, d          ;   d <<= 1
                            mov     ecx, ebp
                            clc
                            RCL_CYCLE
    
                            mov     eax, x          ;   CF = x.bit[i]
                            bt      [eax], ebx
                            ; CF
    
                            mov     edi, edx        ;   m = (m << 1) | CF
                            mov     ecx, ebp
                            RCL_CYCLE
    
                            mov     edi, edx        ;   if (m >= y)
                            mov     esi, y          ;   {
                            mov     ecx, ebp
                            CMP_CYCLE __b, __ae
    __ae:
                            mov     ecx, ebp        ;     m -= y
                            clc
                            SBB_CYCLE
    
                            mov     eax, d          ;     d |= 1
                            or      byte ptr [eax], 1
    __b:                                            ;   }
                            dec     ebx
                            jns     __main_cycle    ; }//for i
    
                            popa
                            retn
    
    
    Если деление реализовано так, то работать оно будет меедлеенно