This serves as an aide to a previous post on the RSA cryptosystem.
is_prime.js
#!/usr/bin/env node
const N = process.argv[2] * 1;
if (N == null) {
console.log(`Usage: ${process.argv[1]} [n]`);
return;
}
if (N < 2) {
console.log(0);
return;
}
console.log(
([...Array(Math.sqrt(N) >> 0).keys()]
.map(i => i + 1)
.filter(i =>
N % i === 0
)
.length === 1) * 1
);
The crux:
- Make an array of numbers from one to the square root of the number to test for [primality], inclusive (the operation must be floored). I thought it’d be fun to avoid using a
forloop. - Return a new array starting from 1.
- Filter all numbers that evenly divide into the integer to test for primality.
- Recall that the number 1 is a factor of all numbers, so a number is indeed prime if the filtered array contains only one item (the number 1).
eulers_totient_function.js
#!/usr/bin/env node
const P1 = process.argv[2];
const P2 = process.argv[3];
if (!P1 || !P2) {
console.log(`Usage: ${process.argv[1]} [Prime 1] [Prime 2]`);
return;
}
// phi(N) = phi(P1)*phi(P2)
console.log(`phi(${P1 * P2}) = ${(P1 - 1) * (P2 - 1)}`);
priv_key.js
#!/usr/bin/env node
const e = process.argv[2] * 1;
const mod = process.argv[3] * 1;
if (!e || !mod) {
console.log(`Usage: ${process.argv[1]} [e] [modulus]`);
return;
}
console.log(
[...Array(mod).keys()]
.map(i => i + 1)
.filter(i =>
e * i % mod === 1
).join(',')
);
The crux:
- Make an array of numbers from one to modulo. I thought it’d be fun to avoid using a
forloop. - Return a new array starting from 1.
- Filter all numbers that return a result of one, which satisfies the modular multiplicative inverse property of the RSA algorithm.