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