I know that it is possible using this link to generate a public and a private key for self-signed certificate in OpenSSL. But for a given Public Key, is it possible for me to figure out the corresponding Private Key? I have been using a 1024-bit RSA public key.
Because I had this question in my homework saying:
Generate a digital signature for the sentence “My name is . My voice is my passport.” that verifies correctly using OpenSSL with the following 1024-bit RSA public key. (Hint: The modulus might not have been generated like a normal RSA modulus.):
-----BEGIN PUBLIC KEY-----
MIGdMA0GCSqGSIb3DQEBAQUAA4GLADCBhwKBgQCgF35rHhOWi9+r4n9xM/ejvMEs
Q8h6lams962k4U0WSdfySUevhyI1bd3FRIb5fFqSBt6qPTiiiIw0KXte5dANB6lP
e6HdUPTA/U4xHWi2FB/BfAyPsOlUBfFp6dtkEEcEKt+Z8KTJYJEerRie24y+nsfZ
MnLBst6tsEBfx/U75wIBAw==
-----END PUBLIC KEY-----
Best Answer
The key (pun intended) to the solution is in the hint:
This is the approach I took.
Step 1: Derive the primes
public.pem
.n
) and the public exponent (e
), I ran:openssl rsa -pubin -in public.pem -text -noout
n=112420265940019545385580931264662691888876377549063413938338239508058300548918731393322848876821656910452908064089039911552450302375557565600923056341141750687524704844725632296552824986371719004485250857447936962589230504662333990648942759862805127715014382377701044586628936249950092121536791020138692688871
e=3
p=55685342628135644993
q=2018848419246646476894946094575564515176862561629979956283227393349426117194195173357244644821277073710795134539986018769393928719340504755806449531413017314396784334912136112253736003497362080917517151753555605597776865614151048604681116557282512513238254935296910445878892354969335089447
Step 2: Calculate other required values
n
asϕ(n) = (p - 1) * (q - 1)
using the python REPL:ϕ(n)=112420265940019545383562082845416045411981431454487849423161376946428320592635503999973422759627461737095663419267762837841655167835571546831529127621801245931718255313312614982156040651459582892231514853950574881671713352908778385051165894248654079110333265820418532073390681314653181675602213322541221954432
d
) and the coefficient (c
), which yielded:d=74946843960013030255708055230277363607987620969658566282107584630952213728423669333315615173084974491397108946178508558561103445223714364554352751747867497287812170208875076654770693767639721928154343235967049921114475568605852256700777262832436052740222177213612354715593787543102121117068142215027481302955
c=1040291110785843997
Step 3: Create the private key's ASN.1 structure
I then used the calculated values to create an ASN.1 structure in a file named
asn
as described in this answer:Step 4: Create the private key
Based on the ASN.1 structure, I generated the private key as follows:
openssl asn1parse -genconf asn -out private.der
openssl rsa -in private.der -inform der -out private.pem -outform pem
This results in a
private.pem
file being created with the following contents:Step 5: Verifying the result
To check whether the created private key (in
private.pem
) matches the provided public key, I just generated a new public key from the private key:This yields the following output:
This output exactly matches the public key that you provided.