Comunidad de diseño web y desarrollo en internet online

¿Cómo encriptar un string mediante una clave pública?

Citar            
MensajeEscrito el 09 May 2013 04:29 pm
Hola a todos, tengo un problemilla. En mi Flash en AS3 y CS4, necesito encriptar un string, con una clave pública que tengo, antes de enviarlo al servidor.
¿Alguien conoce la forma de hacerlo o sabe dónde puedo encontrar un ejemplo/tutorial que lo explique?

Muchas gracias

Por Palacio

Claber

198 de clabLevel



 

firefox
Citar            
MensajeEscrito el 09 May 2013 05:03 pm
BuenAS:

Para Flex tienes un ejemplo en Tour de Flex. No consigo enlazar al apartado concreto. Cuando estés dentro de la página, navega al apartado:

Other Components / Encrypt / AS3 Cryptography.

La parte de la derecha está dividida en dos: arriba el ejemplo, y abajo el código fuente.

Como digo, es un ejemplo Flex, pero puedes utilizar la biblioteca AS3Crypto en un proyecto AS3.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 10 May 2013 11:37 am
Muchas gracias Lukánicos, le echo un ojo y te digo

Por Palacio

Claber

198 de clabLevel



 

firefox
Citar            
MensajeEscrito el 16 May 2013 10:20 am
Hola Lukánicos, he estado mirando la clase Crypto.as que se encuentra dentro del proyecto AS3Crypto que me mostraste, pero no consigo saber como funciona.
Yo tengo un string que quiero encriptar y una clave pública con la que encriptar. Entonces, ¿Cómo hago para que esto funcione?

Muchas gracias

Por Palacio

Claber

198 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 May 2013 07:20 am
BuenAS:

Yo suelo utilizar estos métodos:

Código ActionScript :

      private function encrypt(
         txt:String,
         k:String,
         kformat:String="hex", format:String="hex", outputFormat:String="hex",
         encType:String="aes", modeType:String="cbc", paddingType:String="pkcs5",
         simple:Boolean=false):void
      {
         
         var kdata:ByteArray;
         switch (kformat) {
            case "hex":
               kdata = Hex.toArray(k);
               break;
            case "b64":
               kdata = Base64.decodeToByteArray(k); 
               break;
            default:
               kdata = Hex.toArray(Hex.fromString(k));
               break;
         };
         
         var data:ByteArray;
         switch (format) {
            case "hex": 
               data = Hex.toArray(txt);
               break;
            case "b64":
               data = Base64.decodeToByteArray(txt);
               break;
            default:
               data = Hex.toArray(Hex.fromString(txt));
               break;
         };
         
         var name:String = encType + "-" + modeType;
         
         if (simple)
            name = "simple-" + name;
         
         var pad:IPad = (paddingType == "pkcs5") ? new PKCS5 : new NullPad;
         
         try
         {
            var mode:ICipher = Crypto.getCipher(name, kdata, pad);
            pad.setBlockSize(mode.getBlockSize());
            mode.encrypt(data);
            
            if (data != null)
            {
               var txt:String;
               
               switch (outputFormat) {
                  case "hex":
                     txt = Hex.fromArray(data);
                     break;
                  case "b64":
                     txt = Base64.encodeByteArray(data);
                     break;
                  default:
                     txt = Hex.toString(Hex.fromArray(data));
                     break;
               }
               
               proxy.encryptText = txt;
               if (mode is IVMode)
               {
                  var ivmode:IVMode = mode as IVMode;
                  
                  proxy.initVector = Hex.fromArray(ivmode.IV);
               };
            };
         }
         catch (e:Error)
         {
            proxy.encryptText = "Error al encriptar";
            proxy.initVector = "Error al encriptar";
         };
         
      }

      private function  decrypt(
         txt:String,
         k:String,
         ivText:String,
         kformat:String="hex", format:String="hex",
         encType:String="aes", modeType:String="cbc", paddingType:String="pkcs5",
         simple:Boolean=false):void
      {
         
         var kdata:ByteArray;
         switch (kformat)
         {
            case "hex":
               kdata = Hex.toArray(k);
               break;
            case "b64":
               kdata = Base64.decodeToByteArray(k);
               break;
            default:
               kdata = Hex.toArray(Hex.fromString(k));
               break;
         };
         
         var data:ByteArray;
         switch (format)
         {
            case "hex":
               data = Hex.toArray(txt);
               break;
            case "b64":
               data = Base64.decodeToByteArray(txt);
               break;
            default:
               data = Hex.toArray(Hex.fromString(txt));
               break;
         }
         
         var name:String = encType + "-" + modeType;
         
         if (simple)
            name = "simple-" + name;
         
         var pad:IPad = (paddingType == "pkcs5") ? new PKCS5 : new NullPad;
         
         var mode:ICipher = Crypto.getCipher(name, kdata, pad);
         pad.setBlockSize(mode.getBlockSize());
         
         if (mode is IVMode)
         {
            var ivmode:IVMode = mode as IVMode;
            ivmode.IV = Hex.toArray(ivText);
         };
         
         try
         {
            mode.decrypt(data);
            if (data != null)
            {
               var txt:String;
               switch (format)
               {
                  case "hex":
                     txt = Hex.fromArray(data);
                     break;
                  case "b64":
                     txt = Base64.encodeByteArray(data);
                     break;
                  default:
                     txt = Hex.toString(Hex.fromArray(data));
                     break;
               };
               proxy.decryptText = Hex.toString(txt);
            };
         }
         catch (e:Error)
         {
            proxy.decryptText = "Error al desencriptar";
         };
         
      }


