PDA

Просмотр полной версии : Поделитесь классом для работы с RSA


ZagZag
27.10.2009, 11:37
Уже не первый день сижу и изобретаю велосипед.
Написал процедуру генерации ключей, но с процедурой шифрования сплошные траблы.
Использую библиотеку 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


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