Envio XML y codificación de caracteres [SOLUCIONADO]

Tus preguntas. Algoritmos o Grupos de Comandos formando Programas Escripts.
Responder
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Envio XML y codificación de caracteres [SOLUCIONADO]

Mensaje por arkcrew »

Buenas tardes.

Tengo un codigo en visual C++ que me pasó un amigo para obtener la feca de expiración de unas licencias.

Lo que me gustaría es pasarlo a autoit, no tengo mucho código hecho, apenas la estructura de algunos datos.

OS dejo el code y seguidamente o que llevo hecho;

//returns the xml used to request the expire date of a license
wxString LicenseChecking::GetValidityXML()
{
wxPlatformInfo osInfo;
wxString languageId;
wxString OsVersion;

languageId.Printf(wxT("%ld"),( m_esetInfo != NULL ? m_esetInfo->GetLanguageId() : 0x409));

OsVersion.Printf(wxT("%d.%d"),osInfo.GetOSMajorVersion(),osInfo.GetOSMinorVersion());

wxString userPassEncoded = License::Encode2Validate(m_license->GetUsername(),m_license->GetPassword());
wxString product = ( m_esetInfo != NULL ? m_esetInfo->GetVersionType() : wxT("eav") );
wxString version = ( m_esetInfo != NULL ? m_esetInfo->GetStrVersion() : wxT("4.0.474.0") );

wxString xml = wxT("<?xml version=\"1.0\" encoding=\"utf-8\"?>") wxT("\n")
wxT("<GETLICEXP>") wxT("\n")
wxT("<SECTION ID=\"1000103\">") wxT("\n")
wxT("<LICENSEREQUEST>") wxT("\n")
wxT("<NODE NAME=\"UsernamePassword\" VALUE=\"") + userPassEncoded + wxT("\" TYPE=\"STRING\" />") wxT("\n")
wxT("<NODE NAME=\"Product\" VALUE=\"") + product + wxT("\" TYPE=\"STRING\" />") wxT("\n")
wxT("<NODE NAME=\"Version\" VALUE=\"") + version + wxT("\" TYPE=\"STRING\" />") wxT("\n")
wxT("<NODE NAME=\"Language\" VALUE=\"") + languageId + wxT("\" TYPE=\"DWORD\" />") wxT("\n")
wxT("<NODE NAME=\"UpdateTag\" VALUE=\"\" TYPE=\"STRING\" />") wxT("\n")
wxT("<NODE NAME=\"System\" VALUE=\"") + OsVersion + wxT("\" TYPE=\"STRING\" />") wxT("\n")
wxT("</LICENSEREQUEST>") wxT("\n")
wxT("</SECTION>") wxT("\n")
wxT("</GETLICEXP>") wxT("\n");

xml.Append((wxChar)0);
return xml;
}


Aqui una información adiccional de la persona que me dio el code

Lo que te deberías fijar es en el algoritmo que usa para codificar el usuario y password y enviarlo a ESET y este devuelva la fecha de expiracion.

El XML que observas es:
<?xml version="1.0" encoding="utf-8"?>
<GETLICEXP>
<SECTION ID="1000103">
<LICENSEREQUEST>
<NODE NAME="UsernamePassword" VALUE="User y Pass codificado" TYPE="STRING" />
<NODE NAME="Product" VALUE="Tipo de producto (eav, ess, essbe, eavbe)" TYPE="STRING" />
<NODE NAME="Version" VALUE="Version de nod32" TYPE="STRING" />
<NODE NAME="Language" VALUE="id del idioma" TYPE="DWORD" />
<NODE NAME="UpdateTag" VALUE="" TYPE="STRING" />
<NODE NAME="System" VALUE="Version del OS" TYPE=\"STRING\" />
</LICENSEREQUEST>
</SECTION>
</GETLICEXP>

