Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Bruno Augusto

[Resolvido] Conversão de Algoritimo...

Recommended Posts

Bom, na verdade nem sei se pode questionar isso aqui. Fiquei na dúvida se postava em PHP, em ActionScript, em JavaScript ou aqui, porque o assunto envolve os quatro fatores.

 

É um algoritimo originalmente feito em ActionScript

 

private function decryptN2(param1:String) : String
{
    var _loc_2:* = new String();
    var _loc_3:int = 0;
    while (_loc_3 < param1.length)
    {
        // this.keyN2 é uma string the 13 caracteres

        _loc_2 = _loc_2 + String.fromCharCode(parseInt(param1.substr(_loc_3, 2), 30) - parseInt(param1.substr(_loc_3 + 2, 2), 30) - this.keyN2.charCodeAt(_loc_3 / 4 % 13));
        _loc_3 = _loc_3 + 4;
    }

    return _loc_2;
}
Não entendo muito, mas ao meu ver isso é ActionScript 3 que embora Orientado a Objetos, ainda é bem parecido com JavaScript.

 

Pois bem, eu tentei adaptar para PHP, mas não deu muito certo:

 

public function decrypt() {

   $output = NULL;
   $start = 0;
   $key = self::CRYPT; // Essa é minha chave, de 13 caracteres, referente ao this.keyN2 do ActionScript

   while( $start < strlen( $test ) ) {

       $p1 = intval( substr( $test, $start, 2 ), 30 );
       $p2 = intval( substr( $test, $start + 2, 2 ), 30 );
       $p3 = $key[ ord( $start / 4 % 13 ) ];

       $output .= chr( $p1 - $p2 - $p3 );

       $start += 4;
   }

   return $output;
}

Fiquei na dúvida sobre o que usar para substituir o parseInt devido ao segundo parâmetro. Daí lembrei que intval() também permite controlar a raiz-base do número.

 

Não sabia o que usar para fromCharCode e charCodeAt. Pesquisei a respeito e vi que é chr() e ord() respectivamente.

 

Agora...

 

Se eu reproduzir em JavaScript e depurar o meu $p1, obviamente, já traduzido para JavaScript, obtenho o mesmo valor, tanto em PHP quanto em JavaScript.

 

Mas vários erros de índice não definidos ocorriam.

 

Continuei pesquisando e encontrei essa alternativa ao ord() usado em substituto a fromCharCode().

 

Implementei e, pelo menos, os erros de índice sumiram, o que teoricamente significa que a função, de fato, reproduz o mesmo efeito Unicode de fromCharCode.

 

Mas, o resultado final ainda assim não foi o esperado, aparecendo na tela, um monte de balõezinhos pretos com uma interrogação. Alterado o Charset da página e vários símbolos nem um pouco lógicos surgiram.

 

O resultado esperado seria um XML como esse:

 

<error><info code="526.07" reason="Invalid Input!" message="Message" action="None"/></error>

Pergunta: Essa conversão é possível? Existe alguma coisa entre esse AS3 "travestido" de JavaScript que não posso reproduzir no PHP? Ou eu que interpretei parte do código de forma errada?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, na verdade nem sei se pode questionar isso aqui. Fiquei na dúvida se postava em PHP, em ActionScript, em Javascript ou aqui, porque o assunto envolve os quatro fatores.

 

O local correto seria PHP já que você quer converter um código feito em uma outra linguagem para PHP.

 

Fiquei na dúvida sobre o que usar para substituir o parseInt devido ao segundo parâmetro. Daí lembrei que intval() também permite controlar a raiz-base do número.

Não sabia o que usar para fromCharCode e charCodeAt. Pesquisei a respeito e vi que é chr() e ord() respectivamente.

 

O String.fromCharCode() é no Actionscript o equivalente à função chr() no PHP e o string.charCodeAt() seria uma união de duas funções do PHP, ord( substr( string , offset , 1 ) )

 

A tradução do código para PHP ficaria:

<?php
class CryptN2 {
private static $keyN2 = 'ZorbakOwnsYou';

public static function encryptN2( $_arg1 ){
	$_local2 = '';

	for ( $_local3 = 0 , $length = strlen( $_arg1 ) ; $_local3 < $length ; ++$_local3 ){
		$rand = rand( 1 , 9999999999999 ) / 1000;
		$_local4 = (int) ( ( $rand - (int) $rand ) * 66 ) + 33;
		$_local2 .= base_convert( ( ord( $_arg1{ $_local3 } ) + $_local4 ) + ord( self::$keyN2{ $_local3 % 13 } ) , 10 , 30 ) . base_convert( $_local4 , 10 , 30 );
	}

	return $_local2;
}

public static function decryptN2( $param1 ){
	$_loc_2 = '';

	for ( $_loc_3 = 0 , $length = strlen( $param1 ) ; $_loc_3 < $length ; $_loc_3 += 4 ){
 	$_loc_2 .= chr( (int) base_convert( substr( $param1 , $_loc_3 , 2 ) , 30 , 10 ) - (int) base_convert( substr( $param1 , $_loc_3 + 2 , 2 ) , 30 , 10 ) - ord( self::$keyN2{ $_loc_3 / 4 % 13 } ) );
	}

	return $_loc_2;
}
}

$str = '<error><info code="526.07" reason="Invalid Input!" message="Message" action="None"/></error>';
$enc = CryptN2::encryptN2( $str );
$dec = CryptN2::decryptN2( $enc );

var_dump( $enc , $dec , $dec === $str );

 

Agora, é só esperar que um moderador de lógica mova o tópico para PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, já te agradeci por MSN, mas fica aqui em público.

 

Valeu. http://forum.imasters.com.br/public/style_emoticons/default/thumbsup.gif

 

P.S.: PHP foi minha primeira intenção, mas daí ponderei a presença da lógica criada com uma linguagem que se parece com outra e aí foi muito vuco, vuco, muito peru com farofa na minha cabeça e eu acabei postando aqui.

 

Agradeço também ao quitZAUMMM

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.