/    Sign up×
Community /Pin to ProfileBookmark

[RESOLVED] SHA-256 help…

i have been working on this for 3 days now, can not figure out what is going wrong here

[code=php]<?php
if(!function_exists(‘str_split’))
{
function str_split($string, $split_length = 1)
{
$r = array();

if($split_length < 1)
{
return false;
}
if($split_length > strlen($string))
{
return array($string);
}
for($i = 0; $i < strlen($string); $i += $split_length)
{
$r[] = substr($string, $i, $split_length);
}
return $r;
}
}
function right_shift($x, $n)
{
$z = 0x80000000;

if($z & $x)
{
$x >>= 1;
$x &= (~$z);
$x |= 0x40000000;
$x >>= ($n – 1);
}
else
{
$x >>= $n;
}
return $x;
}
function left_rotate($x, $n)
{
return ($x << $n) | right_shift($x, (32 – $n));
}
function right_rotate($x, $n)
{
return right_shift($x, $n) | ($x << (32 – $n));
}
function sha256($str)
{
$h0 = 0x6a09e667;
$h1 = 0xbb67ae85;
$h2 = 0x3c6ef372;
$h3 = 0xa54ff53a;
$h4 = 0x510e527f;
$h5 = 0x9b05688c;
$h6 = 0x1f83d9ab;
$h7 = 0x5be0cd19;
$k = array
(
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
);
$len = strlen($str);
$l = pack(‘N’, $len << 3);
$str = str_pad(“$strx80x0x0x0x0”, ($len &~ 63) + ((($len & 63) < 56) ? 60 : 124), “x0”) . $l;
$chunks = str_split($str, 64);

foreach($chunks as $chunk)
{
$w = array_values(unpack(‘N16’, $chunk));

for($i = 16; $i <= 63; $i++)
{
$s0 = right_rotate($w[$i – 15], 7) ^ right_rotate($w[$i – 15], 18) ^ right_shift($w[$i – 15], 3);
$s1 = right_rotate($w[$i – 2], 17) ^ right_rotate($w[$i – 2], 19) ^ right_shift($w[$i – 2], 10);
$w[$i] = $w[$i – 16] + $s0 + $w[$i – 7] + $s1;
}
$a = $h0;
$b = $h1;
$c = $h2;
$d = $h3;
$e = $h4;
$f = $h5;
$g = $h6;
$h = $h7;

for($i = 0; $i <= 63; $i++)
{
$s0 = right_rotate($a, 2) ^ right_rotate($a, 13) ^ right_rotate($a, 22);
$maj = ($a & $b) | ($b & $c) | ($c & $a);
$t0 = $s0 + $maj;
$s1 = right_rotate($e, 6) ^ right_rotate($e, 11) ^ right_rotate($e, 25);
$ch = ($e & $f) | ((~$e) & $g);
$t1 = $h + $s1 + $ch + $k[$i] + $w[$i];

$h = $g;
$g = $f;
$f = $e;
$e = $d + $t1;
$d = $c;
$c = $b;
$b = $a;
$a = $t0 + $t1;
}
$h0 = $h0 + $a;
$h1 = $h1 + $b;
$h2 = $h2 + $c;
$h3 = $h3 + $d;
$h4 = $h4 + $e;
$h5 = $h5 + $f;
$h6 = $h6 + $g;
$h7 = $h7 + $h;
}
$hash = pack(‘N*’, $h0, $h1, $h2, $h3, $h4, $h5, $h6, $h7);
return bin2hex($hash);
}
?>[/code]

the tests: ”, ‘abc’, ‘abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq’
the hashes: ‘ba7816bf8f01cfea414140de5dae2223b00361a396177a9cb410ff61f20015ad’, ‘e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855’, ‘248d6a61d20638b8e5c026930c3e6039a33ce45964ff2167f6ecedd419db06c1’
i get the correct hashes for the first 2, but the last one i get: ’66ca9088cf6f5d100f721c10a946591474bedac898972fe0845253100cb060d8′

to post a comment
PHP

8 Comments(s)

Copy linkTweet thisAlerts:
@BeachSideJun 28.2005 — Are you using sha1() as the hash?
Copy linkTweet thisAlerts:
@Stephen_PhilbinJun 28.2005 — No. (S)He's trying to build a custom sha256 function by the looks of it.

At a rough guess I'd say it'd be a problem with the character encoding used vs the expected result. I would imagine using the >> operator on characters of a slightly different character encoding could yield drastically different results (which would only be multiplied as the function went on).

Your function may well be spitting out the correct code points, but having the incorrect (or rather unexpected) glyphs mapped to them. To check if your function [i]really[/i] works you'd probably be best comparing code points as input/output, rather than comparing glyphs.
Copy linkTweet thisAlerts:
@ShrineDesignsauthorJun 28.2005 — nope SHA-256 (i finished the sha1 function a couple of days ago),

hmm... if that was the case, wouldn't it cause all of the produced hashes to be incorrect?

i followed http://en.wikipedia.org/wiki/SHA-1 to a t, it is weird because my sha1 function works fine

could the problem be caused by running it on a 32-bit system (win 2k), i know the SHA-384 and SHA-512 use 64 bit integers

i found a SHA-256 script a couple of days ago, i run it and see if it comes up with different results and try and figure out what the difference is

EDIT:

