diff --git a/src/main/java/models/Rsa.java b/src/main/java/models/Rsa.java new file mode 100644 index 0000000..a390b3c --- /dev/null +++ b/src/main/java/models/Rsa.java @@ -0,0 +1,56 @@ +package models; + +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.SecureRandom; + +public class Rsa { + private final BigInteger e, d, n; + + public Rsa(int numberOfBytes) { + BigInteger p = generatePrime(numberOfBytes); + BigInteger q = generatePrime(numberOfBytes); + + n = p.multiply(q); + BigInteger m = p.subtract(BigInteger.ONE).multiply(q.subtract(BigInteger.ONE)); + + e = BigInteger.valueOf(65537); // 2^16 + 1 + d = e.modInverse(m); + } + + private static BigInteger generatePrime(int numberOfBytes) { + SecureRandom secureRandom = new SecureRandom(); + return new BigInteger(numberOfBytes, 100, secureRandom).nextProbablePrime(); + } + + public BigInteger encrypt(String message) { + BigInteger plaintext = toHex(message); + return plaintext.modPow(e, n); + } + + public String decrypt(BigInteger ciphertext) { + BigInteger plaintext = ciphertext.modPow(d, n); + return fromHex(plaintext); + } + + private static BigInteger toHex(String arg) { + return new BigInteger(1, arg.getBytes(StandardCharsets.UTF_8)); + } + + private static String fromHex(BigInteger arg) { + byte[] byteArray = arg.toByteArray(); + return new String(byteArray, StandardCharsets.UTF_8); + } + + public BigInteger getE() { + return e; + } + + public BigInteger getD() { + return d; + } + + public BigInteger getN() { + return n; + } +}