import java.math.
BigInteger;
class RSA {
static BigInteger power(BigInteger base, BigInteger expo, BigInteger m) {
return base.modPow(expo, m);
static BigInteger modInverse(BigInteger e, BigInteger phi) {
return e.modInverse(phi);
static void generateKeys(BigInteger[] keys) {
BigInteger p = new BigInteger("7919");
BigInteger q = new BigInteger("1009");
BigInteger n = p.multiply(q);
BigInteger phi = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE));
BigInteger e = BigInteger.ZERO;
for (e = new BigInteger("2"); e.compareTo(phi) < 0; e = e.add(BigInteger.ONE)) {
if (e.gcd(phi).equals(BigInteger.ONE)) {
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);
System.out.println("Public Key (e, n): (" + keys[0] + ", " + keys[2] + ")");
System.out.println("Private Key (d, n): (" + keys[1] + ", " + keys[2] + ")");
String message = "HELLO";
System.out.println("Original Message: " + message);
StringBuilder encryptedMessage = new StringBuilder();
for (char c : message.toCharArray()) {
BigInteger M = BigInteger.valueOf(c);
BigInteger C = encrypt(M, keys[0], keys[2]);
encryptedMessage.append(C.toString()).append(" ");
System.out.println("Encrypted Message: " + encryptedMessage.toString().trim());
StringBuilder decryptedMessage = new StringBuilder();
String[] encryptedChunks = encryptedMessage.toString().split(" ");
for (String encryptedChunk : encryptedChunks) {
BigInteger C = new BigInteger(encryptedChunk);
BigInteger decrypted = decrypt(C, keys[1], keys[2]);
decryptedMessage.append((char) decrypted.intValue());
System.out.println("Decrypted Message: " + decryptedMessage.toString());