Foros del Web » Programando para Internet » PHP »

Sistema de encriptación RSA

Estas en el tema de Sistema de encriptación RSA en el foro de PHP en Foros del Web. Hola de nuevo. Esta vez, y para variar, no soy yo la que tiene el problema, sino el pobre de mi novio. Explico: Está desarrolando ...
  #1 (permalink)  
Antiguo 27/08/2008, 09:40
 
Fecha de Ingreso: marzo-2008
Mensajes: 207
Antigüedad: 16 años, 1 mes
Puntos: 0
Sistema de encriptación RSA

Hola de nuevo.
Esta vez, y para variar, no soy yo la que tiene el problema, sino el pobre de mi novio. Explico:
Está desarrolando un sistema de encriptación de datos usando el método RSA, pero está teniendo problemas con algunas operaciones a la hora de cifrar los datos...

Os dejo lo que me ha dicho que os escriba, a ver si alguno le podeis echar una manita con esto...

Cita:
Estoy desarrollando una codificación mediante RSA para aplicarlo a una base de datos. Obtener las claves es fácil, el problema viene a la hora de desarrollar la encriptación: he creado una función para obtener directamente los restos enteros, y por tanto la palabra codificada, en lugar de crear una función para obtener los módulos [aritmética modular, u operación mod].

La función para obtener los módulos es:
Código PHP:
  function encriptar($cifra,$e,$n)
  {
    
$op pow($cifra,$e);
    
$c $op $n;
    return 
$c;
  } 
Cita:
Según lo que tengo entendido, hay que realizar c congruente con cifra elevado a e (mod n), donde c es el mensaje [o una parte] ya cifrado, cifra es el mensaje original pasando sus letras a números de 2 dígitos, e es el exponente público y n el valor obtenido de multiplicar los dos primos de clave pública [en mi notación, p y q]

La función pow me da resultados satisfactorios [aunque a veces masivos, con resultados de hasta 16 dígitos a veces], pero falla al intentar obtener el resto entero mediante el operando %, dándome 0 o números negativos, cosa que no me sirve de mucho, la verdad...

Me gustaría que me ayudárais explicándome dónde puede estar mi error, o, aun mejor, explicarme cómo realizar una función que haga la operación mod.

Gracias
Gracias de antemano por la ayuda ;)
  #2 (permalink)  
Antiguo 27/08/2008, 09:47
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Sistema de encriptación RSA

Hola Masane,

Eso se debe a que PHP tiene un límite para los números, y más si son de punto flotante, te recomiendo que veas la extensión BC Math de PHP.

Saludos.
  #3 (permalink)  
Antiguo 27/08/2008, 12:21
 
Fecha de Ingreso: agosto-2008
Mensajes: 27
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Sistema de encriptación RSA

Soy el novio de Masane, muchas gracias por la respuesta; desconocía la existencia de las funciones bc, la verdad es que por ahora me están resolviendo la vida, aunque me está haciendo aguas por otra parte... Pero bueno, esa es otra historia que estoy pendiente de arreglar.

Gracias, GatorV.
  #4 (permalink)  
Antiguo 29/08/2008, 11:06
 
Fecha de Ingreso: agosto-2008
Mensajes: 27
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Sistema de encriptación RSA

Perdón por el doble post, pero me ha surgido un problema justo al final de todo [me acabo de dar cuenta ahora mismo], espero que me ayudéis porque creo que es lo último que me queda por finalizar.

Os explico: teniendo una frase cualquiera, mi sistema convierte a un código numérico que tengo almacenado en otro archivo; este código numérico lo convierto en un número de, según mis cálculos, 4 dígitos. Sin embargo, algunos valores después de la encriptación pueden ser de menos dígitos. ¿Qué hago? Tengo una función que me comprueba si tengo o no 4 dígitos en el valor encriptado. La función es esta:

Código:
  function compruebaCifrado($pEncriptada,$f)
  {
    $stlen = strlen($pEncriptada);
    $esp = $f - $stlen;
    
    if ($esp > 0)
    {
      for ($i=1; $i<=$esp; $i++)
      {
        echo $i."<br>";
        $st = "0".$pEncriptada;
        echo $st."<br>";
      }
      $pEncriptada = $st;

    }
    return $pEncriptada;
  }
Donde $pEncriptada es la letra encriptada [la función recibe la palabra encriptada y me comprueba si tiene o no 4 dígitos], y $f es un valor fijo de 4, que es el número de dígitos de cada número.

Compruebo mediante el valor $esp cuántos dígitos faltan a dicho número para ser 4: si $esp es 0, no hay que hacer nada devolvemos la letra encriptada y punto, y si no añadimos tantos 0 a la izquierda como dígitos falten.

Todo perfecto, he hecho muchas pruebas y funcionaba perfectamente, hasta que me dí cuenta de un fallo que, aunque está contemplado, no funciona: si el número de 2 dígitos sólo añade un 0 a la izquierda en vez de dos, con lo que el mensaje se me descuadra completamente el mensaje cifrado...

¿Alguna idea de dónde está mi error o cómo solucionaro?

Gracias por adelantado ;)
  #5 (permalink)  
Antiguo 29/08/2008, 15:37
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Sistema de encriptación RSA

Lo que puedes hacer es convertirlo a un número antes de pasarlo por strlen, así al pasarlo a string solo te pasaria el número correcto.

Saludos.
  #6 (permalink)  
Antiguo 31/08/2008, 17:01
 
Fecha de Ingreso: agosto-2008
Mensajes: 27
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: Sistema de encriptación RSA

Era algo más simple de lo que esperaba... tan simple que da hasta risa:

Si os fijáis en la variable $st, lo único que hago es machacarla en el bucle continuamente. ¿Hago el bucle 2 veces? Dos veces que sólo, por ejemplo, convierto 83 en 083...

En fin, gracias por la ayuda igualmente, estaré más atento a la próxima [eso si Masane no me mata antes].
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 20:02.