import [Link].
BigInteger;
class RSA {
static BigInteger power(BigInteger base, BigInteger expo, BigInteger m) {
return [Link](expo, m);
static BigInteger modInverse(BigInteger e, BigInteger phi) {
return [Link](phi);
static void generateKeys(BigInteger[] keys) {
BigInteger p = new BigInteger("7919");
BigInteger q = new BigInteger("1009");
BigInteger n = [Link](q);
BigInteger phi = [Link]([Link]).multiply([Link]([Link]));
BigInteger e = [Link];
for (e = new BigInteger("2"); [Link](phi) < 0; e = [Link]([Link])) {
if ([Link](phi).equals([Link])) {
break;
} }
BigInteger d = modInverse(e, phi);
keys[0] = e;
keys[1] = d;
keys[2] = n;
static BigInteger encrypt(BigInteger m, BigInteger e, BigInteger n) {
return power(m, e, n);
}
static BigInteger decrypt(BigInteger c, BigInteger d, BigInteger n) {
return power(c, d, n);
public static void main(String[] args) {
BigInteger[] keys = new BigInteger[3];
generateKeys(keys);
[Link]("Public Key (e, n): (" + keys[0] + ", " + keys[2] + ")");
[Link]("Private Key (d, n): (" + keys[1] + ", " + keys[2] + ")");
String message = "HELLO";
[Link]("Original Message: " + message);
StringBuilder encryptedMessage = new StringBuilder();
for (char c : [Link]()) {
BigInteger M = [Link](c);
BigInteger C = encrypt(M, keys[0], keys[2]);
[Link]([Link]()).append(" ");
[Link]("Encrypted Message: " + [Link]().trim());
StringBuilder decryptedMessage = new StringBuilder();
String[] encryptedChunks = [Link]().split(" ");
for (String encryptedChunk : encryptedChunks) {
BigInteger C = new BigInteger(encryptedChunk);
BigInteger decrypted = decrypt(C, keys[1], keys[2]);
[Link]((char) [Link]());
[Link]("Decrypted Message: " + [Link]());