i ran that script, and i used this part and it works now[code=php]function sum()
{
$r = 0;

for($x = 0, $y = func_num_args(); $x < $y; $x++)
{
$a = func_get_arg($x);
$c = 0;

for($i = 0; $i < 32; $i++)
{
$j = (($r >> $i) & 1) + (($a >> $i) & 1) + $c;
$c = ($j >> 1) & 1;
$j &= 1;
$r &= ~(1 << $i);
$r |= $j << $i;
}
}
return $r;
}[/code]
where it computes the sum of e= d + t1 and a = t0 + t1

cool, i can start working on SHA-384 and SHA-512 now hehe
Copy linkTweet thisAlerts:
@Stephen_PhilbinJun 28.2005 — Now you come to mention it I do remember there being a mention about 32 and 64 bit chips and the >> operator. I'm pretty sure it was in the PHP manual at Zend that I read it, though it may well have been one of the other general articles they often publish. I'll have a root around for it when I have time later and see if I can fish it out for ya. ?
Copy linkTweet thisAlerts:
@BeachSideJun 28.2005 — YIKES! --> http://en.wikipedia.org/wiki/SHA-1 <-- Yo that is too much confusing stuff to wrap my head around good thing I'm not the super math guy :eek:
Copy linkTweet thisAlerts:
@ShrineDesignsauthorJun 28.2005 — lol, actually, the SHA-256 is a rather simple algorithm

it is funny, the way FIPS wrote out the algorithm it looks far more complex

i played around with the SHA-512 last night, and it is not possible to do on a 32-bit system, it was returning a 32-bit string

that sum() function, would there be a way to do that without looping 32 times, it is rather slow

EDIT:

i found a quicker solution to the sum() function, $e = (int) $d + (int) $t1; and $a = (int) $t1 + (int) $t2; php was adding them as float not int
Copy linkTweet thisAlerts:
@ShrineDesignsauthorJun 28.2005 — SHA-256[code=php]<?php
function shr($x, $n)
{
return (0x80000000 & $x) ? (($x >> 1) & ~0x80000000 | 0x40000000) >> ($n - 1) : ($x >> $n);
}
function rotr($x, $n)
{
return shr($x, $n) | ($x << (32 - $n));
}
function sha256($str, $raw_output = false)
{
$h0 = 0x6a09e667;
$h1 = 0xbb67ae85;
$h2 = 0x3c6ef372;
$h3 = 0xa54ff53a;
$h4 = 0x510e527f;
$h5 = 0x9b05688c;
$h6 = 0x1f83d9ab;
$h7 = 0x5be0cd19;
$k = array
(
0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
);
$l = strlen($str);
$str = str_pad("$strx80", ($l & ~63) + ((($l & 63) < 56) ? 60 : 124), "x0") . pack('N', $l << 3);

for($i = 0; $i < strlen($str); $i += 64)
{
$w = array_values(unpack('N16', substr($str, $i, 64)));
$a = $h0;
$b = $h1;
$c = $h2;
$d = $h3;
$e = $h4;
$f = $h5;
$g = $h6;
$h = $h7;

for($t = 0; $t <= 63; $t++)
{
if(16 <= $t)
{
$s0 = rotr($w[$t - 15], 7) ^ rotr($w[$t - 15], 18) ^ shr($w[$t - 15], 3);
$s1 = rotr($w[$t - 2], 17) ^ rotr($w[$t - 2], 19) ^ shr($w[$t - 2], 10);
$w[] = $s1 + $w[$t - 7] + $s0 + $w[$t - 16];
}
$s0 = rotr($a, 2) ^ rotr($a, 13) ^ rotr($a, 22);
$s1 = rotr($e, 6) ^ rotr($e, 11) ^ rotr($e, 25);
$ch = ($e & $f) ^ (~$e & $g);
$maj = ($a & $b) ^ ($b & $c) ^ ($c & $a);
$t1 = intval($h + $s1 + $ch + $k[$t] + $w[$t]);
$t2 = intval($s0 + $maj);

$h = $g;
$g = $f;
$f = $e;
$e = intval($d + $t1);
$d = $c;
$c = $b;
$b = $a;
$a = intval($t1 + $t2);
}
$h0 = $a + $h0;
$h1 = $b + $h1;
$h2 = $c + $h2;
$h3 = $d + $h3;
$h4 = $e + $h4;
$h5 = $f + $h5;
$h6 = $g + $h6;
$h7 = $h + $h7;
}
$hash = pack('N*', $h0, $h1, $h2, $h3, $h4, $h5, $h6, $h7);

if($raw_output)
{
return $hash;
}
return bin2hex($hash);
}
?>[/code]
Copy linkTweet thisAlerts:
@ShrineDesignsauthorJul 03.2005 — nevermind, fixed it lol
×

Success!

Help @ShrineDesigns spread the word by sharing this article on Twitter...

Tweet This
Sign in
Forgot password?
Sign in with TwitchSign in with GithubCreate Account
about: ({
version: 0.1.9 BETA 5.19,
whats_new: community page,
up_next: more Davinci•003 tasks,
coming_soon: events calendar,
social: @webDeveloperHQ
});

legal: ({
terms: of use,
privacy: policy
});
changelog: (
version: 0.1.9,
notes: added community page

version: 0.1.8,
notes: added Davinci•003

version: 0.1.7,
notes: upvote answers to bounties

version: 0.1.6,
notes: article editor refresh
)...
recent_tips: (
tipper: @AriseFacilitySolutions09,
tipped: article
amount: 1000 SATS,

tipper: @Yussuf4331,
tipped: article
amount: 1000 SATS,

tipper: @darkwebsites540,
tipped: article
amount: 10 SATS,
)...