Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Поделитесь классом для работы с RSA (https://forum.antichat.xyz/showthread.php?t=151497)

ZagZag 27.10.2009 11:37

Поделитесь классом для работы с RSA
 
Уже не первый день сижу и изобретаю велосипед.
Написал процедуру генерации ключей, но с процедурой шифрования сплошные траблы.
Использую библиотеку gmp для работы с большими числами, но лучше бы от нее избавиться.
Прошу ссылок на вменяемые классы для работы с RSA

desTiny 27.10.2009 13:46

http://openssl.org/

ZagZag 27.10.2009 14:44

Мне нужен класс только для RSA. Без сторонних библиотек и наворотов.

desTiny 27.10.2009 14:56

ну подруби только то, что нужно, из хедеров.

ZagZag 28.10.2009 10:17

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

ZagZag 28.10.2009 13:04

Вот релиз от z0mbie, но на TASM32: http://z0mbie.daemonlab.org/rsalib6.zip
Размер 3Кб, но как его приделать к проекту на C++?

desTiny 28.10.2009 14:03

Код:


; 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

Если деление реализовано так, то работать оно будет меедлеенно


Время: 07:01