|
- // p = 5, q = 11
- // RSA-Modul N = p * q = 55
- // Phi(N) = Phi(p)*Phi(q) | weil eigenschaft eulersche phi funktion und p,q teilerfremd
- // = (p-1)*(q-1) | p,q primzahlen, daher nur durch 1 und sich selbst teilbar und alle anderen teilerfremd
- // = 4*10 = 40
- // e: 1 < e < Phi(N) und ggT(e, Phi(N)) = 1
- // e elem aus {3,..} => e = 3
- // (e,N) = (3, 55) public key
- // -----
- // d: e*d kongr 1 mod Phi(N) => e*d mod Phi(N) = 1
- // 3*d mod 40 = 1
- // Durch probieren: d=27 => (27, 55) private key
- //
- // ----
- // Verschlüsseln
- // 13
- // c = m^e (mod N) => 13^3 (mod 55) = 52 = c
- // ----
- // Entschlüsseln
- // m = c^d (mod N) => 52^27 (mod 55) = 13 = m
-
- import java.math.BigInteger;
-
- public class RSA {
- private int bitLength;
- private BigInteger p;
- private BigInteger q;
- private BigInteger n;
- private BigInteger phiP;
- private BigInteger phiQ;
- private BigInteger phiN;
- private BigInteger e;
- private BigInteger d;
-
- public RSA (int bitLength) {
- this.bitLength = bitLength;
- this.p = Prime.generate(bitLength);
- this.q = Prime.generate(bitLength);
- this.n = p.multiply(q);
- this.phiP = p.subtract(BigInteger.ONE);
- this.phiQ = q.subtract(BigInteger.ONE);
- this.phiN = phiP.multiply(phiQ);
- }
-
- private void findPublicKey () {
- BigInteger check;
- do {
- this.e = Prime.generate(this.bitLength*2/3);
- check = this.e.gcd(phiN);
- } while (!check.equals(BigInteger.ONE));
- }
-
- private void findPrivateKey () {
- this.d = e.modInverse(phiN);
- }
-
- private void endKeyCreation () {
- this.p = BigInteger.ZERO;
- this.q = BigInteger.ZERO;
- this.phiP = BigInteger.ZERO;
- this.phiQ = BigInteger.ZERO;
- this.phiN = BigInteger.ZERO;
- }
-
- public void createKeys() {
- this.findPublicKey();
- this.findPrivateKey();
- this.endKeyCreation();
- }
-
- public BigInteger getPublicKey () {
- return e;
- }
-
- public BigInteger getPrivateKey () {
- return d;
- }
-
- public BigInteger getRSAModule() {
- return n;
- }
-
- static BigInteger cipher (BigInteger message, BigInteger key, BigInteger module) {
- return message.modPow(key, module);
- }
- }
|