y para encriptar:

encrypt(texto, clave, "hex", "text", "hex");

y para desencriptar:

decrypt(texto, clave, vo.initVector, "hex", "hex");

Y como comentaba, debes bajarte la biblioteca as3crypto.

Del ejemplo que comentaba (Tour de Flex), por si quieres ir a la 'fuente' en lugar de coger lo que hice a mi medida, abre la clase PublicTab.mxml y encontrarás los métodos encrypt() y decrypt() que hacen la misma función.

Un saludo.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 17 May 2013 08:27 am
Hola Lukánicos, genial tu información.

Muchas gracias

Por Palacio

Claber

198 de clabLevel



 

firefox
Citar            
MensajeEscrito el 17 May 2013 09:05 am
...acabo de darme cuenta. Para liarlo un poco utilizo otra cadena de texto para desencriptar, en el código anterior aparece vo.initVector al llamar al método. Pasa una cadena vacía en su lugar, por ejemplo:

decrypt(texto, clave, "", "hex", "hex");

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 21 May 2013 07:20 am
Hola Lukánicos, estoy con tu ejemplo y no veo dónde te guardas el valor del texto encriptadoo dónde lo muestras.
Podrías echarme un cable? Tal como lo tengo montado, necesito que la clase encrypt me devuelva un string con el texto encriptado.

Muchas gracias

Por Palacio

Claber

198 de clabLevel



 

firefox
Citar            
MensajeEscrito el 21 May 2013 09:29 am
BuenAS:

Utiliza mejor estas que sí devuelven valores. Es que lo estoy sacandolo de una aplicación que tenía por aquí y el código lo tenía un poco "liado" para despistar si me lo decompilan. Cambie unos cuantos nombres y lo pegué sin más.

Código ActionScript :

public function encrypt(
   txt:String,
   k:String,
   kformat:String="hex", format:String="hex", outputFormat:String="hex",
   encType:String="aes", modeType:String="cbc", paddingType:String="pkcs5",
   simple:Boolean=false):Object
{
   
   var kdata:ByteArray;
   switch (kformat) {
      case "hex":
         kdata = Hex.toArray(k);
         break;
      case "b64":
         kdata = Base64.decodeToByteArray(k); 
         break;
      default:
         kdata = Hex.toArray(Hex.fromString(k));
         break;
   };
   
   var data:ByteArray;
   switch (format) {
      case "hex": 
         data = Hex.toArray(txt);
         break;
      case "b64":
         data = Base64.decodeToByteArray(txt);
         break;
      default:
         data = Hex.toArray(Hex.fromString(txt));
         break;
   };
   
   var name:String = encType + "-" + modeType;
   
   if (simple)
      name = "simple-" + name;
   
   var encryptText:String = "";
   var initVector:String = "";
   var pad:IPad = (paddingType == "pkcs5") ? new PKCS5 : new NullPad;
   try
   {
      var mode:ICipher = Crypto.getCipher(name, kdata, pad);
      pad.setBlockSize(mode.getBlockSize());
      mode.encrypt(data);
      
      if (data != null)
      {
         switch (outputFormat) {
            case "hex":
               encryptText = Hex.fromArray(data);
               break;
            case "b64":
               encryptText = Base64.encodeByteArray(data);
               break;
            default:
               encryptText = Hex.toString(Hex.fromArray(data));
               break;
         }
         
         if (mode is IVMode)
         {
            var ivmode:IVMode = mode as IVMode;
            
            initVector = Hex.fromArray(ivmode.IV);
         };
      };
   }
   catch (e:Error)
   {
      trace("Error al encriptar");
   };
   
   return {encryptText: encryptText, initVector: initVector};
}

