Durante l'analisi del codice sorgente di tpm-emulator
ho scoperto che la decifrazione della chiave RSA utilizza un algoritmo sconosciuto a me.
Il file originale con questo mistero si trova in rsa.c
, dove risiede la funzione rsa_private(...)
. Il contenuto abbreviato di questa funzione è il seguente:
static int rsa_private(tpm_rsa_private_key_t *key,
const uint8_t *in, size_t in_len, uint8_t *out)
{
...
if (!key->p || !key->q || !key->u) {
/* c = p ^ d mod n */
tpm_bn_powm(c, p, key->d, key->n);
} else {
tpm_bn_init2(m1, key->size / 2);
tpm_bn_init2(m2, key->size / 2);
tpm_bn_init2(h, key->size);
/* m1 = p ^ (d mod (p-1)) mod p */
tpm_bn_sub_ui(h, key->p, 1);
tpm_bn_mod(h, key->d, h);
tpm_bn_powm(m1, p, h, key->p);
/* m2 = p ^ (d mod (q-1)) mod q */
tpm_bn_sub_ui(h, key->q, 1);
tpm_bn_mod(h, key->d, h);
tpm_bn_powm(m2, p, h, key->q);
/* h = u * ( m2 - m1 ) mod q */
tpm_bn_sub(h, m2, m1);
if (tpm_bn_sgn(h) < 0) tpm_bn_add(h, h, key->q);
tpm_bn_mul(h, key->u, h);
tpm_bn_mod(h, h, key->q);
/* c = m1 + h * p */
tpm_bn_mul(h, h, key->p);
tpm_bn_add(c, m1, h);
tpm_bn_clear(m1);
tpm_bn_clear(m2);
tpm_bn_clear(h);
}
...
return 0;
}
L'idea di base di questa funzione è di decodificare il messaggio di input in
( p
in una formula) di dimensione in_len
con l'aiuto della chiave privata RSA key
(l'esponente è d
e il modulo è% codice%).
Mentre questa parte del codice (1 ° algoritmo di decodifica):
/* c = p ^ d mod n */
è chiaro, l'altro possibile algoritmo del codice di decodifica è per me un mistero:
/* m1 = p ^ (d mod (p-1)) mod p */
/* m2 = p ^ (d mod (q-1)) mod q */
/* h = u * ( m2 - m1 ) mod q */
/* c = m1 + h * p */