Para llenar la propiedad VALUE de "UsernamePassword", se requiere codificar el usuario y password, el algoritmo de codificación que usa se encuentra más abajo (incluso añadí un pequeño dibujo en ASCII indicando que es lo que codifica y más abajo el código en si).

Con respecto al código en sí de la codificación del usuario y password para solicitar la fecha de expiración, no te sabría ayudar mucho en AutoIt porque no conozco como correr bytes a la derecha o a la izquierda (en C++ se lo hace con << y >>) o realizar operaciones con bits, ya sea OR, AND o XOR, que en C++ son │, & y ^ respectivamente. Además que, para entender el algoritmo, hay que entender cómo operar con bits (las operaciones or, and y xor).

Asi que esto es todo yo escribi apenas 4 lineas porque a decir verdad, me pase dos semanas dandole vueltas y no consegui nada:

Dejo también más explicaciones del autor de las funciones:
El algoritmo que me refiero es el de codificación PERO para el XML que se encuentra allí, no es el mismo de aquellas tablas en tnod.php (que por cierto, TNod actualmente no usa aquellas tablas sino el algoritmo original de decodificación/codificación en el registro, pero ese es otro tema).

Una vez que tengas todo el XML, lo envías a exp01.eset.com/getlicexp mediante un POST, los datos que se envía son:
checklic=XML

Donde XML es todo el xml donde se encuentran los datos.

Como una noticia última, ESET cambió el algoritmo de codificación (para saber la fecha de expiración), el anterior sigue valiendo pero el nuevo a largo plazo será el que sirva, por supuesto esta nueva forma de activación ya incluye muchas mejoras no tan sencillas de descifrar.
Tal como lo mencionas está incorrecto, debes enviar a esta dirección:
exp01.eset.com

un POST a /getlicexp

Con los siguientes datos:

checklic=<?xml version="1.0" encoding="utf-8"?>................

Estamos hablando de una cabecera y cuerpo de un request HTTP, aquí tienes ejemplos: http://www.opencalais.com/HTTPexamples

Y respecto al problema de codificación/decodificación del registro, eso no hay problema, como dije antes TNod ya dispone de los algoritmos originales; el problema radica en la codificación para validar la licencia (y así pedir la fecha de caducidad) en un servidor (diferente a exp01.eset.com), una de las partes que lo complica es que ahora usa SSL para enviar y recibir (o sea no hay como interceptar la información que envía porque todo está codificado) a diferencia
Ah, os dejo los archivos completos para mas información:
Adjuntos
files.rar
archivos
(4.43 KiB) Descargado 632 veces
Última edición por arkcrew el 17 Oct 2011, 20:43, editado 3 veces en total.
MDF123
Mensajes: 1
Registrado: 01 Sep 2011, 03:24

Re: Ayuda con envio XML

Mensaje por MDF123 »

Hola, me podrias explicar como codificar el campo UsernamePassword o pasarme el codigo de la funcion Encode2Validate

gracias!
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Ayuda con envio XML

Mensaje por arkcrew »

Disculpad que no responda, he estado ausente por mucho tiempo, pero ya estoy por aqui listo para postear y solucionar cosas, y que me las soluionen :D



Aqui está la funcion encode2validate adjunta

Espero me podais ayudar, estoy dadno un empujon a mi proyecto "NodLuna" y espero poder incluir esta funcion, es muy útil...

Un saludo
Adjuntos
License.rar
Funciones
(3.77 KiB) Descargado 607 veces
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Envio XML y codificación de caracteres (¿Nadie sabe?)

Mensaje por Ximorro »

Puessss creo que sí es posible. Igual al ponerse salen dificultades, pero creo que las operaciones que hace se pueden hacer en AutoIt.
El problema es que en AutoIt no tenemos control sobre el tipo de datos, no es lo mismo rotar bits con signo que sin signo, por ejemplo, y en este caso el tamaño de palabra importa (eso al menos sí se puede controlar, al menos en las rotaciones y desplazamientos).

