<?php
// возвращает md5 hex конкатеированных строк как десятичное число.
function H
( array $args ) { $string = '' ;
foreach ( $args as $argument ) {
$string .= $argument . ':' ;
}
return bchexdec
( md5 ( $string ) ) ; }
// hexdex для больших чисел (взято из комментариев на php.net).
function bchexdec( $hex ) {
} else {
$remain = substr ( $hex , 0 , - 1 ) ; }
}
// шаг 1: подготовка.
# логин, пароль
$I = 'Filli' ;
$p = 'Vanilli' ;
# жуткое число — safe prime
$N = '00:c0:37:c3:75:88:b4:32:98:87:e6:1c:2d:a3:32:4b:1b:a4:b8:1a:63:f9:74:8f:ed:2d:8a:41:0c:2f:c2:1b:12:32:f0:d3:bf:a0:24:27:6c:fd:88:44:81:97:aa:e4:86:a6:3b:fc:a7:b8:bf:77:54:df:b3:27:c7:20:1f:6f:d1:7f:d7:fd:74:15:8b:d3:1c:e7:72:c9:f5:f8:ab:58:45:48:a9:9a:75:9b:5a:2c:05:32:16:2b:7b:62:18:e8:f1:42:bc:e2:c3:0d:77:84:68:9a:48:3e:09:5e:70:16:18:43:79:13:a8:c3:9c:3d:d0:d4:ca:3c:50:0b:88:5f:e3' ;
$N = bchexdec( $N ) ;
# генератор
$g = 2 ;
# соль
$s = bcmod ( bchexdec
( md5 ( rand ( 1000000000 , 2147483647 ) ) ) , $N ) ;
# "защита"
$k = H( [ $N , $g ] ) ;
# секрет из пароля, хранимый на сервере
$x = H( [ $I , $p , $s ] ) ;
// шаг 2: обмен значениями
# клиент
$a = bcmod ( bchexdec
( md5 ( rand ( 1000000000 , 2147483647 ) ) ) , $N ) ;
# сервер
$b = bcmod ( bchexdec
( md5 ( rand ( 1000000000 , 2147483647 ) ) ) , $N ) ;
# это вычисляют оба
$u = H( [ $A , $B ] ) ;
# клиент
$Kc = H( [ $Sc ] ) ;
# сервер
$Ks = H( [ $Ss ] ) ;
// результаты
'N' => $N ,
'g' => $g ,
's' => $s ,
'k' => $k ,
'x' => $x ,
'v' => $v ,
'a' => $a ,
'A' => $A ,
'b' => $b ,
'B' => $B ,
'u' => $u ,
'Sc' => $Sc ,
'Ss' => $Ss ,
'Kc' => $Kc ,
'Ks' => $Ks
] ) ;
PD9waHAKCi8vINCy0L7Qt9Cy0YDQsNGJ0LDQtdGCIG1kNSBoZXgg0LrQvtC90LrQsNGC0LXQuNGA0L7QstCw0L3QvdGL0YUg0YHRgtGA0L7QuiDQutCw0Log0LTQtdGB0Y/RgtC40YfQvdC+0LUg0YfQuNGB0LvQvi4KZnVuY3Rpb24gSChhcnJheSAkYXJncykgewogICAgJHN0cmluZyA9ICcnOwogICAgZm9yZWFjaCgkYXJncyBhcyAkYXJndW1lbnQpIHsKICAgICAgICAkc3RyaW5nIC49ICRhcmd1bWVudCAuICc6JzsKICAgIH0KICAgIHJldHVybiBiY2hleGRlYyhtZDUoJHN0cmluZykpOwp9CgovLyBoZXhkZXgg0LTQu9GPINCx0L7Qu9GM0YjQuNGFINGH0LjRgdC10LsgKNCy0LfRj9GC0L4g0LjQtyDQutC+0LzQvNC10L3RgtCw0YDQuNC10LIg0L3QsCBwaHAubmV0KS4KZnVuY3Rpb24gYmNoZXhkZWMoJGhleCkgewogICAgaWYoc3RybGVuKCRoZXgpID09IDEpIHsKICAgICAgICByZXR1cm4gaGV4ZGVjKCRoZXgpOwogICAgfSBlbHNlIHsKICAgICAgICAkcmVtYWluID0gc3Vic3RyKCRoZXgsIDAsIC0xKTsKICAgICAgICAkbGFzdCA9IHN1YnN0cigkaGV4LCAtMSk7CiAgICAgICAgcmV0dXJuIGJjYWRkKGJjbXVsKDE2LCBiY2hleGRlYygkcmVtYWluKSksIGhleGRlYygkbGFzdCkpOwogICAgfQp9CgovLyDRiNCw0LMgMTog0L/QvtC00LPQvtGC0L7QstC60LAuCgogICMg0LvQvtCz0LjQvSwg0L/QsNGA0L7Qu9GMCiRJID0gJ0ZpbGxpJzsKJHAgPSAnVmFuaWxsaSc7CgogICMg0LbRg9GC0LrQvtC1INGH0LjRgdC70L4g4oCUIHNhZmUgcHJpbWUKJE4gPScwMDpjMDozNzpjMzo3NTo4ODpiNDozMjo5ODo4NzplNjoxYzoyZDphMzozMjo0YjoxYjphNDpiODoxYTo2MzpmOTo3NDo4ZjplZDoyZDo4YTo0MTowYzoyZjpjMjoxYjoxMjozMjpmMDpkMzpiZjphMDoyNDoyNzo2YzpmZDo4ODo0NDo4MTo5NzphYTplNDo4NjphNjozYjpmYzphNzpiODpiZjo3Nzo1NDpkZjpiMzoyNzpjNzoyMDoxZjo2ZjpkMTo3ZjpkNzpmZDo3NDoxNTo4YjpkMzoxYzplNzo3MjpjOTpmNTpmODphYjo1ODo0NTo0ODphOTo5YTo3NTo5Yjo1YToyYzowNTozMjoxNjoyYjo3Yjo2MjoxODplODpmMTo0MjpiYzplMjpjMzowZDo3Nzo4NDo2ODo5YTo0ODozZTowOTo1ZTo3MDoxNjoxODo0Mzo3OToxMzphODpjMzo5YzozZDpkMDpkNDpjYTozYzo1MDowYjo4ODo1ZjplMyc7CiROID0gYmNoZXhkZWMoJE4pOwoKICAjINCz0LXQvdC10YDQsNGC0L7RgAokZyA9IDI7CgogICMg0YHQvtC70YwKJHMgPSBiY21vZChiY2hleGRlYyhtZDUocmFuZCgxMDAwMDAwMDAwLCAyMTQ3NDgzNjQ3KSkpLCAkTik7CgogICMgItC30LDRidC40YLQsCIKJGsgPSBIKFskTiwgJGddKTsKCiAgIyDRgdC10LrRgNC10YIg0LjQtyDQv9Cw0YDQvtC70Y8sINGF0YDQsNC90LjQvNGL0Lkg0L3QsCDRgdC10YDQstC10YDQtQokeCA9IEgoWyRJLCAkcCwgJHNdKTsKJHYgPSBiY3Bvd21vZCgkZywgJHgsICROKTsKCi8vINGI0LDQsyAyOiDQvtCx0LzQtdC9INC30L3QsNGH0LXQvdC40Y/QvNC4CgogICMg0LrQu9C40LXQvdGCCiRhID0gYmNtb2QoYmNoZXhkZWMobWQ1KHJhbmQoMTAwMDAwMDAwMCwgMjE0NzQ4MzY0NykpKSwgJE4pOwokQSA9IGJjcG93bW9kKCRnLCAkYSwgJE4pOwoKICAjINGB0LXRgNCy0LXRgAokYiA9IGJjbW9kKGJjaGV4ZGVjKG1kNShyYW5kKDEwMDAwMDAwMDAsIDIxNDc0ODM2NDcpKSksICROKTsKJEIgPSBiY21vZCgoYmNhZGQoYmNtdWwoJGssICR2KSwgYmNwb3dtb2QoJGcsICRiLCAkTikpKSwgJE4pOwoKICAjINGN0YLQviDQstGL0YfQuNGB0LvRj9GO0YIg0L7QsdCwCiR1ID0gSChbJEEsICRCXSk7CgogICMg0LrQu9C40LXQvdGCCiRTYyA9IGJjcG93bW9kKGJjc3ViKCRCLCBiY211bCgkaywgYmNwb3dtb2QoJGcsICR4LCAkTikpKSwgYmNhZGQoJGEsIGJjbXVsKCR1LCAkeCkpLCAkTik7CiRLYyA9IEgoWyRTY10pOwoKICAjINGB0LXRgNCy0LXRgAokU3MgPSBiY3Bvd21vZChiY211bCgkQSwgYmNwb3dtb2QoJHYsICR1LCAkTikpLCAkYiwgJE4pOwokS3MgPSBIKFskU3NdKTsKCi8vINGA0LXQt9GD0LvRjNGC0LDRgtGLCgp2YXJfZHVtcChbCiAgJ04nID0+ICROLAogICdnJyA9PiAkZywKICAncycgPT4gJHMsCiAgJ2snID0+ICRrLAogICd4JyA9PiAkeCwKICAndicgPT4gJHYsCiAgJ2EnID0+ICRhLAogICdBJyA9PiAkQSwKICAnYicgPT4gJGIsCiAgJ0InID0+ICRCLAogICd1JyA9PiAkdSwKICAnU2MnID0+ICRTYywKICAnU3MnID0+ICRTcywKICAnS2MnID0+ICRLYywKICAnS3MnID0+ICRLcwpdKTs=