Tema: Tpv Bbva
Ver Mensaje Individual
  #40 (permalink)  
Antiguo 10/03/2009, 14:27
yazo
 
Fecha de Ingreso: abril-2003
Mensajes: 363
Antigüedad: 23 años, 6 meses
Puntos: 3
Respuesta: Tpv Bbva

Vuelvo a abrir este tema porque estoy teniendo problemas con la firma o con la desofuscación de la palabra clave.

Estoy usando la función desobfuscate que se ha publicado en este tema y nada, y la firma con SHA, después he probado con lo que vienen en el manual del banco y tampoco, aqui pongo el codigo:

Código PHP:
$pal_sec_ofuscada = "**********";
$clave_xor = "***********";

$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 (0, 99);
$id_trans = date("mdHis").$valor;
$localizador="1234567890";
$importe = "22.30";
$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]));
}


// sha1 algorithm
class SHA { 
    var 
$A, $B, $C, $D, $E;
    var 
$ta, $tb, $tc, $td, $te;
    var 
$K0_19, $K20_39, $K40_59, $K60_79; 

    var 
$buffer; 
    var 
$buffsize; 
    var 
$totalsize; 

    function 
SHA () { 
        
$this->init(); 
    } 

    function 
init () {
        
$this->A = 0x6745 << 16 | 0x2301; 
        
$this->B = 0xefcd << 16 | 0xab89; 
        
$this->C = 0x98ba << 16 | 0xdcfe; 
        
$this->D = 0x1032 << 16 | 0x5476; 
        
$this->E = 0xc3d2 << 16 | 0xe1f0; 
        
$this->ta = $this->A; 
        
$this->tb = $this->B; 
        
$this->tc = $this->C; 
        
$this->td = $this->D; 
        
$this->te = $this->E; 
        
$this->K0_19 = 0x5a82 << 16 | 0x7999; 
        
$this->K20_39 = 0x6ed9 << 16 | 0xeba1; 
        
$this->K40_59 = 0x8f1b << 16 | 0xbcdc; 
        
$this->K60_79 = 0xca62 << 16 | 0xc1d6; 
        
$this->buffer = array(); 
        
$this->buffsize = 0; 
        
$this->totalsize = 0; 
    } 

    function 
bytes_to_words( $block ) { 
        
$nblk = array(); 
        for( 
$i=0; $i<16; ++$i) { 
            
$index = $i * 4; 
            
$nblk[$i] = 0; 
            
$nblk[$i] |= ($block[$index] & 0xff) << 24; 
            
$nblk[$i] |= ($block[$index+1] & 0xff) << 16; 
            
$nblk[$i] |= ($block[$index+2] & 0xff) << 8; 
            
$nblk[$i] |= ($block[$index+3] & 0xff); 
        } 
        return 
$nblk; 
    } 

    function 
pad_block( $block, $size ) {
        
$blksize = sizeof( $block ); 
        
$bits = $size * 8; 
        
$newblock = $block; 
        
$newblock[] = 0x80;
        while((
sizeof($newblock) % 64) != 56) { 
            
$newblock[] = 0; 
        }
        for (
$i=0; $i<8; ++$i) { 
            
$newblock[] = ($i<4) ? 0 : ($bits >> ((7-$i)*8)) & 0xff; 
        } 
        return 
$newblock; 
    } 

    function 
circ_shl( $num, $amt ) { 
        
$leftmask = 0xffff | (0xffff << 16); 
        
$leftmask <<= 32 - $amt; 
        
$rightmask = 0xffff | (0xffff << 16); 
        
$rightmask <<= $amt; 
        
$rightmask = ~$rightmask; 
        
$remains = $num & $leftmask; 
        
$remains >>= 32 - $amt; 
        
$remains &= $rightmask; 
        
$res = ($num << $amt) | $remains; 
        return 
$res; 
    } 
    function 
f0_19( $x, $y, $z ) { 
        return (
$x & $y) | (~$x & $z); 
    } 
    function 
f20_39( $x, $y, $z ) { 
        return (
$x ^ $y ^ $z); 
    } 

    function 
f40_59( $x, $y, $z ) { 
        return (
$x & $y) | ($x & $z) | ($y & $z); 
    } 

    function 
f60_79( $x, $y, $z ) { 
        return 
$this->f20_39( $x, $y, $z ); 
    } 

    function 
expand_block( $block ) { 
        
$nblk = $block; 
        for( 
$i=16; $i<80; ++$i ) { 
                                     
$nblk[$i] = $this->circ_sh l( $nblk[$i-3] ^ $nblk[$i-8] ^ $nblk[$i-
                                     
14] ^ $nblk[$i-16], 1);
        } 
        return 
$nblk; 
    } 

    function 
print_bytes( $bytes ) { 
        
$len = sizeof( $bytes ); 
        for( 
$i=0; $i<$len; ++$i) { 
            
$str[] = sprintf(  "%02x", $bytes[$i] ); 
        } 
        print( 
join(  ", ", $str ) .  "\n" ); 
    } 

    function 
wordstr( $word ) { 
        return 
sprintf(  
             
"%04x%04x", ($word >> 16) & 0xffff, $word & 0xffff 
            
); 
    } 

