1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 | /* Author: Alberto Gil Tesa WebSite: http://giltesa.com License: CC BY-NC-SA 3.0 http://goo.gl/CTYnN File: Rsa.java Date: 26/02/2013 NOTAS: http://es.wikipedia.org/wiki/RSA */ import java.math.BigInteger; import java.security.SecureRandom; public class Rsa { private BigInteger n; // Clave compartida private BigInteger d; // Clave privada (no se comparte) private BigInteger k; // Clave publica para la otra parte private final int K = 0, D = 0, N = 1; /** * Constructor que genera las claves publica y privada de tamaño bitlen indicado. * * @param bitlen */ public Rsa(int bitlen) { // Calculamos los dos numeros primos p y q: SecureRandom r = new SecureRandom(); BigInteger p = new BigInteger(bitlen / 2, 100, r); BigInteger q = new BigInteger(bitlen / 2, 100, r); //n = p*q, v= (p-1)*(q-1) n = p.multiply(q); BigInteger v = ( p.subtract(BigInteger.ONE) ).multiply(q.subtract(BigInteger.ONE)); // Calculamos k como el numero impar mas pequeño relativamente primo con v k = new BigInteger("3"); while( v.gcd(k).intValue() > 1 ) k = k.add(new BigInteger("2")); // Calculamos d de modo que (d * k) MOD V = 1 d = k.modInverse(v); } /** * Pasa el BigInteger normal a cifrado usando la clave publica. * * @param message * @return */ public BigInteger encrypt(BigInteger message) { return message.modPow(k, n); } /** * Pasa el BigInteger normal a cifrado usando la clave publica recibida. * * @param message * @param key * @return */ public BigInteger encrypt(BigInteger message, BigInteger[] key) { return message.modPow(key[K], key[N]); } /** * Pasa el BigInteger de cifrado a normal usando la clave privada. * * @param message * @return */ public BigInteger decrypt(BigInteger message) { return message.modPow(d, n); } /** * Pasa el BigInteger de cifrado a normal usando la clave privada recibida. * * @param message * @return */ public BigInteger decrypt(BigInteger message, BigInteger[] key) { return message.modPow(key[D], key[N]); } /** * Devuelve la clave publica. * * @return */ public BigInteger[] getPublicKey() { return new BigInteger[] { k, n }; } /** * Devuelve la clave privada. * * @return */ public BigInteger[] getPrivateKey() { return new BigInteger[] { d, n }; } } |