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 }; } } |
Etiqueta: DAM
Desarrollo de Aplicaciones Multiplataforma
Threads parametrizados en C#
Acostumbrado a usar hilos en Java y ahora que me ha tocado hacerlo en C# se me ha hecho extraño su uso al principio ya que cambia un poco.
En vez de crear una clase que herede de la clase thread, como se haría en Java, en C# lo que hay que hacer es crear un objeto de la clase que se quiera y lanzar un hilo que ejecute un método de ese objeto creado.
Además para poder pasarle parámetros al hilo/método hay que crear un tipo delegate que permite encapsular el método con sus parámetros, después estos parámetros podrán ser usados como lectura, lectura/escritura o incluso podrán devolver el resultado por valor. En este enlace hay un documento muy interesante.
Sin mas paso a poner un ejemplo:
Leer másEjercicios JAVA Procesos – Hoja 3, 4 y 5
Ejercicios de Programación de Servicios y Procesos en JAVA:
Hoja 3
- Monitores en Java: Synchronized.
- Semáforos.
- El problema de los filósofos.
- El problema de los lectores y los escritores.
- Calculo de dos matrices con paralelismo.
- Uso de Locks reader y writer.
- Sopa de letras con paralelismo en su resolución automática y con GUI.
Hoja 4 y 5
- Servidor de ficheros con GUI, sockets.
- Servidor de ficheros con GUI, sockets, y paralelismo.
- Servidor de ficheros con GUI, sockets, paralelismo y criptografía asimétrica.
- Servidor de ficheros con GUI, sockets, paralelismo y criptografía simétrica y asimétrica.
Segunda APP para Android: Task Calendar
La aplicación se trata de un calendario de tareas que permite almacenar tareas agrupadas por etiquetas. Estas tareas se muestran en la pantalla principal a través de un FragmentActivity que permite cambiar entre las tareas de diferentes etiquetas arrastrando la pantalla de izquierda a derecha.
Estas tareas pueden añadirse, editarse o eliminarse desde los diferentes menús disponibles en la aplicación.
Medir tiempo de ejecución de un programa en C#
1 2 3 4 5 6 7 8 9 |
// Inicia el contador: DateTime tiempo1 = DateTime.Now; // Código del programa... // Para el contador e imprime el resultado: DateTime tiempo2 = DateTime.Now; TimeSpan total = new TimeSpan(tiempo2.Ticks - tiempo1.Ticks); Console.Write( "TIEMPO: " + total.ToString() ); |
1 2 3 4 5 6 7 |
// Inicia el contador: Stopwatch tiempo = Stopwatch.StartNew(); // Código del programa... // Para el contador e imprime el resultado: Console.Write( "TIEMPO: " + tiempo.Elapsed.Seconds.ToString() ); |