<!-- START CUSTOM CODE --> <!-- START TEST FORM --> <form action="SPICE.php" method="post"> <p>Your key: <input type="text" name="key" /></p> <p>Your text: <input type="text" name="text" /></p> <p><input type="submit" /></p> </form> <!-- END TEST FORM --> <!-- START SPICE CODE --> <?php ################################################################################ # ======= # BLOCK 1 # ======= function crypt_major() { $all = range("\x00", "\xFF"); shuffle($all); $major_key = implode("", $all); return $major_key; } function crypt_minor() { $sample = array(); do { array_push($sample, 0, 1, 2, 3); } while (count($sample) != 256); shuffle($sample); $list = array(); for ($index = 0; $index < 64; $index++) { $b12 = $sample[$index * 4] << 6; $b34 = $sample[$index * 4 + 1] << 4; $b56 = $sample[$index * 4 + 2] << 2; $b78 = $sample[$index * 4 + 3]; array_push($list, $b12 + $b34 + $b56 + $b78); } $minor_key = implode("", array_map(chr, $list)); return $minor_key; } ################################################################################ # ======= # BLOCK 2 # ======= function named_major($name) { srand(crc32($name)); return crypt_major(); } function named_minor($name) { srand(crc32($name)); return crypt_minor(); } ################################################################################ # ======= # BLOCK 3 # ======= function _check_major($key) { if (is_string($key) && strlen($key) == 256) { foreach (range("\x00", "\xFF") as $char) { if (substr_count($key, $char) == 0) { return FALSE; } } return TRUE; } return FALSE; } function _check_minor($key) { if (is_string($key) && strlen($key) == 64) { $indexs = array(); foreach (array_map(ord, str_split($key)) as $byte) { foreach (range(6, 0, 2) as $shift) { array_push($indexs, ($byte >> $shift) & 3); } } $dict = array_count_values($indexs); foreach (range(0, 3) as $index) { if ($dict[$index] != 64) { return FALSE; } } return TRUE; } return FALSE; } ################################################################################ # ======= # BLOCK 4 # ======= function _encode_map_1($major) { return array_map(ord, str_split($major)); } function _encode_map_2($minor) { $map_2 = array(array(), array(), array(), array()); $list = array(); foreach (array_map(ord, str_split($minor)) as $byte) { foreach (range(6, 0, 2) as $shift) { array_push($list, ($byte >> $shift) & 3); } } for ($byte = 0; $byte < 256; $byte++) { array_push($map_2[$list[$byte]], chr($byte)); } return $map_2; } ################################################################################ # ======= # BLOCK 5 # ======= function _decode_map_1($minor) { $map_1 = array(); foreach (array_map(ord, str_split($minor)) as $byte) { foreach (range(6, 0, 2) as $shift) { array_push($map_1, ($byte >> $shift) & 3); } } return $map_1; } function _decode_map_2($major) { $map_2 = array(); $temp = array_map(ord, str_split($major)); for ($byte = 0; $byte < 256; $byte++) { $map_2[$temp[$byte]] = chr($byte); } return $map_2; } ################################################################################ # ======= # BLOCK 6 # ======= function _encode($string, $map_1, $map_2) { $cache = ""; foreach (str_split($string) as $char) { $byte = $map_1[ord($char)]; foreach (range(6, 0, 2) as $shift) { $cache .= $map_2[($byte >> $shift) & 3][mt_rand(0, 63)]; } } return $cache; } function _decode($string, $map_1, $map_2) { $cache = ""; $temp = str_split($string); for ($iter = 0; $iter < strlen($string) / 4; $iter++) { $b12 = $map_1[ord($temp[$iter * 4])] << 6; $b34 = $map_1[ord($temp[$iter * 4 + 1])] << 4; $b56 = $map_1[ord($temp[$iter * 4 + 2])] << 2; $b78 = $map_1[ord($temp[$iter * 4 + 3])]; $cache .= $map_2[$b12 + $b34 + $b56 + $b78]; } return $cache; } ################################################################################ # ======= # BLOCK 7 # ======= function encode_string($string, $major, $minor) { if (is_string($string)) { if (_check_major($major) && _check_minor($minor)) { $map_1 = _encode_map_1($major); $map_2 = _encode_map_2($minor); return _encode($string, $map_1, $map_2); } } return FALSE; } function decode_string($string, $major, $minor) { if (is_string($string) && strlen($string) % 4 == 0) { if (_check_major($major) && _check_minor($minor)) { $map_1 = _decode_map_1($minor); $map_2 = _decode_map_2($major); return _decode($string, $map_1, $map_2); } } return FALSE; } ################################################################################ ?> <!-- END SPICE CODE --> <!-- START TEST CODE --> <?php # BLOCK 1 TEST /*$test11 = crypt_major(); $test12 = crypt_minor(); echo "<br>" . bin2hex($test11) . "<br>"; echo "<br>" . bin2hex($test12) . "<br>";*/ # BLOCK 2 TEST /*$test21 = named_major($_POST['key']); $test22 = named_minor($_POST['key']); echo "<br>" . bin2hex($test21) . "<br>"; echo "<br>" . bin2hex($test22) . "<br>";*/ # BLOCK 3 TEST /*$test31 = named_major($_POST['key']); $test32 = named_minor($_POST['key']); echo "<br>" . _check_major($test31) . "<br>"; echo "<br>" . _check_minor($test32) . "<br>";*/ # BLOCK 4 TEST /*$test41 = named_major($_POST['key']); $test42 = named_minor($_POST['key']); echo "<br>" . print_r(_encode_map_1($test41), TRUE) . "<br>"; echo "<br>" . print_r(_encode_map_2($test42), TRUE) . "<br>";*/ # BLOCK 5 TEST /*$test51 = named_major($_POST['key']); $test52 = named_minor($_POST['key']); echo "<br>" . print_r(_decode_map_1($test52), TRUE) . "<br>"; echo "<br>" . print_r(_decode_map_2($test51), TRUE) . "<br>";*/ # BLOCK 6 & 7 TEST /*$test671 = named_major($_POST['key']); $test672 = named_minor($_POST['key']); echo "<br>" . bin2hex($test671) . "<br>"; echo "<br>" . bin2hex($test672) . "<br>"; if (strlen($_POST['text']) != 0) { $test673 = encode_string($_POST['text'], $test671, $test672); $test674 = decode_string($test673, $test671, $test672); echo "<br>" . bin2hex($test673) . "<br>"; echo "<br>" . $test674 . "<br>"; }*/ ?> <!-- END TEST CODE --> <!-- END CUSTOM CODE -->