Constructing a public key (pair) from component parts
Werner Koch
wk at gnupg.org
Mon Jun 6 10:58:34 CEST 2005
On Sun, 5 Jun 2005 11:13:45 +1000, Brad Hards said:
> Given the components of an RSA key (n, e, p, q, d), is there any way to
> construct a key that I can use for encryption/decryption/signing/verifying
> ops withing gcrypt?
Create an S-expression:
(private-key
(rsa
(n NNNNNNNNNNNNN)
(e EEEEEEEEEEEEE)
(d DDDDDDDDDDDDD)
(p PPPPPPPPPPPPP)
(q QQQQQQQQQQQQQ)
(u UUUUUUUUUUUUU)))
Here is a snippet to create a canonical encoded S-expression using
plain C. You may also use libgcrypt functions, which is easier.
sexp = p = xmalloc_secure (30
+ rsa_n_len + rsa_e_len + rsa_p_len + rsa_q_len
+ 4*sizeof (numbuf) + 25 + sizeof(numbuf) + 20);
p = stpcpy (p,"(11:private-key(3:rsa(1:n");
sprintf (numbuf, "%u:", rsa_n_len);
p = stpcpy (p, numbuf);
memcpy (p, rsa_n, rsa_n_len);
p += rsa_n_len;
sprintf (numbuf, ")(1:e%u:", rsa_e_len);
p = stpcpy (p, numbuf);
memcpy (p, rsa_e, rsa_e_len);
p += rsa_e_len;
sprintf (numbuf, ")(1:p%u:", rsa_p_len);
p = stpcpy (p, numbuf);
memcpy (p, rsa_p, rsa_p_len);
p += rsa_p_len;
sprintf (numbuf, ")(1:q%u:", rsa_q_len);
p = stpcpy (p, numbuf);
memcpy (p, rsa_q, rsa_q_len);
p += rsa_q_len;
p = stpcpy (p,"))(10:created-at");
sprintf (numbuf2, "%lu", (unsigned long)sk->timestamp);
sprintf (numbuf, "%d:", strlen (numbuf2));
p = stpcpy (stpcpy (stpcpy (p, numbuf), numbuf2), "))");
rc = agent_scd_writekey (keyno, sexp, p - sexp);
Change above to also include D an U. If you don't have them, you may
create them from P,Q,N,E. There is code in
gnupg-1.9/agent/protect-tool.c#rsa_key_check which shows how to do it.
Salam-Shalom,
Werner
More information about the Gcrypt-devel
mailing list