最近学了RSA加密解密算法 根据流程写了一个能够进行完整的加密解密算法
<?php
error_reporting(E_ALL & ~E_NOTICE);
ini_set("max_execution_time", 18000);
set_time_limit(0);
//随机两个数
function creat_random_prime_number()
{
$random = array();
//$a = rand(1000, 10000);
//$a = rand(10, 100);
$a = rand(3, 3);
//$a = rand(2, 3);
//$a = rand(2, 2);
for ($i = 1; $i < $a; $i++) {
$random[$i] .= rand(0, 9);
}
$random[0] = rand(1, 9);
return $random;
}
//计算存到数组里的两个数的值
function cacl_long_value($len, $random)
{
$value = 0;
for ($i = 0; $i < $len; $i++) {
$value = bcadd($value, bcmul($random[$i], bcpow(10, $len - $i - 1)));
}
return $value;
}
//判断是否是质数
function is_prime_number($value)
{
$falg = 1;
for ($i = 2; $i <= sqrt($value); $i++) {
if (bcmod($value, $i) == 0) {
$falg = 0;
break;
}
}
return $falg;
}
//判断E是否和L互质
function if_E($E, $L)
{
$falg = 1;
$min = min($E, $L);
for ($i = 2; $i <= $min; $i++) {
if (bcmod($E, $i) == 0 && bcmod($L, $i) == 0)
$falg = 0;
}
return $falg;
}
//找到一个E
function creat_E($L)
{
while (1) {
$i = rand(2, $L);
if (bcmod($L, $i) != 0) {
$falg = if_E($i, $L);
if ($falg == 1) {
break;
}
continue;
}
}
return $i;
}
//根据E计算E对L的逆
function cacl_D($E, $L)
{
$c = array();
$q = array();
$L_old = $L;
for ($i = 1;; $i++) {
$c[$i] = bcmod($L, $E);
$q[$i] = bcdiv(bcsub($L, $c[$i]), $E);
$L = $E;
$E = $c[$i];
if ($c[$i] == 1)
break;
}
$b[0] = 0;
$b[1] = 1;
for ($j = 2; $j < $i + 2; $j++) {
$b[$j] = bcadd(bcmul(bcmul((-1), $b[$j - 1]), $q[$j - 1]), $b[$j - 2]);
$D = $b[$j];
}
if ($D < 0)
return bcadd($L_old, $D);
return $D;
}
//主函数
for ($i = 0;; $i++) {
$random_1 = creat_random_prime_number();
$random_2 = creat_random_prime_number();
$len_1 = count($random_1);
$len_2 = count($random_2);
$prime_value_1 = cacl_long_value($len_1, $random_1);
$prime_value_2 = cacl_long_value($len_2, $random_2);
$falg_1 = is_prime_number($prime_value_1);
$falg_2 = is_prime_number($prime_value_2);
if ($falg_1 == 1 && $falg_2 == 1 && $prime_value_1 != $prime_value_2) {
break;
}
}
echo "P=" . $prime_value_1;
echo "</br>";
echo "</br>";
echo "Q=" . $prime_value_2;
echo "</br>";
echo "</br>";
$N = bcmul($prime_value_1, $prime_value_2);
echo "N=" . $N;
echo "</br>";
echo "</br>";
$L = bcmul($prime_value_1 - 1, $prime_value_2 - 1);
echo "L=" . $L;
echo "</br>";
echo "</br>";
$E = creat_E($L);
echo "E=" . $E;
echo "</br>";
echo "</br>";
//此时公钥为($E,$N)
$D = cacl_D($E, $L);
echo "D=" . $D;
echo "</br>";
echo "</br>";
//此时私钥为($D,$N)
$mingwen = rand(1, $N);
echo "明文=" . $mingwen;
echo "</br>";
echo "</br>";
$miwen = bcmod(bcpow($mingwen, $E), $N);
echo "密文=" . $miwen;
echo "</br>";
echo "</br>";
$new_mingwen = bcmod(bcpow($miwen, $D), $N);
echo "解密=" . $new_mingwen;
写的不好,多多谅解~