Saltar al contenido

RSA: Obtener exponente y módulo dado un público key

Posterior a consultar especialistas en el tema, programadores de diversas áreas y profesores hemos dado con la respuesta al dilema y la dejamos plasmada en esta publicación.

Solución:

Depende de las herramientas que puedas usar. Dudo que también haya un JavaScript que pueda hacerlo directamente dentro del navegador. También depende si es puntual (siempre lo mismo key) o si necesita crear un script.

Línea de comandos / OpenSSL

Si desea utilizar algo como OpenSSL en una línea de comandos de Unix, puede hacer lo siguiente. Asumo que eres público.key archivo contiene algo como esto:

-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAmBAjFv+29CaiQqYZIw4P
J0q5Qz2gS7kbGleS3ai8Xbhu5n8PLomldxbRz0RpdCuxqd1yvaicqpDKe/TT09sR
mL1h8Sx3Qa3EQmqI0TcEEqk27Ak0DTFxuVrq7c5hHB5fbJ4o7iEq5MYfdSl4pZax
UxdNv4jRElymdap8/iOo3SU1RsaK6y7kox1/tm2cfWZZhMlRFYJnpoXpyNYrp+Yo
CNKxmZJnMsS698kaFjDlyznLlihwMroY0mQvdD7dCeBoVlfPUGPAlamwWyqtIU+9
5xVkSp3kxcNcNb/mePSKQIPafQ1sAmBKPwycA/1I5nLzDVuQa95ZWMn0JkphtFIh
HQIDAQAB
-----END PUBLIC KEY-----

Entonces, los comandos serían:

PUBKEY=`grep -v -- ----- public.key | tr -d 'n'`

Luego, puede mirar la estructura ASN.1:

echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i

Esto debería darte algo como esto:

    0:d=0  hl=4 l= 290 cons: SEQUENCE          
    4:d=1  hl=2 l=  13 cons:  SEQUENCE          
    6:d=2  hl=2 l=   9 prim:   OBJECT            :rsaEncryption
   17:d=2  hl=2 l=   0 prim:   NULL              
   19:d=1  hl=4 l= 271 prim:  BIT STRING 

El módulo y el exponente público están en la última CADENA DE BITS, desplazamiento 19, así que use -strparse:

 echo $PUBKEY | base64 -d | openssl asn1parse -inform DER -i -strparse 19

Esto le dará el módulo y el exponente público, en hexadecimal (los dos ENTEROS):

    0:d=0  hl=4 l= 266 cons: SEQUENCE          
    4:d=1  hl=4 l= 257 prim:  INTEGER           :98102316FFB6F426A242A619230E0F274AB9433DA04BB91B1A5792DDA8BC5DB86EE67F0F2E89A57716D1CF4469742BB1A9DD72BDA89CAA90CA7BF4D3D3DB1198BD61F12C7741ADC4426A88D1370412A936EC09340D3171B95AEAEDCE611C1E5F6C9E28EE212AE4C61F752978A596B153174DBF88D1125CA675AA7CFE23A8DD253546C68AEB2EE4A31D7FB66D9C7D665984C951158267A685E9C8D62BA7E62808D2B199926732C4BAF7C91A1630E5CB39CB96287032BA18D2642F743EDD09E0685657CF5063C095A9B05B2AAD214FBDE715644A9DE4C5C35C35BFE678F48A4083DA7D0D6C02604A3F0C9C03FD48E672F30D5B906BDE5958C9F4264A61B452211D
  265:d=1  hl=2 l=   3 prim:  INTEGER           :010001

Probablemente esté bien si siempre es lo mismo. keypero probablemente no sea muy conveniente ponerlo en un script.

Alternativamente (y esto podría ser más fácil de poner en un script),

openssl rsa -pubin -inform PEM -text -noout < public.key

devolverá esto:

Modulus (2048 bit):
    00:98:10:23:16:ff:b6:f4:26:a2:42:a6:19:23:0e:
    0f:27:4a:b9:43:3d:a0:4b:b9:1b:1a:57:92:dd:a8:
    bc:5d:b8:6e:e6:7f:0f:2e:89:a5:77:16:d1:cf:44:
    69:74:2b:b1:a9:dd:72:bd:a8:9c:aa:90:ca:7b:f4:
    d3:d3:db:11:98:bd:61:f1:2c:77:41:ad:c4:42:6a:
    88:d1:37:04:12:a9:36:ec:09:34:0d:31:71:b9:5a:
    ea:ed:ce:61:1c:1e:5f:6c:9e:28:ee:21:2a:e4:c6:
    1f:75:29:78:a5:96:b1:53:17:4d:bf:88:d1:12:5c:
    a6:75:aa:7c:fe:23:a8:dd:25:35:46:c6:8a:eb:2e:
    e4:a3:1d:7f:b6:6d:9c:7d:66:59:84:c9:51:15:82:
    67:a6:85:e9:c8:d6:2b:a7:e6:28:08:d2:b1:99:92:
    67:32:c4:ba:f7:c9:1a:16:30:e5:cb:39:cb:96:28:
    70:32:ba:18:d2:64:2f:74:3e:dd:09:e0:68:56:57:
    cf:50:63:c0:95:a9:b0:5b:2a:ad:21:4f:bd:e7:15:
    64:4a:9d:e4:c5:c3:5c:35:bf:e6:78:f4:8a:40:83:
    da:7d:0d:6c:02:60:4a:3f:0c:9c:03:fd:48:e6:72:
    f3:0d:5b:90:6b:de:59:58:c9:f4:26:4a:61:b4:52:
    21:1d
Exponent: 65537 (0x10001)

Java

Depende del formato de entrada. Si es un certificado X.509 en un almacén de claves, utilice (RSAPublicKey)cert.getPublicKey(): este objeto tiene dos captadores para el módulo y el exponente.

Si está en el formato anterior, es posible que desee utilizar BouncyCastle y su PEMReader para leerlo No he probado el siguiente código, pero se vería más o menos así:

PEMReader pemReader = new PEMReader(new FileReader("file.pem"));
Object obj = pemReader.readObject();
pemReader.close();
if (obj instanceof X509Certificate) 
   // Just in case your file contains in fact an X.509 certificate,
   // useless otherwise.
   obj = ((X509Certificate)obj).getPublicKey();

if (obj instanceof RSAPublicKey) 
   // ... use the getters to get the BigIntegers.

(También puede usar BouncyCastle de manera similar en C#).

Tenga cuidado con el 00 inicial que puede aparecer en el módulo al usar:

openssl rsa -pubin -inform PEM -text -noout < public.key

El módulo de ejemplo contiene 257 bytes en lugar de 256 bytes debido a ese 00, que se incluye porque el 9 en 98 parece un número con signo negativo.

Principalmente para mi propia referencia, así es como se obtiene de un privado key generado por ssh-keygen

openssl rsa -text -noout -in ~/.ssh/id_rsa

Por supuesto, esto solo funciona con el privado. key.

Al final de todo puedes encontrar las críticas de otros programadores, tú de igual manera eres capaz mostrar el tuyo si lo crees conveniente.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *