gchq / CyberChef

The Cyber Swiss Army Knife - a web app for encryption, encoding, compression and data analysis
https://gchq.github.io/CyberChef
Apache License 2.0
28.56k stars 3.22k forks source link

Operation request: RSA Key Modulus #1443

Open mddeff opened 1 year ago

mddeff commented 1 year ago

Summary

Would love to have the ability to calculate an RSA key's modulus. Very helpful in verifying the private key matches the public (x509) cert. Example openssl invocation:

openssl rsa -noout -modulus -in rsa.key

The Parse X.509 certificate already provides the public cert modulus, and in theory a well-crafted recipe would be able to compare both?

Example Input

-----BEGIN PRIVATE KEY-----
someRAndoMkeyMATerial
-----END PRIVATE KEY-----

Example Output

ABCDEF0123456789......
mikecat commented 1 year ago

If what you want is in the output, I guess it can be extracted via "Regular expression" with Output format "Highlight matches" "List capture groups".

I tried to create the recipe, but The "Parse X.509 certificate" operation yielded only this error for all of the 4 Input formats:

Parse X.509 certificate - TypeError in https://gchq.github.io/CyberChef/modules/PublicKey.js on line 2.<br><br>Message: t is null

Here is my input:

-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC3kRUtYGuQR3ak
TQLwf0iXH6MXyM4IS4DYCIlDx/FgR4J+IDWiCkj0/QsjJW4aut2dtAHyOppU7KFi
gz58wGOKpoTxFATaD+0buoPCdvbBmljxb23eEacAi43raNWJxXI7sP1VFlldn5Bp
1ykMHMJxRZizSkYvCu8/vIhVd4n4M+RX66A0vQjLjf4YHjXYBM1CSTTVcr2Cn1H9
YjBZrXxAN+IkTGzG088Q4wNMxeMDEOrhEdq4R6dl2HV51Ld5wroZLYhqg9Rlzcbr
boD3HNkKr9nbhbo5l7kRhq5h8d6PalfAVDJwomVXRZ3PilGGq24ZWeD7uZy7ZuGV
rKVaMyoNAgMBAAECggEALIV0pG/JRtH+VXUULG5CldynesJKLjrZwgu39weMZHST
krGPMIDcFwc0Z07RuIvv6irZef16pvRJZBI+2pTyz5L5lVrsnlLUiDAhes3NpUEh
J1WGSSDw5zHxttHTULnhrdaMatGj1RA5P2Je40AqbLybf4iZIxm80zGPw2LdxKOv
lK86JieYXl5Ia7Tacn8RhHxbA1kDSWbL+DlspyFfUiLfHYuKAhfzVEwaJO6OQPhl
z22GcN2/S47ziDFo13jE36zrgvFQr16Yr3K50bwudu6dLVASJ/e2IszSScz0wRXX
hyzrp/Z6kpP/4sHKtQsuf5TTCJSgU/epbfT4Eq1wgQKBgQDw+tGljpum0scDH+dW
7t0HAvbu1+C42wSjT/jWb107oHZAiMi4uHA0ovy9WYr7ApYrvSLgV7RGSSveQbzd
8JU745Wrj2Q+m9iUXnY2+erGkMCvA+VTvsOyVt7TWa00+uVl7uY2fWNYkEdjZW8/
UxJLB9qHhAKK+/NLLAKPFoAB7QKBgQDDAifdaTTpFUH7oU245Uw8ytz3tJx15zyJ
4CNbnRH25mzQjIJwLTdORw/Nfr4RatCcEKIsDpg9nDHxw1PsZcR+kpc/aK3aSp8k
0/Dohqx9A33gzjuissgS/lD/BLy0kEYfXV1hxbJ8pYQn2Tlf4ch2f+mzmsx9ypjJ
CgGa1gtEoQKBgBTlexaDJkYyEuXXd2UXc30vKaCOgcMl4uIShj56C7im8nooIle6
TqiR1Z7Jy/52O/VxAjw3/r71i2NLiggo25gE5S6qUYQIWaCMDG45/7zWQo8qpFE9
wpSNaecj6JwmgYv0SmxBNUMxx6771cjE+FofRTjpHptUu8Ux/MrRpaoFAoGBALX1
7PzMjnJvQ4JooP1F+D1Bja4U+WmKuxJr8pIpnfmkSSTP92Z0yoZgCH7XJMNbyAvX
+Xrio2vZs0DD4itTSmZQopCoPJDT0Gus174g7BI6j9qUlVDbQZV3eFx9LxfNB6F8
nQX+Uu28A/Sq3L57D3KDKK5OY0F9KdNtYtH3p8wBAoGBAOTzm9wCogdm3+I9/JJh
tLjj35jfHbHeCKW568caUOTAPOV010G0yqsBOWy7TffVC0OdwBx5SsGlpOL97u9q
mrRjdUDxJFUV9IJNQ/qDPrAU9zxr31aZt3NyB3uVqizxUzIEoIjf/icvNizlK+A0
sfBTDu/R/gETdBW18LHfQ/B+
-----END PRIVATE KEY-----

