PHP实现的RSA加密解密

最近学了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;

写的不好,多多谅解~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值