    function 
print_words( $words ) { 
        
$len = sizeof( $words ); 
        for( 
$i=0; $i<$len; ++$i) { 
            
$str[] = $this->wordstr( $words[$i] ); 
        } 
        print( 
join(  ", ", $str ) .  "\n" ); 
    } 

    function 
hash_to_string( $hash ) { 
        
$len = sizeof( $hash );
        for (
$i=0; $i<$len; ++$i) { 
            
$astr .= $this->wordstr( $hash[$i] ); 
        } 
        return 
$astr; 
    } 

    function 
add( $a, $b ) { 
        
$ma = ($a >> 16) & 0xffff; 
        
$la = ($a) & 0xffff; 
        
$mb = ($b >> 16) & 0xffff; 
        
$lb = ($b) & 0xffff; 
        
$ls = $la + $lb; 
         
// Carry 
        
if ($ls > 0xffff) { 
            
$ma += 1; 
            
$ls &= 0xffff; 
        } 
        
$ms = $ma + $mb; 
        
$ms &= 0xffff; 
        
$result = ($ms << 16) | $ls; 
        return 
$result; 
    } 

    function 
process_block( $blk ) { 
        
$blk = $this->expand_block( $blk ); 
        for( 
$i=0; $i<80; ++$i ) { 
            
$temp = $this->circ_shl( $this->ta, 5 ); 
            if (
$i<20) { 
                
$f = $this->f0_19( $this->tb, $this->tc, $this->td ); 
                
$k = $this->K0_19; 
            } 
            elseif (
$i<40) { 
                
$f = $this->f20_39( $this->tb, $this->tc, $this->td ); 
                
$k = $this->K20_39; 
            } 
            elseif (
$i<60) { 
                
$f = $this->f40_59( $this->tb, $this->tc, $this->td ); 
                
$k = $this->K40_59; 
            } 
            else { 
                
$f = $this->f60_79( $this->tb, $this->tc, $this->td ); 
                
$k = $this->K60_79; 
            } 
            
$temp = $this->add( $temp, $f ); 
            
$temp = $this->add( $temp, $this->te ); 
            
$temp = $this->add( $temp, $blk[$i] ); 
            
$temp = $this->add( $temp, $k ); 
            
$this->te = $this->td; 
            
$this->td = $this->tc; 
            
$this->tc = $this->circ_shl( $this->tb, 30 ); 
            
$this->tb = $this->ta; 
            
$this->ta = $temp; 
        } 
        
$this->A = $this->add( $this->A, $this->ta ); 
        
$this->B = $this->add( $this->B, $this->tb ); 
        
$this->C = $this->add( $this->C, $this->tc ); 
        
$this->D = $this->add( $this->D, $this->td ); 
        
$this->E = $this->add( $this->E, $this->te ); 
    } 

    function 
update ( $bytes ) { 
        
$length = sizeof( $bytes ); 
        
$index = 0; 
        while ((
$length - $index) + $this->buffsize >= 64) { 
            for( 
$i=$this->buffsize; $i<64; ++$i) { 
                
$this->buffer[$i] = $bytes[$index + $i - $this->buffsize]; 
            } 
            
$this->process_block( $this->bytes_to_words( $this->buffer ) ); 
            
$index += 64; 
            
$this->buffsize = 0; 
        } 
        
$remaining = $length - $index; 
        for( 
$i=0; $i<$remaining; ++$i) { 
            
$this->buffer[$this->buffisze + $i] = $bytes[$index + $i]; 
        } 
        
$this->buffsize += $remaining; 
        
$this->totalsize += $length; 
    } 

    function final() { 
        for( 
$i=0; $i<$this->buffsize; ++$i) { 
            
$last_block[$i] = $this->buffer[$i]; 
        } 
        
$this->buffsize = 0; 
        
$last_block = $this->pad_block( $last_block, $this->totalsize ); 
        
$index = 0; 
        
$length = sizeof( $last_block ); 
        while( 
$index < $length ) 
        {
            
$block = array(); 
            for( 
$i=0; $i<64; ++$i) { 
                
$block[$i] = $last_block[$i + $index]; 
            } 
            
$this->process_block( $this->bytes_to_words( $block ) ); 
            
$index += 64; 
        } 

        
$result[0] = $this->A; 
        
$result[1] = $this->B; 
        
$result[2] = $this->C; 
        
$result[3] = $this->D; 
        
$result[4] = $this->E; 
        return 
$result; 
    } 
    function 
hash_bytes( $bytes ) { 
        
$this->init(); 
        
$this->update( $bytes ); 
        return 
$this->final(); 
    } 
    function 
hash_string( $str ) { 
        
$len = strlen( $str ); 
        for(
$i=0; $i<$len; ++$i) { 
            
$bytes[] = ord( $str[$i] ) & 0xff; 
        } 
        return 
$this->hash_bytes( $bytes ); 
    } 
}

$sha = new SHA;
$datosfirma = "*****"."******".$id_trans."22.30".$res;
$digest1 = $sha->hash_string($message);
$firma = strtoupper ($sha->hash_to_string($digest1)); 
¿Sabéis cual puede ser el error?

Muchas Gracias