function rsa_key_generate (
$p,
$q
){
if ($p == $q) {
return false;
}
$n = (string)gmp_mul($p, $q); //mul-> 乗算
$n_ gmp_mul(gmp_sub($p, '1'), gmp_sub($q, '1')); // 減算(p-1)(q-1)
$rand = gmp_random_range(0, gmp_sub($n_, '1')); // random_range -> ランダムな数 0 ~ (n')
while(true) {
$coprime_numbers = (string)gmp_gcd($rand, $_n); // gcd -> 最大公約数を返す
// 最大公約数が1なら互いに素な数
if($coprime_numbers === '1') {
$e = (string)$rand;
break;
}
// 非互に素な数減算し再計算
$rand = gmp_sub($rand, '1');
}
$d = (string)gmp_invert($e, $n_); // n'を法としたeの逆数
// 秘密鍵:d 公開鍵:n, e
return [$d, $n, $e];
}
function rsa_encryption (
$a, //暗号化対象の平文
$n, //公開鍵1
$e //公開鍵2
){
$b = [];
foreach ($a as $value) {
// aの一つを2乗
$a_e = gmp_pow($value, $e);
// e乗した値をnで割った余りを格納
$b[] = (string)gmp_div_r($a_e, $n);
}
return $b;
}
function composite (
$b, // 暗号文
$d, // 秘密鍵
$n // 公開鍵
){
$a = [];
foreach ($b as $value) {
// bの一つをd乗する
$b_d = gmp_pow($value, $d); //
// d乗した値をnで割った余りを格納
$a[] = (string)gmp_div_r($b_d, $n);
}
return $a;
}
return $b;
}
// 平文を数値配列に変換
function convert_string_to_integer(
$str
){
// 初期配列
$ord_array = [];
for ($i = 0; $i < mb_strlen($str); $i ++) {
$value = mb_substr($str, $i, 1);
$ord_array[] = mb_ord($value);
}
return $ord_array;
}
// 数値配列を文字列に変換
function convert_integer_to_string (
$int_array
) {
// 初期文字列
$chr = '';
// 配列の数値を全て文字列に変換
foreach ($int_array as $value){
// 数値を文字列に
$chr .= mb_char($value);
}
return $chr;
}