2.8 KiB
id | title | challengeType | forumTopicId | dashedName |
---|---|---|---|---|
5900f4231000cf542c50ff35 | Problema 182: Crittografia RSA | 1 | 301818 | problem-182-rsa-encryption |
--description--
La crittografia RSA si basa sulla seguente procedura:
Genera due primi distinti p
e q
. Calcola n=p*q
e φ=(p-1)(q-1)
. Trova un numero intero e
, 1 < e < φ
, in modo che MCD(e,φ) = 1
Un messaggio in questo sistema è un numero nell'intervallo [0,n-1]
. Un testo da cifrare viene quindi convertito in qualche modo in messaggi (numeri nell'intervallo [0,n-1]
). Per cifrare il testo, per ogni messaggio m
si calcola c=me mod n.
Per decifrare il testo, è necessaria la seguente procedura: calcola d
in modo che ed=1 mod φ
, quindi per ogni messaggio cifrato c
, calcola m=cd mod n.
Esistono valori di e
e m
tali che me mod n = m. Chiamiamo i messaggi m
per i quali me mod n=m messaggi non nascosti.
Un problema quando si sceglie e
è che non ci dovrebbero essere troppi messaggi non nascosti. Per esempio, sia p=19
e q=37
. Quindi n=19*37=703
e φ=18*36=648
. Se scegliamo e=181
, anche se MCD(181, 48)=1
risulta che tutti i possibili messaggi m (0≤m≤n-1)
sono nascosti quando si calcola me mod n. Per qualsiasi scelta valida di e
esistono alcuni messaggi non nascosti. È importante che il numero di messaggi non nascosti sia il minimo.
Per ogni dato p
e q
, trova la somma di tutti i valori di e
, 1 < e < φ(p,q)
e MCD(e,φ)=1
, in modo che il numero di messaggi non nascosti per questo valore di e
sia minimo.
--hints--
RSAEncryption
dovrebbe essere una funzione.
assert(typeof RSAEncryption === 'function')
RSAEncryption
dovrebbe restituire un numero.
assert.strictEqual(typeof RSAEncryption(19, 37), 'number');
RSAEncryption(19, 37)
dovrebbe restituire 17766
.
assert.strictEqual(RSAEncryption(19, 37), 17766);
RSAEncryption(283, 409)
dovrebbe restituire 466196580
.
assert.strictEqual(RSAEncryption(283, 409), 466196580);
RSAEncryption(1009, 3643)
dovrebbe restituire 399788195976
.
assert.strictEqual(RSAEncryption(19, 37), 17766);
--seed--
--seed-contents--
function RSAEncryption(p, q) {
return true;
}
RSAEncryption(19, 37);
--solutions--
function gcd(a, b) {
if (b)
return gcd(b, a % b);
else
return a;
}
function RSAEncryption(p, q) {
let phi = (p - 1) * (q - 1);
let best = Number.MAX_SAFE_INTEGER;
let sum = 0;
for (let e = 0; e < phi; ++e) {
if (!(gcd(e, phi) == 1))
continue;
let msg = (gcd(p - 1, e - 1) + 1) * (gcd(q - 1, e - 1) + 1);
if (best == msg) {
sum += e;
} else if (best > msg) {
best = msg;
sum = e;
}
}
return sum;
}