Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Pasar string a byte (https://www.clubdelphi.com/foros/showthread.php?t=50723)

Novás 26-11-2007 20:44:24

Pasar string a byte
 
Hola a todos, mi problemilla es el siguiente:

Tengo declaradas estas dos constantes:

Código Delphi [-]
const
  clave_xor='12345678B12345678***';
  pal_sec_ofuscada='78;52;72;72;41;76;46;12;74;0B;59;70;85;AA;77;00;0F;1A;BB;69';

Ahora debo convertir estas dos palabras a bytes para luego efectuar una operación xor a nivel de bytes y, una vez hecho esto debo regresar el resultado
a un string.

El problemas es que no se como, alguien podría ayudarme. Muchísimas gracias

egostar 26-11-2007 21:44:13

Cita:

Empezado por Novás (Mensaje 248519)
Hola a todos, mi problemilla es el siguiente:

Tengo declaradas estas dos constantes:

Código Delphi [-]
const
  clave_xor='12345678B12345678***';
  pal_sec_ofuscada='78;52;72;72;41;76;46;12;74;0B;59;70;85;AA;77;00;0F;1A;BB;69';

Ahora debo convertir estas dos palabras a bytes para luego efectuar una operación xor a nivel de bytes y, una vez hecho esto debo regresar el resultado
a un string.

El problemas es que no se como, alguien podría ayudarme. Muchísimas gracias

Tengo una pregunta, como es que quieres hacer la operación, mezclando las dos constantes, cada constante por separado, no entiendo que quieres hacer.

Salud OS

Mick 27-11-2007 16:11:41

Cita:

Empezado por Novás (Mensaje 248519)
Código Delphi [-]
const
  clave_xor='12345678B12345678***';
 pal_sec_ofuscada='78;52;72;72;41;76;46;12;74;0B;59;70;85;AA;77;00;0F;1A;BB;69';

En el caso de clave_xor, ya esta en forma de bytes no hay que hacer nada especial.
No queda completamente claro el caso de pal_sec_ofuscada, supondre que cada 2 digitos entre comas representaria un byte en hexadecimal, como son constantes lo mas sencillo es directamente ponerlo en forma de bytes quedando asi.

Código Delphi [-]
const
  clave_xor= '12345678B12345678***';
  pal_sec_ofuscada= #$78#$52#$72#$72#$41#$76#$46#$12#$74#$0B#$59#$70#$85#$AA#$77#$00#$0F#$1A#$BB#$69;

Ahora para encriptar/desencriptar la palabra secreta con la clave, un bucle con un XOR, que seria algo parecido a esto (codigo sin probar):

Código Delphi [-]
function CryptXOR(const str,key:string):string;
var
 i:integer;
begin
 SetLength(Result, length(str));
 for i:=1 to length(str) do begin
     Result[i]:= Chr( Ord(str[i]) XOR Ord(key[((i-1) mod length(key))+1 ]) );
 end;
end;

// Y llamamos asi:

Resultado:= CryptXOR(pal_sec_ofuscada, clave_xor);

Saludos

marceloalegre 27-11-2007 16:28:14

Val
 
Buenos Días:
No me he puesto a analizar puntualmente tu problematica, pero para poder convertir un string a byte puedes usar esto:

Código Delphi [-]
          Val(ElString, ELByte, ErrorCode);

espero te sea util.

Saludos.

Novás 27-11-2007 16:28:43

Realmente lo que necesito es traducir esta función de php a delphi
Código PHP:

<?
$pal_sec_ofuscada 
"5D;7F;0A;27;09;0D;25;5D;04;01;0B;00;06;01;00;70;06;1C;19;19";
$clave_xor "eH2dJ9gkB82915026***";

$cad1_0 "0";
$cad2_0 "00";
$cad3_0 "000";
$cad4_0 "0000";
$cad5_0 "00000";
$cad6_0 "000000";
$cad7_0 "0000000";
$cad8_0 "00000000";
$pal_sec "";

$valor rand (099);
$id_trans date("mdHis").$valor;
$localizador="1234567890";
$numtarjeta=$_POST["bbva_number"];
$fechacad="20" $_POST["bbva_expires"];
$importe $_POST["card_total"];
$trozos explode (";"$pal_sec_ofuscada);
$tope count($trozos);

for (
$i=0$i<$tope $i++)
{
    
$res "";
    
$pal_sec_ofus_bytes[$i] = decbin(hexdec($trozos[$i]));    
    if (
strlen($pal_sec_ofus_bytes[$i]) == 7){ $pal_sec_ofus_bytes[$i] = $cad1_0.$pal_sec_ofus_bytes[$i]; }    
    if (
strlen($pal_sec_ofus_bytes[$i]) == 6){ $pal_sec_ofus_bytes[$i] = $cad2_0.$pal_sec_ofus_bytes[$i]; }
    if (
strlen($pal_sec_ofus_bytes[$i]) == 5){ $pal_sec_ofus_bytes[$i] = $cad3_0.$pal_sec_ofus_bytes[$i]; }
    if (
strlen($pal_sec_ofus_bytes[$i]) == 4){ $pal_sec_ofus_bytes[$i] = $cad4_0.$pal_sec_ofus_bytes[$i]; }
    if (
strlen($pal_sec_ofus_bytes[$i]) == 3){ $pal_sec_ofus_bytes[$i] = $cad5_0.$pal_sec_ofus_bytes[$i]; }
    if (
strlen($pal_sec_ofus_bytes[$i]) == 2){ $pal_sec_ofus_bytes[$i] = $cad6_0.$pal_sec_ofus_bytes[$i]; }
    if (
strlen($pal_sec_ofus_bytes[$i]) == 1){ $pal_sec_ofus_bytes[$i] = $cad7_0.$pal_sec_ofus_bytes[$i]; }
    
$pal_sec_xor_bytes[$i] = decbin(ord($clave_xor[$i]));
    if (
strlen($pal_sec_xor_bytes[$i]) == 7){ $pal_sec_xor_bytes[$i] = $cad1_0.$pal_sec_xor_bytes[$i]; }
    if (
strlen($pal_sec_xor_bytes[$i]) == 6){ $pal_sec_xor_bytes[$i] = $cad2_0.$pal_sec_xor_bytes[$i]; }
    if (
strlen($pal_sec_xor_bytes[$i]) == 5){ $pal_sec_xor_bytes[$i] = $cad3_0.$pal_sec_xor_bytes[$i]; }
    if (
strlen($pal_sec_xor_bytes[$i]) == 4){ $pal_sec_xor_bytes[$i] = $cad4_0.$pal_sec_xor_bytes[$i]; }
    if (
strlen($pal_sec_xor_bytes[$i]) == 3){ $pal_sec_xor_bytes[$i] = $cad5_0.$pal_sec_xor_bytes[$i]; }
    if (
strlen($pal_sec_xor_bytes[$i]) == 2){ $pal_sec_xor_bytes[$i] = $cad6_0.$pal_sec_xor_bytes[$i]; }
    if (
strlen($pal_sec_xor_bytes[$i]) == 1){ $pal_sec_xor_bytes[$i] = $cad7_0.$pal_sec_xor_bytes[$i]; }
    for (
$j=0$j<8$j++)
    {
        (string)
$res .= (int)$pal_sec_ofus_bytes[$i][$j] ^ (int)$pal_sec_xor_bytes[$i][$j];
    }
    
$xor[$i] = $res;
    
$pal_sec .= chr(bindec($xor[$i]));
}


Mick 27-11-2007 19:28:50

Ese parece el codigo fuente que suministra el banco ahi indicado, cuando se contrata con ellos su tpv virtual, sino recuerdo mal (hace varios años que implemente ese sistema) todos los mails, documentacion y codigo recibido del banco era confidencial. No se si han cambiado de politica y ese codigo se puede publicar actualmente, en todo caso sugiero que te asegures si puedes publicarlo y si no es asi, yo borraria el codigo fuente que muestras en ese mensaje.

Saludos

Novás 27-11-2007 20:18:38

Un saludo a todos, ante la respuesta de nuestro compañero Mick, he llamado con urgencia al servicio de atención al cliente de dicho banco y me han dicho que no hay ningún problema por publicar ese código ya que lo importante son la palabra secreta, el código_xor y la firma sacada a partir del algoritmo sha1 (todo ello único) además de otro sinfín de procedimientos en materia de seguridad que no voy a detallar aquí.
Por lo tanto puedo mantener el código.

De todas formas gracias Mick porque a mi ni se me había ocurrido esa posibilidad.

PD.
Agradezco cualquier tipo de ayuda en la traducción de dicho código. Nunca he trabajado en php (se queda como promesa de año nuevo) y no dispongo del tiempo necesario para ponerme al día y lograr traducirlo.


La franja horaria es GMT +2. Ahora son las 23:19:37.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi