Jump to content


Photo

Descrifrar en Android AES256

Android; AES256 Descifrar

  • Please log in to reply
25 replies to this topic

#21 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 11 April 2016 - 02:36 PM

Domingo, no he probado tu último código, y ni he compilado nunca para Android... Me asalta una duda. ¿Compilaste para cada uno por separado? ¿Es decir, hiciste un stream con la PC por un lado y otro con la app Android? Porque si es así, obviamente que resulta la cosa... cada uno trabaja con lo "suyo". El asunto se va a poner un poco más liado cuando tenga que guardar el contenido cifrado y recuperarlo en y desde diferentes dispositivos.

Prueba guardando el contenido cifrado ya sea desde la applicación PC o la móvil y en llevarlo y leerlo con la aplicación "opuesta". A ver que resulta.

Yo también he llegado a pensar que el conflicto con el Size en Android tuviera que ver con el gran tamaño y que quizá sea que es demasiado para la RAM y/o el espacio disponible en la SD (si es que hay una disponible). Suena como lo más probable.

 

Gaby, yo que vos no esperaría a que llegue ese día y me adelantaría en hacerlo lo más multiplataforma posible. ¡Quien sabe que te espera para ese entonces! Es preferible que prepares la cancha ahora que ya estás en el estadio y calentando... No vaya a ser cosa que al ponerte en el banco y llegue ese día te encuentre con el músculo en frio.

El trabajo justamente implica luchar contra el endianness y apoyo la idea de Domingo en considerar usar algún formato de codificación concreto para que al momento de descifrar proceder a hacer el paso inverso adecuado para la multiplataforma y no tener que lidiar con posibles conflictos de encoding. Algo como usar Base64 y/o UTF8 y hacer UTF8ToSys()/SysToUTF8() que dispone Lazarus (creería que Delphi tiene algo equivalente a estas funciones).

.....

 

Saludos,

 

Es que claro, ese es el problema inicial... el cifrado se hizo en una PC utilizando Delphi y todos felices de la vida, ahora el descifrado se requiere desde Android y es donde, como dicen en mi México lindo y querido, "la puerca torció el rabo", o lo que es lo mismo, ya se complicó la cosa...

 

Lo de que tengo que esperarme en 4 - 6 meses lo digo porque no puedo generar ahorita nuevos cifrados, si no hasta ese momento, pero claro que iré anticipándome al cambio necesario, claro, después de haber solucionado (espero) ésto primero :

 

 

Totalmente cierto

 

El tipo "string" dejo de existir. No tenes mas un string; tenes un arreglo de bytes. Agarra el arreglo de bytes, y usa un determinado Encoding, y recien ahi tenes el "texto"

 

Me he dado cuenta de lo del famoso encoding de la clase TEncoding para especificar la manera en que quieres presentar o leer cierto texto. Lo que no sé (hasta que llegue a mi casa tendré acceso al código que me genera los problemas y donde estoy haciendo todas las pruebas) es cómo aplicarle el famoso encoding al resultado del descifrado que es cuando me genera el error y tampoco sé realmente si el cifrado se hizo con el encoding por default de Windows, Android lo pueda leer sin problemas...

 

Saludox ! :)


  • 0

#22 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 11 April 2016 - 04:19 PM

Es que claro, ese es el problema inicial... el cifrado se hizo en una PC utilizando Delphi y todos felices de la vida, ahora el descifrado se requiere desde Android y es donde, como dicen en mi México lindo y querido, "la puerca torció el rabo", o lo que es lo mismo, ya se complicó la cosa...

 

Lo de que tengo que esperarme en 4 - 6 meses lo digo porque no puedo generar ahorita nuevos cifrados, si no hasta ese momento, pero claro que iré anticipándome al cambio necesario, claro, después de haber solucionado (espero) ésto primero :

 

 

 

Me he dado cuenta de lo del famoso encoding de la clase TEncoding para especificar la manera en que quieres presentar o leer cierto texto. Lo que no sé (hasta que llegue a mi casa tendré acceso al código que me genera los problemas y donde estoy haciendo todas las pruebas) es cómo aplicarle el famoso encoding al resultado del descifrado que es cuando me genera el error y tampoco sé realmente si el cifrado se hizo con el encoding por default de Windows, Android lo pueda leer sin problemas...

 

Saludox ! :)

 

Por el problema del endianness, puede servirte de guía las funciones que tiene Lazarus. Básicamente todas las funciones sobrecargadas XXToN y NToXX tienen un esquema como éste:


delphi
  1. function BEtoN(const AValue: LongInt): LongInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  2. begin
  3. {$IFDEF ENDIAN_BIG}
  4. Result := AValue;
  5. {$ELSE}
  6. Result := SwapEndian(AValue);
  7. {$ENDIF}
  8. end;


delphi
  1. function NtoBE(const AValue: LongInt): LongInt;{$ifdef SYSTEMINLINE}inline;{$endif}
  2. begin
  3. {$IFDEF ENDIAN_BIG}
  4. Result := AValue;
  5. {$ELSE}
  6. Result := SwapEndian(AValue);
  7. {$ENDIF}
  8. end;

Te puse como ejemplo las funciones BigEndian vs Native del tipo longint. Para los otros tipos es idénticas. Salvo un pequeño detalle para las del tipo DWord y QWord que están dentro de una directiva de compilación:


delphi
  1. {$ifndef cpujvm}
  2. function BEtoN(const AValue: QWord): QWord;{$ifdef SYSTEMINLINE}inline;{$endif}
  3. begin
  4. {$IFDEF ENDIAN_BIG}
  5. Result := AValue;
  6. {$ELSE}
  7. Result := SwapEndian(AValue);
  8. {$ENDIF}
  9. end;
  10. {$endif not cpujvm}

