freeCodeCamp/curriculum/challenges/italian/10-coding-interview-prep/project-euler/problem-182-rsa-encryption.md

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;
}