public function  decrypt(
   txt:String,
   k:String,
   ivText:String,
   kformat:String="hex", format:String="hex",
   encType:String="aes", modeType:String="cbc", paddingType:String="pkcs5",
   simple:Boolean=false):String
{
   
   var kdata:ByteArray;
   switch (kformat)
   {
      case "hex":
         kdata = Hex.toArray(k);
         break;
      case "b64":
         kdata = Base64.decodeToByteArray(k);
         break;
      default:
         kdata = Hex.toArray(Hex.fromString(k));
         break;
   };
   
   var data:ByteArray;
   switch (format)
   {
      case "hex":
         data = Hex.toArray(txt);
         break;
      case "b64":
         data = Base64.decodeToByteArray(txt);
         break;
      default:
         data = Hex.toArray(Hex.fromString(txt));
         break;
   }
   
   var name:String = encType + "-" + modeType;
   
   if (simple)
      name = "simple-" + name;
   
   var pad:IPad = (paddingType == "pkcs5") ? new PKCS5 : new NullPad;
   
   var mode:ICipher = Crypto.getCipher(name, kdata, pad);
   pad.setBlockSize(mode.getBlockSize());
   
   if (mode is IVMode)
   {
      var ivmode:IVMode = mode as IVMode;
      ivmode.IV = Hex.toArray(ivText);
   };
   
   var decryptText:String = "";
   try
   {
      mode.decrypt(data);
      if (data != null)
      {
         switch (format)
         {
            case "hex":
               decryptText = Hex.toString(Hex.fromArray(data));
               break;
            case "b64":
               decryptText = Hex.toString(Base64.encodeByteArray(data));
               break;
            default:
               decryptText = Hex.toString(Hex.fromArray(data));
               break;
         };
      };
   }
   catch (e:Error)
   {
      trace("Error al desencriptar");
   };
   
   return decryptText;
}


Funciona igual que como te decía. Para encriptar:

encrypt(textoAEncriptar, clave, "hex", "text", "hex");

y te devuelve un objeto con {encryptText: encryptText, initVector: initVector}, el texto encriptado y una cadena de comprobación a utilizar para desencriptar (sería mejor que utilizaras en lugar de un objeto una clase ValueObject con estos dos valores);

Y para desencriptar

decrypt(textoEncriptado, clave, initVector, "hex", "hex");

donde initVector es la cadena de control que se generó al encriptar.

Esto sí te debe funcionar.

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 21 May 2013 09:34 am
BuenAS:

El proceso de encriptar / desencriptar es mejor hacerlo en el servidor. Un swf es muy fácil de decompilar, y pueden mirar rápidamente el código para ver como saltarlo.

Yo por ejemplo, las pocas veces que lo he utilizado en AS ha sido para aplicaciones AIR en las que no importaba mucho si al final me las abrían (de donde he sacado esto) :)

Un saludo.

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 21 May 2013 10:00 am
...estoy ojeando un poco lo que hice en su momento, y para liarlo un poco, la cadena de control initVector que se genera al encriptar la insertaba en una posición dentro de la cadena encriptada, y para desencriptar la extraía de esa posición. Pero lo que digo, con lo fácil que es decompilar un swf, alguien que le preste unos minutos a ojear el código puede descrubrir casi todo el mecanismo y saltarselo :)

Por Lukánicos

Claber

468 de clabLevel



Genero:Masculino  

firefox
Citar            
MensajeEscrito el 24 May 2013 11:55 am
Muchas gracias!!! Ya está implementado y funcionando!!!

Por Palacio

Claber

198 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Sep 2014 10:46 am
Hola, he revisado este threat porqué estoy en el mismo punto y veo que llamáis a las funciones de "encrypt" y "decrypt", a las que le pasáis la clave pública para encriptar y la clave privada para desencriptar. Pero, como se pueden generar estas claves?
Tengo el ejemplo funcionando usando claves de ejemplo, pero mi idea es que se puedan generar automática y dinámicamente dichas claves en el mismo flash. Es esto posible? A que función debería llamar?

Muchas gracias

Por manel.pi

71 de clabLevel



 

firefox

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.