Todas las funciones van a pasar a la función SwapEndian, sobrecargada también, que hace el trabajo duro. Esta es la implementación para Longlint:


delphi
  1. function SwapEndian(const AValue: LongInt): LongInt; assembler; nostackframe;
  2. asm
  3. {$ifdef win64}
  4. movl %ecx, %eax
  5. {$else win64}
  6. movl %edi, %eax
  7. {$endif win64}
  8. bswap %eax
  9. end;

Diseñar un código análogo en Delphi debiera de ser posible. El principal problema es que yo al menos no encuentro en la lista de directivas de compilación los diseñados para detectar BigEndian y/o LittleEndian, que si están disponibles en FPC:


delphi
  1. {$IFDEF ENDIAN_BIG}
  2. {$ELSE}
  3. {$ENDIF}


delphi
  1. {$IFDEF ENDIAN_LITTLE}
  2. {$ELSE}
  3. {$ENDIF}

Y he buscado un "How To" para detectar el tipo de endian pero llego a resultados de diversas implementaciones de como encarar un Swap() pero nada de detectarlo.  :(  Desconozco como es la magia oculta detrás de las directivas o que es lo que hace FPC para que funcione. Si alguien sabe y puede hechar algo de luz bienvenido sea y ya tendrás un problemita menos con el cual lidiar.

 

Saludos,


  • 0

#23 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 11 April 2016 - 05:29 PM

Si efectivamente Delphi no tiene directivas como esas no concibo otra forma de evaluar el tipo de endian que no sea por código. Inspirado en lo que hace la función IsNan() o IsInfinite(), que parten el double en 2 cardinales y leen la mitad dependiendo del Endian, creeria que que es posible tener en un SmallInt (ya que ocupa 2 bytes) algún valor y proceder a partirlos en dos bytes o en un shortint. Y preguntar si efectivamente alguna mitad tiene el esperado.

Digamos que pasamos el valor 256, y lo partimos. Leemos la parte [0] o [1] y preguntamos por el valor esperado para cada caso, si es 1 o 255.

 

Saludos,


  • 0

#24 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 11 April 2016 - 05:33 PM

Dejo aquí un código de muestra que como podría implementarse funciones IsBigEndian e IsLittleEndian:


delphi
  1. unit Unit1;
  2.  
  3. {$mode objfpc}{$H+}
  4.  
  5. interface
  6.  
  7. uses
  8. Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls, Math;
  9.  
  10. type
  11.  
  12. TSplitSmallInt = packed record
  13. Cards: Array[0..1] of Byte;
  14. end;
  15.  
  16. { TForm1 }
  17.  
  18. TForm1 = class(TForm)
  19. Button1: TButton;
  20. Button2: TButton;
  21. procedure Button1Click(Sender: TObject);
  22. procedure Button2Click(Sender: TObject);
  23. private
  24. { private declarations }
  25. public
  26. { public declarations }
  27. function IsBigEndian: boolean;
  28. function IsLittleEndian: boolean;
  29. end;
  30.  
  31. var
  32. Form1: TForm1;
  33.  
  34. implementation
  35.  
  36. {$R *.lfm}
  37.  
  38. { TForm1 }
  39.  
  40. procedure TForm1.Button1Click(Sender: TObject);
  41. begin
  42. if IsLittleEndian
  43. then ShowMessage('Little Endian')
  44. else ShowMessage('Big Endian');
  45. end;
  46.  
  47. procedure TForm1.Button2Click(Sender: TObject);
  48. begin
  49. {$IFDEF ENDIAN_BIG}
  50. ShowMessage('Big Endian');
  51. {$ELSE}
  52. ShowMessage('Little Endian');
  53. {$ENDIF}
  54. end;
  55.  
  56. function TForm1.IsBigEndian: boolean;
  57. var small: SmallInt;
  58. begin
  59. small := 256;
  60. result := ((TSplitSmallInt(small).Cards[0]) = 1);
  61. end;
  62.  
  63. function TForm1.IsLittleEndian: boolean;
  64. var small: SmallInt;
  65. begin
  66. small := 256;
  67. result := ((TSplitSmallInt(small).Cards[1]) = 1);
  68. end;
  69.  
  70. end.

Saludos,


  • 1

#25 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 12 April 2016 - 11:58 AM

Che... porqué no me han dicho ¡Que buena propuesta loco! ¡Cómo es que los de Embarcadero/Idera no te pagan por semejante código sacado de la galera! ¡Por fin nos resolviste el Endianness!

Vengo, les dejo una pinturita, y ni un gracias che... ¡Asi me pagan! : :D

Na... es broma. Es que hoy ando un poquito desanimado y falto de ánimos. :(

 

A ver si Gaby nos tiene novedades del caso.

 

Saludos,


  • 0

#26 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3486 posts
  • LocationMexico City

Posted 12 April 2016 - 12:10 PM

Che muchas gracias por tu aportación, qué buena propuesta loco (jejeje) !!!!  :ap:  :ap:  :ap:  :ap:  :ap:

 

Por desgracia ya no pude ayer tocar mi código donde estoy haciendo todo lo que me sugieren y no he podido estar tan pendiente de éste asunto, espero hoy volver a la carga y entonces les vuelvo a retroalimentar.

 

Que esos ánimos no decaigan hombre, que uno de tus alter ego salga a hacer las maldades que tu personalidad civilizada no te permite y veamos si eso te alegra un poco :D (y)

 

Gracias de corazón por toda tu ayuda amigo... te mantengo informado

 

Saludox ! :)


  • 0





Also tagged with one or more of these keywords: Android;, AES256, Descifrar

IP.Board spam blocked by CleanTalk.