| 
					 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 };     } }  |