No sé qué tipo de datos básico está realmente usando la función en C++, pues usa tipos personalizados wxString y wxChar que no sé qué son ¿quizás usa Char de 16 bits? ¿sería como un unsigned short int?

No recuerdo si los operadores de C "<<" y ">>" son desplazamientos o rotaciones, y si son con signo o sin signo, pero en AutoIt se pueden hacer rotaciones con BitRotate (donde se puede especificar el tamaño de la palabra, hasta 32 bits), y desplazamientos con BitShift (¡aquí siempre trabaja con 32 bits!)

Si queremos hacer un BitShift de menos de 32 bits creo que se solucionará poniendo a cero los bits que nos sobran con un BitAnd.

Para And, Or y Xor binarios (en C "&", "|" y "^") tenemos los casi equivalentes BitAnd, BitOr y BitXOr.
Digo "casi" porque en AutoIt siempre trabajan con 32 bits, y en C trabajan con el tamaño de los operadores. Siempre que trabajemos con menos de 32bits no creo que haya problema, porque podemos ignorar los bits que nos sobran, que deberían estar siempre a cero (siempre que no haya un Not binario por alguna parte, y en la función no veo ninguno, de hecho creo que tampoco hay OR, pero bueno)

Pues eso, mírate estas funciones y creo que con eso se puede hacer, al menos la parte del tratamiento de bits, que a priori parece lo más peliagudo en AutoIt.
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Envio XML y codificación de caracteres (¿Nadie sabe?)

Mensaje por arkcrew »

Que faena, debo mirar como se compila la librería wx.. la funcion wxString esta sacada de esa librería...
Quizas exista algo en autoit, esta es la descripcion:

wxString is a class representing a character string. Please see the wxString overview for more information about it.

As explained there, wxString implements most of the methods of the std::string class. These standard functions are not documented in this manual, please see the STL documentation). The behaviour of all these functions is identical to the behaviour described there.

You may notice that wxString sometimes has many functions which do the same thing like, for example, Length(), Len() and length() which all return the string length. In all cases of such duplication the std::string-compatible method (length() in this case, always the lowercase version) should be used as it will ensure smoother transition to std::string when wxWidgets starts using it instead of wxString.

UN saludo.

PD: Gracias Ximorro, voy a pasar el codigo que pueda de la función a autoit, y cuando me atasque, lo publicaré pos si me pdoeis ayudar
Muchisimas Gracias!!
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Envio XML y codificación de caracteres (¿Nadie sabe?)

Mensaje por arkcrew »

Vale, pasé una de las funciones, encode2validate, a autoit..

Me quedó esto:

Código: Seleccionar todo

msgbox(0,"",encode2validate("EAV-52354874","v75rhhbfvh"))

Func encode2validate($username, $password)
	Const $table1[16] = ["Z","C","B","M","K","H","F","S","Q","E","T","U","O","X","V","N"]
	Const $table2[15] = ["Q","A","P","L","W","S","M","K","C","I","J","E","F","B","H"]
	Dim $codificado, $charUser, $charPass
	Dim $BL,$P1,$CL,$EDX
    Dim $c = 0

	Do
		If ($c < StringLen($username)) And ($username[$c] <> 0) Then $charUser = $username[$c]
		; no entiendo esta estructura, parece ser que es un condicional ternario, que no se su funcionamiento, quizas esté mal conmo lo he puesto..
		$charPass = $password[$c] & 0xff
		$BL = BitShift(($charPass & 3) * (-1), 2 * $c) ;va la la izquierda debe ser negativo..
		$P1 = BitXOR($charPass, $charUser)
		$CL = BitXOR(BitShift($P1, 4), BitShift($BL, 4))
		$codificado = $codificado & $table2[$CL]
		$EDX = BitXOR($P1, $BL) & 0x0f
		$codificado = $codificado & $table1[$EDX]
		$c = $c + 1
	Until $c <= 0x7 And $c < StringLen($password)

	Do
		$charUser = $username[$c] & 0xff
		$codificado = $codificado & $table1[BitShift($charUser, 4)]
		$codificado = $codificado & $table2[$charUser & 0x0f]
		$c = $c + 1
	Until $c < StringLen($username)

	Return $codificado
EndFunc   ;==>encode2validate
Pero no funciona, el error que me dá es más que lógico, $username[$c] no es una cadena de texto, aun así no entiendo que debo colocar para que funcione, he intentado ser lo más fiel posible al pasar la función...
Probablemente algo no cuadre, espero alguna respuesta

Gracias..
Un saludo!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Envio XML y codificación de caracteres (¿Nadie sabe?)

Mensaje por Ximorro »

En C las cadenas son vectores, por eso accede así, tú tienes que extraer el carácter con StringMid($cadena, $posicion, 1) (también se puede hacer un array del string con un StringSplit sin delimitador, pero tampoco hace falta)

¡Te has olvidado de pasar los AND! Ese "&" en C es un AND bit a bit, en AutoIt significa concatenación de cadenas, así que no estás haciendo lo mismo. Lo tienes que traducir con un BitAnd.

No uses DIM, eso existe por razones históricas y los desarrolladores desaconsejan su uso. Usa Local en este caso dentro de la función, y Global cuando estés con variables globales.

El operador ternario significa
a = (condicion ? valor_si : valor_no)
Es decir:

Código: Seleccionar todo

If condicion = true Then
  a = valor_si
else
  a = valor_no
EndIf
taluec
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Envio XML y codificación de caracteres (¿Nadie sabe?)

Mensaje por arkcrew »

Vale, le pegué una revisión a la función y creo que esta vez no me he dejado nada (si, he mirado los operadores lógicos en la wikipedia para cerciorarme XD)

Asi que aqui dejo la función para que si apetece la ojeeis haber si es correcta ya que me da la sensación de que devuelve un valor muy corto, si lo probais os devuelve QZZQ y me extraña mucho la verdad...

Código: Seleccionar todo

MsgBox(0, "", encode2validate("EAV-52354874", "v75rhhbfvh"))

Func encode2validate($username, $password)
	Local $table1[16] = ["Z", "C", "B", "M", "K", "H", "F", "S", "Q", "E", "T", "U", "O", "X", "V", "N"]
	Local $table2[15] = ["Q", "A", "P", "L", "W", "S", "M", "K", "C", "I", "J", "E", "F", "B", "H"]
	Local $codificado, $charUser, $charPass
	Local $BL, $P1, $CL, $EDX
	Local $c = 0

	Do
		If $c < StringLen($username)  Then
			$charUser = BitAnd(StringMid($password, $c, 1),0xff)
		Else
			$charUser = 0
		EndIf
		$charPass = BitAND(StringMid($password, $c, 1), 0xff)
		$BL = BitShift(2*$c,BitAnd($charPass,3)) 
		$P1 = BitXOR($charPass, $charUser)
		$CL = BitXOR(BitShift($P1, 4), BitShift($BL, 4))
		$codificado = $codificado & $table2[$CL]
		$EDX = BitAND(BitXOR($P1, $BL), 0x0f)
		$codificado = $codificado & $table1[$EDX]
		$c = $c + 1
	Until $c <= 0x7 And $c < StringLen($password)

	Do
		$charUser = BitAND(StringMid($password, $c, 1), 0xff)
		$codificado = $codificado & $table1[BitShift($charUser, 4)]
		$codificado = $codificado & $table2[BitAND($charUser, 0x0f)]
		$c = $c + 1
	Until $c < StringLen($username)

	Return $codificado
EndFunc   ;==>encode2validate
Un problema que tengo es:

En el código C++ tengo esto: BL = (2 * c) << (charPass & 3); que mueve los bits hacia la izquierda.. pero en autoit tenog lo sieguiente
$BL = BitShift(2*$c,BitAnd($charPass,3)) , creo que está bien pasado, pero si leo la ayuda de bitshift en autoit me dice que los valores negativos se moverán a la izquierda, pero y si no es negativo y requiere ser movido a la izquierda?? no se si me explico o estoy diciendo una burrada, notese que de operadores lógicos apenas me sé manejar ni sé siquiera su funcionamiento...

Un saludo!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Envio XML y codificación de caracteres (¿Nadie sabe?)

Mensaje por Ximorro »

¿Pero no tienes una ejecución de la rutina en C++ para comparar? Si tu amigo la está usando en C++ que te pase algunas ejecuciones con usuario-password variados y te diga los resultados para poder saber cuánto está bien en AutoIt.

Como te comenté la función es un lio, yo me pierdo con tanto AND y desplazamiento, pero por lo que veo hay un bucle que se ejecuta o 7 veces o el tamaño de la contraseña, lo que sea más corto, y dentro de ese bucle añade dos caracteres al resultado. Así que por ahí tenemos 14 caracteres.
Y luego hay otro bucle que se ejecuta tantas veces como el tamaño del user, que en tu ejemplo es de 12 caracteres, y añade también 2 caracteres por ciclo. Así que son 24 caracteres más.

O sea, que si no se me escapa algo, por ejemplo que pueda estar asignando caracteres nulos, deberíamos obtener una cadena de 38 caracteres...

Respecto al desplazamiento, $charPass siempre es positivo pues es el código ASCII de un carácter (que aún no sé si es de 8 ó 16 bits, y si eso importa, porque no sé cómo es un wxChar, a lo mejor no es ASCII sino Unicode, lo que igual daría problemas).
En cualquier caso en lo que respecta al desplazamiento, como es positivo siempre desplazará a la derecha, así que multiplica por -1, como de hecho hacías antes, y así desplazará a la izquierda.

Además creo que hay bastante lío con los tipos. En C un char es un entero de un byte sin signo (a parte que estamos trabajando con wxChar, que a lo mejor no es un char). En AutoIt un carácter es una cadena de longitud 1... lógicamente no son lo mismo. No sé si realizar operaciones de bits con cadenas en AutoIt es equivalente a hacerlo con enteros, tendrías que comprobarlo y si no hacer las conversiones pertinentes.
Es decir, ¿es equivalente BitAnd("A", 3) y BitAnd(65, 3)? Si no lo son tendrás que convertir los caracteres a números cuando tengas que trabajar con ellos como números (es decir, con las operaciones aritméticas y binarias) y pasar los números a carácter cuando vayas a concatenarlos en la cadena resultado.

Para pasar un carácter a código numérico se usa Asc($char), y para pasar un código al carácter se usa Chr($ascii).
Pero si resulta que wxChar son caracteres unicode igual hay que usar AscW y ChrW, que son las versiones 16 bits de esas funciones.
Y si wxChar es algo especial habría que crear funciones especiales para hacer las conversiones...

¿Por qué no te hace tu amigo una dll de ese programa que ha hecho y lo llamas desde Autoit? Igual acabas antes... :smt002

Edit:
Comprobado, por ejemplo BitAnd("B", 15) da 0, pero BitAnd(66, 15) da 2 (y 66 es el código ASCII de "B", así que deberían ser equivalentes si trabajara con cadenas, pero va a ser que no, si le pasas una cadena devuelve siempre cero)
Así que hay que hacer la conversión: BitAnd(Chr("B"), 15) ya da 2.
Tendrás que hacer las conversiones...
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Envio XML y codificación de caracteres (¿Nadie sabe?)

Mensaje por arkcrew »

Puff..

Ximorro esto es un lío, le he mandado un mail para ver si me puede hacer una dll, aunq debería seguir con la función por si no me hace el favor.. veré esta tarde que puedo hacer, revisaré el -1 y los demás operadores para ver si están correctos, aunq aun así, no me devielve los 14 caracteres, ¿Porque?

