Richie
Richie

Reputation: 1439

How to hash a file using an algorithm I created

I'm trying to hash a file (called hash.txt) using an algorithm (MD9) I've just created.

Here is the code

<?php


        function MD9($m)
        {
            static $s = array(
                 41,  46,  67, 201, 162, 216, 124,   1,  61,  54,  84, 161, 236, 240, 6,
                 19,  98, 167,   5, 243, 192, 199, 115, 140, 152, 147,  43, 217, 188,
                 76, 130, 202,  30, 155,  87,  60, 253, 212, 224,  22, 103,  66, 111, 24,
                138,  23, 229,  18, 190,  78, 196, 214, 218, 158, 222,  73, 160, 251,
                245, 142, 187,  47, 238, 122, 169, 104, 121, 145,  21, 178,   7,  63,
                148, 194,  16, 137,  11,  34,  95,  33, 128, 127,  93, 154,  90, 144, 50,
                 39,  53,  62, 204, 231, 191, 247, 151,   3, 255,  25,  48, 179,  72, 165,
                181, 209, 215,  94, 146,  42, 172,  86, 170, 198,  79, 184,  56, 210,
                150, 164, 125, 182, 118, 252, 107, 226, 156, 116,   4, 241,  69, 157,
                112,  89, 100, 113, 135,  32, 134,  91, 207, 101, 230,  45, 168,   2, 27,
                 96,  37, 173, 174, 176, 185, 246,  28,  70,  97, 105,  52,  64, 126, 15,
                 85,  71, 163,  35, 221,  81, 175,  58, 195,  92, 249, 206, 186, 197,
                234,  38,  44,  83,  13, 110, 133,  40, 132,   9, 211, 223, 205, 244, 65,
                129,  77,  82, 106, 220,  55, 200, 108, 193, 171, 250,  36, 225, 123,
                  8,  12, 189, 177,  74, 120, 136, 149, 139, 227,  99, 232, 109, 233,
                203, 213, 254,  59,   0,  29,  57, 242, 239, 183,  14, 102,  88, 208, 228,
                166, 119, 114, 248, 235, 117,  75,  10,  49,  68,  80, 180, 143, 237,
                 31,  26, 219, 153, 141,  51, 159,  17, 131, 20
            );

            // Step 1. Append Padding Bytes
            $pad = 16 - (strlen($m) & 0xF);
            $m.= str_repeat(chr($pad), $pad);

            $length = strlen($m);

            // Step 2. Append Checksum
            $c = str_repeat(chr(0), 16);
            $l = chr(0);
            for ($i = 0; $i < $length; $i+= 16) {
                for ($j = 0; $j < 16; $j++) {
                    // RFC1319 incorrectly states that C[j] should be set to S[c xor L]
                    //$c[$j] = chr($s[ord($m[$i + $j] ^ $l)]);
                    // per <http://www.rfc-editor.org/errata_search.php?rfc=1319>, however, C[j] should be set to S[c xor L] xor C[j]
                $c[$j] = chr($s[ord($m[$i + $j] ^ $l)] ^ ord($c[$j]));
                $l = $c[$j];
            }
        }
        $m.= $c;

        $length+= 16;

        // Step 3. Initialize MD Buffer
        $x = str_repeat(chr(0), 48);

        // Step 4. Process Message in 16-Byte Blocks
        for ($i = 0; $i < $length; $i+= 16) {
            for ($j = 0; $j < 16; $j++) {
                $x[$j + 16] = $m[$i + $j];
                $x[$j + 32] = $x[$j + 16] ^ $x[$j];
            }
            $t = chr(0);
            for ($j = 0; $j < 18; $j++) {
                for ($k = 0; $k < 48; $k++) {
                    $x[$k] = $t = $x[$k] ^ chr($s[ord($t)]);
                    //$t = $x[$k] = $x[$k] ^ chr($s[ord($t)]);
                }
                $t = chr(ord($t) + $j);
            }
        }

        // Step 5. Output
        return bin2hex(substr($x, 0, 16));
    }

    ?>

When I try to run

<?php

include 'md9.php';

class hashing {
     public static function filehash($file,$hash) {
     if (file_exists($file)) {
         return hash($hash,file_get_contents($file));
     }
     else {
         return "Error Occurred: File Does Not Exist";
     }
 }
 }

  echo hashing::filehash("hash.txt","md9")."<br />";

?>

am getting an error "Warning: hash() [function.hash]: Unknown hashing algorithm: md9"

I have tried hashing a string of characters using the same algorithm and it's working well.

I don't know what's the problem with the algorithm and hashing files.

Somebody sort me out please

Upvotes: 0

Views: 354

Answers (1)

christopher
christopher

Reputation: 27346

If you read the documentation, here's the link, you'll see that you can't just plug in any algorithm you decide. "md9" does not mean anything to PHP. It is something you've made up. You need to implement the method yourself, to hash the file, and call that method from filehash. Although, a word of advice. Making up your own hashing algorithms isn't the safest method. The established hashing algorithms (sha1, sha-2) are provably secure.

Upvotes: 3

Related Questions