Помогите понять, почему не работает вычисление модулуса? Yandex RSA :(

Бочонок

http://frontender.info
Помогите понять, почему не работает вычисление модулуса? Yandex RSA :(

Приятного времени суток.

Все еще пытаюсь вычислить значение RSA ключа для аутентификации в Yandex.
В скрипте, который я портирую значения:
plain: 554003437133040639513765374224520507347474125124531741075082249282423576007345212974772442760366790218493758
e: 65537
n: 7865784787017870779270485395935862591149846722128701673520235684814205031371559441970077382282047173187646893424558913504516708075555354911045791409453289
plain_pow: 437327449401808126917475828763845140703293184226624321490994159426779440364345836393027084607940653527902571539612380643449463814583218405813189700964678
У меня:
plain: 5.54003437133E+107
e: 65537
n: 7.86578478702E+153
plain_pow: 0
Тоесть что то не то при вычислении модулуса.
PHP:
		$plain_pow = $this->m_powmod($plain,$e,$n);
		private function m_powmod($d, $p, $m){
			for ($b = 1; $p;){
				if ($p & 1){
					$p--;
					$b = $this->m_mod($b * $d, $m);
				}else{
					$p >>= 1;
					$d = $this->m_mod($d * $d, $m);
				}
			}
			return $b;
		}
php скрипт:
http://gotoprint.in.ua/yandex_photo_class.rar
Портируемый JS скрипт (в архиве дополнительные библиотеки, например для работы с большими числами):
http://gotoprint.in.ua/yandex_js.rar

Или код на пастбине.
php скрипт:
http://pastebin.com/RFaTsk6w
Портируемый JS скрипт (только основной скрипт):
http://pastebin.com/zvKkChvj

Буду благодарен за подсказуку. С уважением. Бочонок.
 

Wicked

Новичок
ну... налицо переполнение int - он конвертится во float
http://php.net/manual/en/language.types.integer.php

в общем, везде, где производятся операции с числами, не входящими в диапазон int, нужно использовать gmp или bcmath

-~{}~ 27.02.10 01:20:

а код я твой не понял :) ты такие корявые результаты получаешь с помощью которой из функций?
 

Бочонок

http://frontender.info
Wicked
Заставил поддержку на хостинге установить gmp.
Похоже придется начинать все с 0.

Я ненавижу программистов Яндекс. :(
 

Wicked

Новичок
т.е ты эти результаты получал с помощью encrypt_yarsa? при этом encrypt_yarsa2 работает предположительно нормально, но у тебя на хостинге не было gmp, поэтому ты ее не смог там использовать?

-~{}~ 27.02.10 01:23:

и почему нужно начинать все с 0 ?
 

Бочонок

http://frontender.info
а код я твой не понял ты такие корявые результаты получаешь с помощью которой из функций?
Результаты совпадают с работой порта на js вплоть до злощастного вычисления модулуса (m_powmod).

В целом флоат меня вполне устраивал ... вот только в определенный момент функции уже не смогли правильно вычислить модулус.
Для вычисления модулуса используются функции:
private function m_mod($a,$b){
return floor($a)-floor($a/$b)*$b;
}

private function m_powmod($d, $p, $m){
for ($b = 1; $p;){
if ($p & 1){
$p--;
$b = $this->m_mod($b * $d, $m);
}else{
$p >>= 1;
$d = $this->m_mod($d * $d, $m);
}
}
return $b;
}
-~{}~ 26.02.10 22:26:

Wicked encrypt_yarsa2 не работает.
Это чужая неудачная попытка портировать.
Выяснить что не работает я могу только перебрав построчно всю функцию и сравнивая с резуьлтатом работы ф-и на js.
От разработки с 0 это почти ничем не отличается.

-~{}~ 26.02.10 22:27:

Переполнение в encrypt_yarsa, да.
 

Бочонок

http://frontender.info
Уже вижу, что не будет (
Если и с gmp такая же беда будет ... yandex может катится к черту.
 

Wicked

Новичок
Бочонок
с gmp не будет - оно поддерживает числа любой точности
 
Сверху