This data is created only for this issue via these commands:

openssl genrsa -out hoge.pem
openssl pkcs8 -in hoge.pem -topk8 -nocrypt -out meow.pem

How did you get the public cert modulus via "Parse X.509 certificate"?

mikecat commented 1 year ago

I found it. The operation is for parsing certificate, so a certificate should be provided as the input.

Example input:

-----BEGIN CERTIFICATE-----
MIIB4TCCAYugAwIBAgIUbI1I37oK514UVheqDDJIZpsCH7UwDQYJKoZIhvcNAQEL
BQAwRTELMAkGA1UEBhMCQVUxEzARBgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoM
GEludGVybmV0IFdpZGdpdHMgUHR5IEx0ZDAeFw0yMjEwMjgxMDA3NDlaFw0yMzEw
MjgxMDA3NDlaMEUxCzAJBgNVBAYTAkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEw
HwYDVQQKDBhJbnRlcm5ldCBXaWRnaXRzIFB0eSBMdGQwXDANBgkqhkiG9w0BAQEF
AANLADBIAkEAnBvviHCQdvphT22rK0ARKEk2xdM/1jJnzVZmnYkxmvHkYf6TXmmg
wPknPzWBmfYi3OxO+nU5WndNqmCZUMLQawIDAQABo1MwUTAdBgNVHQ4EFgQUl61B
Vqhuq6C33YUxBufsKbM58a8wHwYDVR0jBBgwFoAUl61BVqhuq6C33YUxBufsKbM5
8a8wDwYDVR0TAQH/BAUwAwEB/zANBgkqhkiG9w0BAQsFAANBAAXBdiCffhXvpkJ6
zsUe9rLJPmpBhmNORqsv9yGvfzjCWsW4U9vLtlSmqwuEsNuoSH9z30bdNw4O4nJ9
Hm5CO40=
-----END CERTIFICATE-----

Command to generate:

echo -e "hoge\nhoge\n\n\n\n\n\n\n\n\n\n" | openssl req -x509 -days 365 -newkey rsa:512 -keyout key.pem -out cert.pem
cat cert.pem

Recipe:

Parse X.509 certificate, 2 more - CyberChef

Example output:

9c1bef88709076fa614f6dab2b4011284936c5d33fd63267cd56669d89319af1e461fe935e69a0c0f9273f358199f622dcec4efa75395a774daa609950c2d06b
mikecat commented 1 year ago

Ah, your request is "the modulus can be extracted from a certificate, how to extract one from a private key?"?

Then...

  1. Use "PEM to Hex" and "Parse ASN.1 hex string" to split the key into elements
  2. Extract the 3rd INTEGER.
  3. Remove trailing zero.

PEM to Hex, 5 more - CyberChef