fork(11) download
  1. <?php
  2.  
  3. // возвращает md5 hex конкатеированных строк как десятичное число.
  4. function H(array $args) {
  5. $string = '';
  6. foreach($args as $argument) {
  7. $string .= $argument . ':';
  8. }
  9. return bchexdec(md5($string));
  10. }
  11.  
  12. // hexdex для больших чисел (взято из комментариев на php.net).
  13. function bchexdec($hex) {
  14. if(strlen($hex) == 1) {
  15. return hexdec($hex);
  16. } else {
  17. $remain = substr($hex, 0, -1);
  18. $last = substr($hex, -1);
  19. return bcadd(bcmul(16, bchexdec($remain)), hexdec($last));
  20. }
  21. }
  22.  
  23. // шаг 1: подготовка.
  24.  
  25. # логин, пароль
  26. $I = 'Filli';
  27. $p = 'Vanilli';
  28.  
  29. # жуткое число — safe prime
  30. $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';
  31. $N = bchexdec($N);
  32.  
  33. # генератор
  34. $g = 2;
  35.  
  36. # соль
  37. $s = bcmod(bchexdec(md5(rand(1000000000, 2147483647))), $N);
  38.  
  39. # "защита"
  40. $k = H([$N, $g]);
  41.  
  42. # секрет из пароля, хранимый на сервере
  43. $x = H([$I, $p, $s]);
  44. $v = bcpowmod($g, $x, $N);
  45.  
  46. // шаг 2: обмен значениями
  47.  
  48. # клиент
  49. $a = bcmod(bchexdec(md5(rand(1000000000, 2147483647))), $N);
  50. $A = bcpowmod($g, $a, $N);
  51.  
  52. # сервер
  53. $b = bcmod(bchexdec(md5(rand(1000000000, 2147483647))), $N);
  54. $B = bcmod((bcadd(bcmul($k, $v), bcpowmod($g, $b, $N))), $N);
  55.  
  56. # это вычисляют оба
  57. $u = H([$A, $B]);
  58.  
  59. # клиент
  60. $Sc = bcpowmod(bcsub($B, bcmul($k, bcpowmod($g, $x, $N))), bcadd($a, bcmul($u, $x)), $N);
  61. $Kc = H([$Sc]);
  62.  
  63. # сервер
  64. $Ss = bcpowmod(bcmul($A, bcpowmod($v, $u, $N)), $b, $N);
  65. $Ks = H([$Ss]);
  66.  
  67. // результаты
  68.  
  69. 'N' => $N,
  70. 'g' => $g,
  71. 's' => $s,
  72. 'k' => $k,
  73. 'x' => $x,
  74. 'v' => $v,
  75. 'a' => $a,
  76. 'A' => $A,
  77. 'b' => $b,
  78. 'B' => $B,
  79. 'u' => $u,
  80. 'Sc' => $Sc,
  81. 'Ss' => $Ss,
  82. 'Kc' => $Kc,
  83. 'Ks' => $Ks
  84. ]);
Runtime error #stdin #stdout #stderr 0s 82880KB
stdin
Standard input is empty
stdout
Standard output is empty
stderr
PHP Fatal error:  Uncaught Error: Call to undefined function bcadd() in /home/uOHSdd/prog.php:19
Stack trace:
#0 /home/uOHSdd/prog.php(31): bchexdec('00:c0:37:c3:75:...')
#1 {main}
  thrown in /home/uOHSdd/prog.php on line 19