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