Saludos!
Avatar de Usuario
Ximorro
Profesional del Autoit
Mensajes: 1500
Registrado: 10 Jul 2009, 12:35
Ubicación: Castellón, España

Re: Envio XML y codificación de caracteres (¿Nadie sabe?)

Mensaje por Ximorro »

¡A saber! Cuando el código no está bien el resultado puede ser muy indeterminado.
Quizás al no estar haciendo las conversiones carácter-número como te está dando muchos ceros si concatena caracteres nulos es como no concatenar nada...

El caso es que nunca sabremos si está bien si no te pasan una ejecución con usuario-contraseña y el resultado que tiene que dar. Porque aunque te dé un churro de caracteres ¿cómo sabes que son los correctos?
"¿Y no será que en este mundo hay cada vez más gente y menos personas?". Mafalda (Quino)
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Envio XML y codificación de caracteres (¿Nadie sabe?)

Mensaje por arkcrew »

La verdad es que no lo sabes XD
LOe pedí tambien que me enviara la licencia que utilizo en el ejkjemplo codificada tal cual la funcion correcta para comparar resultados
UN saludo
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Envio XML y codificación de caracteres (¿Nadie sabe?)

Mensaje por arkcrew »

Aqui está el "esquema del algoritmo" espero que porfavor alguien pueda ayudarme a copletar el código ya que realmente no tengo ni idea de como poder hacerlo.. Gracias

Código: Seleccionar todo

   NOTE: N go from 0 to 7 (expiry server validates 8 characteres only)
      .------------------------------------ ENCODING THE USERNAME & PASSWORD---------------------------------.
      |                                                                                                      |
            N Character of Username    N Character of Password -> C = last 2 BITS of the password
                   |                 /                            |
                   |               /                2*N      2 evelated to C
                   |             /                    \          /
                   |           /                     (multiplication)
                   |         /                           |
                    \      /            .-------------- EF
                     \    /             |          [EF = 2*N * (2 elevated to C)]
                      XOR               |                |
                       |                |                |
                      AB --------------XOR               |
          (AB is the result of          |        F (F are the last 4 bits in the EF number)
          the XOR operation)           GH               /
                       |                |             / 
                       A                '- ->- - -  /  - - - - - ->.
             (A are the first 4 bits             /                 |
              in the AB number)               /                    |
                             \             /                       | 
                                 \      /                          |
                                   \  /                            |
                                    XOR                            H (H are the last 4 bits in the GH number)
                                     =                             =
                         Position of the character       Position of the character 
                            in the second table             in the first table
      |                                                                                                      |
      '------------------------------------------------------------------------------------------------------'

      NOTE: N go from 0 to length of the username - 1
      .------------------------------------ ENCODING THE USERNAME -------------------------------------------.
      |                                                                                                      |
                                            N Character of Username
                                                      |
                                                     JK 
                                            (JK are the N character in hexadecimal,
                                             J = first 4 bits, K = last 4 bits)
                                                      |
                                                    /   \
                                                 /         \
                                              /               \
                                             J                 K       
                                        Position in        Position in
                                        the table 1        the table 2
      |                                                                                                      |
      '------------------------------------------------------------------------------------------------------'

      FINAL STRING ENCODED = ENCODE(USERNAME&PASSWORD) + ENCODE(USERNAME)
                                                       + = concatenation
Avatar de Usuario
BasicOs
Site Admin
Mensajes: 2099
Registrado: 21 Nov 2006, 19:24
Ubicación: El Internet - (Canarias, España)
Contactar:

Re: Envio XML y codificación de caracteres (¿Nadie sabe?)

Mensaje por BasicOs »

Realmente son solo cálculos matemáticos varios, vaya una formula compleja que hay que reproducir. no es así?
Creo que como dice Ximorro debes empezar por:

Tener un origen user y pass, y luego un destino (ambos encriptados).

