6 $arKeys = unserialize(COption::GetOptionString(
"main",
"~rsa_keys_bcmath",
""), [
'allowed_classes' =>
false]);
14 COption::SetOptionString(
"main",
"~rsa_keys_bcmath", serialize($arKeys));
19 $d = self::raw2int(base64_decode($this->_D));
20 $n = self::raw2int(base64_decode($this->_M));
23 $blocks = explode(
' ',
$data);
24 foreach($blocks as $block)
26 $block = self::powmod(self::raw2int(base64_decode($block)), $d,
$n);
27 while(bccomp($block,
'0') != 0)
29 $x = bcmod($block,
'256');
30 $block = bcdiv($block,
'256', 0);
37 public function Keygen($keylen=
false)
42 $keylen = intval($keylen);
44 $pl = intval(($keylen + 1) / 2);
47 $p = self::getRndPrime($pl);
48 $q = self::getRndPrime($ql);
50 $x = self::getkeysfrompq(
$p, $q, 1) ;
53 "M" => base64_encode(self::int2raw($x[0])),
54 "E" => base64_encode(self::int2raw($x[1])),
55 "D" => base64_encode(self::int2raw($x[2])),
60 private static function getRndPrime($cnt)
62 $btn = intval($cnt / 8);
66 while(self::bitlenght($ret) != $cnt)
69 for(
$i = 0;
$i < $btn;
$i++)
70 $str .= chr(rand() & 0xff);
76 $ret = self::raw2int(
$str);
78 if(!bccomp(bcmod($ret,
'2'),
'0'))
79 $ret = bcadd($ret,
'1');
81 while(!self::is_prime($ret))
82 $ret = bcadd($ret,
'2');
87 private static function bitlenght($in)
89 $t = self::int2raw($in);
90 $out = mb_strlen($t) * 8;
92 $t = ord($t[mb_strlen($t) - 1]);
109 private static function is_prime($in)
116 for(
$i = 0;
$i < 10000;
$i++)
119 for(
$i = 2;
$i < 100;
$i++)
124 for($j +=
$i; $j < 10000; $j +=
$i)
128 for(
$i = 0;
$i < 10000;
$i++)
130 if($ps[
$i]) $ps[$j++] = $ps[
$i];
135 for(
$i = 0;
$i < $psc;
$i++)
137 if(bccomp($in, $ps[
$i]) <= 0)
139 if(!bccomp(bcmod($in, $ps[
$i]),
'0'))
145 if(!self::miller($in, $ps[
$i]))
151 private static function getkeysfrompq(
$p, $q)
154 $m = bcmul(bcsub(
$p, 1), bcsub($q, 1));
155 $e = self::get_e($m);
156 $d = self::ext($e, $m);
160 private static function ext($e1, $em)
169 while(bccomp($v3, 0) != 0)
171 $qt = bcdiv($u3, $v3, 0);
172 $t1 = bcsub($u1, bcmul($qt, $v1));
173 $t2 = bcsub($u2, bcmul($qt, $v2));
174 $t3 = bcsub($u3, bcmul($qt, $v3));
187 if(bccomp($vv, 0) == -1)
188 $ret = bcadd($vv, $em);
195 private static function get_e($m)
198 if(bccomp(self::GCD($et, $m),
'1') != 0)
203 while(bccomp(self::GCD($et, $m),
'1') != 0)
205 $et = bcadd($et, $c);
216 private static function GCD($e, $m)
220 while(bccomp($e1, 0) != 0)
222 $w = bcsub($m1, bcmul($e1, bcdiv($m1, $e1, 0)));;
230 private static function int2raw($in)
237 while(bccomp($in,
'0'))
239 $out .= chr(bcmod($in,
'256'));
240 $in = bcdiv($in,
'256');
245 private static function raw2int($in)
251 $out = bcadd(bcmul($out,
'256'), ord($in[--
$n]));
256 private static function powmod(
$n,
$p, $m)
258 if(function_exists(
'bcpowmod'))
259 return bcpowmod(
$n,
$p, $m);
264 if(!bccomp(bcmod(
$p,
'2'),
'1'))
266 $out = bcmod(bcmul($out,
$n), $m);
268 $n = bcmod(bcpow(
$n,
'2'), $m);
271 while(bccomp(
$p,
'0'));
276 private static function miller($in, $b)
278 if(!bccomp($in,
'1'))
281 $t = bcsub($in,
'1');
284 while(!bccomp(bcmod($t,
'2'),
'0'))
290 $t = self::powmod($b, $t, $in);
296 if(!bccomp(bcadd($t,
'1'), $in))
299 $t = self::powmod($t,
'2', $in);