Windows e CryptGenKey
Suponho que quem ler isto conheça, ou pelo menos tenho noção, de como funciona o RSA. Com a API do Windows é-nos permitido gerar novas chaves, mas o expoente público (também conhecido por e) é sempre 65537 (0x10001). E se quisermos usar outro que não este?
Para minha surpresa, é impossível. Com o Enhanced Provider da Microsoft (rsaenh.dll), verifiquei que o valor 65537 está mesmo hardcoded no código; para gerar chaves com outro expoente temos de alterar o dll. Ao analisar o binário, rapidamente chegamos à função 6800FBD9 - é nesta que a geração é efectuada. Primeira paragem:
.text:6800FC34 push eax ; int
.text:6800FC35 mov byte ptr [ebp+var_4], 1
.text:6800FC39 mov byte ptr [ebp+var_4+1], bl
.text:6800FC3C mov byte ptr [ebp+var_4+2], 1
.text:6800FC40 mov byte ptr [ebp+var_4+3], bl ; var_4 = 0x00010001 == 65537
.text:6800FC43 mov [ebp+var_C], 3 ; length(var_4) = 3 bytes
Vemos aqui o valor e o seu tamanho a serem colocados numa variável. Portanto será aqui o primeiro lugar a alterar para o valor pretendido (e.g. 3 ou 17). Mas não fica por aqui.
.text:6800FC7D push eax
.text:6800FC7E push [ebp+var_C] ; sizeof(10001)
.text:6800FC81 lea eax, [ebp+var_4]
.text:6800FC84 push eax ; Ptr to 0x10001
.text:6800FC85 push esi ; Keysize (bits)
.text:6800FC86 call sub_68027FDD ; Generate public/private keypair
Vemos aqui o expoente público a ser passado à função que gera os a chave pública e privada. Adiante:
.text:6800FD8A push [ebp+var_10] ; Prime #1
.text:6800FD8D push [ebp+var_8] ; Prime #2
.text:6800FD90 push 10001h ; push 65537 -- public exponent
.text:6800FD95 push [ebp+arg_14] ; Keysize in bits
.text:6800FD98 push eax ; PRIVATEKEYBLOB (out)
.text:6800FD99 push dword ptr [edi] ; PUBLICKEYBLOB (in)
.text:6800FD9B call sub_6801F9C0 ; Creates the PUBLICKEYBLOB/PRIVATEKEYBLOB structure
Vemos novamente ali o valor hardcoded a ser usado. Temos de mudar o valor colocado na stack para o desejado. No final desta função, teremos uma chave gerada com o expoente que queremos. Para mais info sobre as estruturas de saída desta função, vejam isto.
FIQUEI. TODA. MOLHADINHA.
Yes