import java.math.BigInteger; import java.security.SecureRandom; class Rsa { private BigInteger r, v, e; public Rsa(int bitlen) { SecureRandom rand = new SecureRandom(); // Erzeugen großer Primzahlen mit bitlen Bit-Stellen BigInteger p = new BigInteger(bitlen / 2, 100, rand); BigInteger q = new BigInteger(bitlen / 2, 100, rand); r = p.multiply(q); BigInteger m = (p.subtract(BigInteger.ONE)).multiply(q .subtract(BigInteger.ONE)); // berechne v, relativ prim zu (p-1)(q-1) v = new BigInteger("3"); while (m.gcd(v).intValue() > 1) v = v.add(new BigInteger("2")); // berechne e, das multiplikativ Inverse zu v (mod (p-1)(q-1)) e = v.modInverse(m); } public BigInteger encrypt(BigInteger message) { return message.modPow(v, r); } public BigInteger decrypt(BigInteger message) { return message.modPow(e, r); } public static void main(String[] args) { Rsa rsa = new Rsa(128); if (args.length != 1) { System.out.println("Usage: java Rsa "); System.exit(1); } BigInteger value = new BigInteger(args[0]); System.out.println("Original value: " + value); BigInteger encryptedValue = rsa.encrypt(value); System.out.println("Encrypted value: " + encryptedValue); BigInteger decryptedValue = rsa.decrypt(encryptedValue); System.out.println("Decrypted Value: " + decryptedValue); } }