Files

2.9 KiB

id, title, challengeType, forumTopicId, dashedName
id title challengeType forumTopicId dashedName
5900f4231000cf542c50ff35 Problema 182: Criptografia RSA 5 301818 problem-182-rsa-encryption

--description--

A criptografia RSA baseia-se no seguinte procedimento:

Gere dois números primos distintos p e q. Calcule n=p*q e φ=(p-1)(q-1). Encontre um número inteiro e, sendo que 1 < e < φ, de tal forma que gcd(e,φ) = 1 (gcd é a sigla para máximo divisor comum, em inglês)

Uma mensagem neste sistema é um número no intervalo [0,n-1]. Um texto a ser criptografado é então convertido em mensagens (números no intervalo [0,n-1]). Para criptografar o texto, para cada mensagem, m, c=me mod n é calculado.

Para descriptografar o texto, é necessário o seguinte procedimento: calcular d tal que ed=1 mod φ. Depois, para cada mensagem criptografada, c, calcular m=cd mod n.

Existem valores de e e m tal que me mod n = m. Chamamos de mensagens m aquelas para as quais me mod n=m mensagens não ocultas.

Um problema ao escolher e é o fato de que não deve haver muitas mensagens não ocultas. Por exemplo, considere p=19 e q=37. Então n=19*37=703 e φ=18*36=648. Se escolhermos e=181, então, embora gcd(181,648)=1 todas as mensagens possíveis m (0≤m≤n-1) são não ocultas ao calcular me mod n. Para qualquer escolha válida de e, existem algumas mensagens não ocultas. É importante que o número de mensagens não ocultas seja o mínimo.

Para quaisquer p e q fornecidos, encontre a soma de todos os valores de e, 1 < e < φ(p,q) e gcd(e,φ)=1, para que o número de mensagens não ocultas para esse valor de e seja o menor possível.

--hints--

RSAEncryption deve ser uma função.

assert(typeof RSAEncryption === 'function')

RSAEncryption deve retornar um número.

assert.strictEqual(typeof RSAEncryption(19, 37), 'number');

RSAEncryption(19, 37) deve retornar 17766.

assert.strictEqual(RSAEncryption(19, 37), 17766);

RSAEncryption(283, 409) deve retornar 466196580.

assert.strictEqual(RSAEncryption(283, 409), 466196580);

RSAEncryption(1009, 3643) deve retornar 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;
}