Experimentar con el user y pass del código c, intentando reproducir esto mismo con el de c.

Una vez hecho esto puedes intentar a ver si el server te lo acepta, porque pueden haber cambiado la codificación..

Si no estás muy en el aire, porque te puede fallar cualquier parte de la cadena de cálculos. etc..

Como solución final, yo lo externalizaba, respetando el código en c y llamandolo de desde autoit...

SAlu22:)
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Envio XML y codificación de caracteres (¿Nadie sabe?)

Mensaje por arkcrew »

Buenas,

A base de MUCHA paciencia y aburrimiento en clases, he conseguido la función CASI CASI operativa al 100%. SOLO TENGO DOS DUDAS QUE SOLVENTAR

Dejo el code:

Código: Seleccionar todo

Func Encode2validate($username, $password)
	Local $BL, $P1, $CL, $EDX ;Tipo Int
	Local Const $table1[16] = ["Z", "C", "B", "M", "K", "H", "F", "S", "Q", "E", "T", "U", "O", "X", "V", "N"]
	Local Const $table2[15] = ["Q", "A", "P", "L", "W", "S", "M", "K", "C", "I", "J", "E", "F", "B", "H"]
	Local $codificado, $codificado2 ;Tipo String
	Local $charUser, $charPass ;Tipo char

	For $c = 0 To 7
		$usernamec = Asc(StringMid($username, $c, 1))
		$passwordc = Asc(StringMid($password, $c, 1))
		If $c < StringLen($username) Then
			$charUser = BitAND($usernamec, 0xff)
		Else
			$charUser = 0
		EndIf
		$charPass = BitAND($passwordc, 0xff)
		$BL = BitShift((2 * $c), -(BitAND($charPass, 3))) ; <<
		$P1 = BitXOR($charPass, $charUser)
		$CL = BitXOR(BitShift($P1, 4), BitShift($BL, 4));
		$codificado &= $table2[$CL];
		$EDX = BitAND(BitXOR($P1, $BL), 0x0f);
		$codificado &= $table1[$EDX]
	Next

	For $d = 0 To StringLen($username)
		$usernamec = Asc(StringMid($username, $d, 1))
		$charUser = BitAND($usernamec, 0xff)
		$codificado &= $table1[BitShift($charUser, 4)];
		$codificado &= $table2[BitAND($charUser, 0x0f)];
	Next
	;return $codificado;

	ConsoleWrite($codificado)
EndFunc   ;==>Encode2validate
Podeis hacer pruebas con encode2validate("EAV-52354874", "v75rhhbfvh")

Y para que os hagais una idea, un resultado obtenido por la función es: PFPZQHWNPZKBMXPQKSKAHMBFMPMQMLMLMAMMMDMW Y NO corresponde a los datos proporcionados por mi para las pruebas, no se con que se han generado,

DUDAS;
*Es ASC o CHR lo que debo indicar???
*Porque mi función devuelve: QZLUSFMNKNSSSFMEZQKSKAHMBBMSMPMLMSMWMCMKMW con esos datos, osea 2 caracteres más que el dato obtenido arriba,

Decir que los usuarios y claves tienen siempre LA MISMA longitud por lo que las cadenas codificadas deben tener también esa similitud en cuanto a tamaño.

Echadme una manica anda que ya etstá casi casi ;)

Saludos!!
Avatar de Usuario
arkcrew
Profesional del Autoit
Mensajes: 506
Registrado: 28 Sep 2009, 19:17
Ubicación: Granada, España
Contactar:

Re: Envio XML y codificación de caracteres (YA ESTÁ CASI AYU

Mensaje por arkcrew »

Buenas,

Más avances, he conseguido hacer funcionar la función esta en c++ quitando las partes de wx... y usando las de c++ nativas, asi que ya puedo ir haciendo pruebas.

Espero completarlo esta tarde y por supuesto, dejaré el resultado para que lo podais ver :)

saludos1
Responder