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