Помощ относно 1 script

Moonshine_

Registered
Здравейте,

Отдавна търся решение на един проблем, който имам със скрипт, но никъде не можах да намеря решение, затова надеждата ми остава във вас :)

Скрипта по принцип се използва, за да криптира паролите на потребителите - всичко си работи чудесно. Проблема е, че на мен ми трябва да извежда 40 символа hash, а той извежда 80. След доста ровене в google открих причината за това - 40 символа извежда само при 32 битови сървъри. За съжаление хоста разполага единствено с 64и битови, откъдето ми изкарва 80 символен hash и съответно скрипта става неизползваем. Разбрах, че на теория 40 символния hash се съдържа в 80 символния, тоест може да бъде извлечен, но си нямам никаква идея как ще стане, затова и пиша тук.

Ето какво представлява самия скрипт:

Код:
<?php

function str2blks_pvpgn($str) {
	$nblk = ((strlen($str) + 8) >> 6) + 1;
	
	for($i=0; $i < $nblk * 16; $i++) $blks[$i] = 0;
	for($i=0; $i < strlen($str); $i++) {
		$blks[$i >> 2] |= ord(substr($str, $i, 1)) << ( ($i % 4) * 8);
	}
	return $blks;
}
function safe_add($x, $y) {
	$lsw = ($x & 0xFFFF) + ($y & 0xFFFF);
	$msw = ($x >> 16) + ($y >> 16) + ($lsw >> 16);
	return ($msw << 16) | ($lsw & 0xFFFF);
}

function safe_not( $num ) {
	$lsw = (~($num & 0xFFFF)) & 0xFFFF;
	$msw = (~($num >> 16)) & 0xFFFF;
	return ($msw << 16)  | $lsw;
}

function safe_rol( $num, $amt ) {
        $leftmask = 0xffff | (0xffff << 16);
        $leftmask <<= 32 - $amt;
        $rightmask = 0xffff | (0xffff << 16);
        $rightmask <<= $amt;
        $rightmask = safe_not($rightmask);

        $remains = $num & $leftmask;
        $remains >>= 32 - $amt;
        $remains &= $rightmask;

        $res = ($num << $amt) | $remains;

        return $res;
}

function ft($t, $b, $c, $d) {
	if($t < 20) return ($b & $c) | ((safe_not($b)) & $d);
	if($t < 40) return $d ^ $c ^ $b;
	if($t < 60) return ($c & $b) | ($d & $c) | ($d & $b);
	return $d ^ $c ^ $b;
}

function kt($t) {
	if ($t < 20) {
		return  0x5a82 << 16 | 0x7999;
	} else if ($t < 40) {
		return  0x6ed9 << 16 | 0xeba1;
	} else if ($t < 60) {
		return  0x8f1b << 16 | 0xbcdc;
	} else {
		return  0xca62 << 16 | 0xc1d6;
	}
}
function pvpgn_hash($str) {
	$x = str2blks_pvpgn($str);
		
	$a =  0x6745 << 16 | 0x2301;
	$b =  0xefcd << 16 | 0xab89;
	$c =  0x98ba << 16 | 0xdcfe;
	$d =  0x1032 << 16 | 0x5476;
	$e =  0xc3d2 << 16 | 0xe1f0;	
	
	for($i = 0; $i < sizeof($x); $i += 16) {
		$olda = $a;
		$oldb = $b;
		$oldc = $c;
		$oldd = $d;
		$olde = $e;
		
		for($j = 0; $j < 16; $j++) {		
			$w[$j] = $x[$i+$j];
		}

		for($j = 0; $j < 64; $j++) {		
			$ww = $w[$j] ^ $w[$j+8] ^ $w[$j+2] ^ $w[$j+13];
			$w[$j+16] = 1 << ($ww%32);
		}
		
		for($j = 0; $j < 80; $j++) {
			if ($j<20)
			{
				$t = safe_add(safe_add(safe_rol($a, 5), ft($j, $b, $c, $d)), safe_add(safe_add($e, $w[$j]), kt($j)));
			}
			else
			{
				$t = safe_add(safe_add(safe_rol($t, 5), ft($j, $b, $c, $d)), safe_add(safe_add($e, $w[$j]), kt($j)));
			}
			$e = $d;
			$d = $c;
			$c = safe_rol($b, 30);
			$b = $a;
 			$a = $t;
		}
		$a = safe_add($t, $olda);
		$b = safe_add($b, $oldb);
		$c = safe_add($c, $oldc);
		$d = safe_add($d, $oldd);
		$e = safe_add($e, $olde);
	}
	return sprintf("%08x%08x%08x%08x%08x",$a,$b,$c,$d,$e);
}

?>

Благодаря предварително.. +1 за помощта (ако можех и +100 щях да дам ама.. :))
 
Ако кажеш и кой алгоритъм използва оО
Аз изобщо не мога да се ориентирам :Д Буквално за мен този код е някви random побитови операции :D
И също така пита ли там, от където си го взел ?
 
Rado каза:
Ако кажеш и кой алгоритъм използва оО
Аз изобщо не мога да се ориентирам :Д Буквално за мен този код е някви random побитови операции :D
И също така пита ли там, от където си го взел ?
Да, питах навсякъде където можах.. Никъде не получих отговор, въпреки че то май е очевидно щом питам и тук :)

Малко повече детайли да дам.. Имам гейм сървър използващ mysql и използващ точно този скрипт за криптиране на паролите. От google попаднах на готова web базирана регистрационна система. Взех от нея единствено файла, който криптира паролата (този от предния ми пост), за да мога да създавам собствена система за регистрация. След като я качих на хоста дойде времето да се тества, тогава и забелязах проблема със символите. Първото което направих беше да кача и другата система, за да проверя дали проблема е от системата която писах, или от криптиращия файл. За съжаление резултата беше същия.. На домашното PC работи без проблем, създава акаунта, сървъра си разчита паролата - всичко е чудесно, но е 32 битово.. :(
 
Със substr() да изрежеш всичко след 40 символ, не става ли? Или ти трябва задължително целия низ?
 
Не, няма да стане..
Ето един пример с парола "password":

При 32 битова OS: 1d0dc8ecc058e776258cdab9ff6a10ff1629248e
При 64 битова OS: dc88507b1d0dc8ecc20e9cf1c058e7768cd1fdbc258cdab9af37bc89ff6a10ff5256429f1629248e

Тества се с един и същи скрипт, така че изключвам вероятността от грешка.
 
Аз не схващам логиката от 10 километрови кодиращи алгоритми....
Ще даваш ли на някой паролата? Не
Тогава просто си защити сайта и ги криптирай с md5 или ако си super-security-paranoid -> md5(hash('whirlpool', $parola));
 
alex95_bg_2 каза:
Аз не схващам логиката от 10 километрови кодиращи алгоритми....
Ще даваш ли на някой паролата? Не
Тогава просто си защити сайта и ги криптирай с md5 или ако си super-security-paranoid -> md5(hash('whirlpool', $parola));

Принципно на мен и само md5 ми е достатъчно, но както казах в един от предните си постове, гейм сървъра, който поддържам криптира паролите по по-специфичен начин.. Без този файл цялата регистрационна система е безполезна.
 
Защо е задължително да криптираш така, може с md5 или друг метод като SHA1, Base64
 
federer_11 каза:
Защо е задължително да криптираш така, може с md5 или друг метод като SHA1, Base64

Обясних го в предния си пост.. Web регистрацията е за гейм сървър, който криптира паролите си точно по този начин. Ако използвам md5, след регистрация сървъра как ще провери паролата след като използва свои начин за криптиране? По този начин трябва да стане, но аз лично не знам как, за това търся помощ тук..
 
Човека иска да каже че играта не е браузърна ами е нещо като му диабло линеайдж уоу и т.н.
И че когато си напишеш паролата за вход то ти я "кодира" и той няма как да промени интерфейса на играта.
 
Rushvet каза:
Човека иска да каже че играта не е браузърна ами е нещо като му диабло линеайдж уоу и т.н.
И че когато си напишеш паролата за вход то ти я "кодира" и той няма как да промени интерфейса на играта.

Именно! Всъщност е точно диабло :) Добре, че се разбрахме най-накрая, защото с това md5 почнах да се отчайвам :D
Както и да е, надявам се някой да изскочи с решение на проблема.. :)
 
Малко съм пиян и недоспал и трудно става. Написах в пхп.нет 32 64 и всичко 2-те функции дето не разбрах какво правят ти ги давам да си ги провериш, че ен съм в състояние.
http://bg.php.net/manual/en/function.crc32.php
И от гоогле 2 сърча. Не знам какво пише ама заглавието си беше точно за конвертиране от 32 в 64 и обратното
http://www.freepatentsonline.com/7406681.html
http://answers.yahoo.com/question/index?qid=20080619022907AAUU38I
 
Ох.. Опитах, но аз не мога да го направя (ако можех нямаше и да търся помощ тук), за жалост все още съм начинаещ.. Просто се надявах, че някой ще може да даде готово решение на проблема, не очаквах, че толкова ще ви затрудни :(
 
Ами ние сме свикнали само на въпроси - как се вгражда ХТМЛ в ПХП и доста са ни закърнели мозъците за по сложна тематика. Въпроса ти е доста труден...
 
Добре... как да гадаем?
Кажи кой е алгоритъма поне
Малко ще помогне

Или си сложи сайта на 32 битопва ос тогава
 
alex95_bg_2 каза:
Добре... как да гадаем?
Кажи кой е алгоритъма поне
Малко ще помогне

Или си сложи сайта на 32 битопва ос тогава

** This code in general is based on:
** Copyright 2002 - 2003 Marcus Campbell
** http://www.tecknik.net/sha-1/
** Based on the JavaScript SHA-1 implementation by Paul Johnston
** http://pajhome.org.uk/

** the safe_rol function is taken from an PHP SHA-1 implementation
** written by Chris Monson (chris@bouncingchairs.net)
** Most recent version available on http://bouncingchairs.net
** (Based on the SHA algorithm as given in "Applied Cryptography")
 

Горе