Rumah > pembangunan bahagian belakang > tutorial php > Cara menggunakan PHP dan GMP untuk melaksanakan penyulitan RSA dan algoritma penyahsulitan untuk integer besar

Cara menggunakan PHP dan GMP untuk melaksanakan penyulitan RSA dan algoritma penyahsulitan untuk integer besar

WBOY
Lepaskan: 2023-07-28 18:30:01
asal
887 orang telah melayarinya

Cara menggunakan PHP dan GMP untuk melaksanakan algoritma penyulitan dan penyahsulitan RSA untuk integer besar

Algoritma penyulitan RSA ialah algoritma penyulitan asimetri yang digunakan secara meluas dalam bidang keselamatan data. Ia melaksanakan proses penyulitan kunci awam dan penyahsulitan kunci persendirian berdasarkan dua nombor perdana yang sangat besar dan beberapa operasi matematik mudah. Dalam bahasa PHP, pengiraan integer besar boleh direalisasikan melalui perpustakaan GMP (GNU Multiple Precision), dan fungsi penyulitan dan penyahsulitan boleh direalisasikan dengan menggabungkan algoritma RSA. Artikel ini akan memperkenalkan cara menggunakan perpustakaan PHP dan GMP untuk melaksanakan algoritma penyulitan dan penyahsulitan RSA untuk integer besar, dan memberikan contoh kod yang sepadan.

1. Hasilkan pasangan kunci awam dan persendirian RSA

Dalam algoritma RSA, kedua-dua kunci awam dan kunci persendirian dijana daripada sepasang nombor perdana yang besar. Pertama, kita perlu menjana dua nombor perdana besar $p$ dan $q$.

function generatePrime($bits) {
    do {
        $num = gmp_strval(gmp_random_bits($bits));
    } while (!gmp_prob_prime($num));
    return gmp_init($num);
}

$bits = 1024; // 生成的素数位数
$p = generatePrime($bits);
$q = generatePrime($bits);
Salin selepas log masuk

Seterusnya, kita perlu mengira $n$ dan $phi(n)$, dengan $n=pq$, $phi(n)=(p-1)(q-1)$.

$n = gmp_mul($p, $q);
$phi_n = gmp_mul(gmp_sub($p, 1), gmp_sub($q, 1));
Salin selepas log masuk

Kemudian, kami memilih integer $e$ sebagai indeks kunci awam, memuaskan $1

$e = gmp_init(65537); // 公钥指数(一般固定为65537)
Salin selepas log masuk

Menggunakan algoritma Euclidean lanjutan, kita boleh mengira indeks kunci persendirian $d$, memuaskan $dequiv e^{-1}pmod{phi(n)}$.

function extendedEuclidean($a, $b) {
    if (gmp_cmp($b, 0) === 0) {
        return ['x' => gmp_init(1), 'y' => gmp_init(0)];
    }
    $result = extendedEuclidean($b, gmp_mod($a, $b));
    return [
        'x' => $result['y'],
        'y' => gmp_sub($result['x'], gmp_mul(gmp_div_q($a, $b), $result['y']))
    ];
}

$d = extendedEuclidean($e, $phi_n)['x'];
Salin selepas log masuk

Akhirnya, kami mendapat kunci awam RSA $(n, e)$ dan kunci peribadi $(n, d)$.

2. Proses penyulitan dan penyahsulitan

Menggunakan kunci awam dan kunci persendirian yang dijana, kami boleh melakukan proses penyulitan dan penyahsulitan RSA.

function rsaEncrypt($msg, $n, $e) {
    $msg = gmp_init($msg);
    $result = gmp_powm($msg, $e, $n);
    return gmp_strval($result);
}

function rsaDecrypt($cipher, $n, $d) {
    $cipher = gmp_init($cipher);
    $result = gmp_powm($cipher, $d, $n);
    return gmp_strval($result);
}
Salin selepas log masuk

Semasa proses penyulitan, kami menukar mesej teks biasa kepada integer besar $msg$, dan kemudian menggunakan eksponen kunci awam $e$ dan modulus $n$ untuk mengira bagi mendapatkan teks sifir $cipher$. Semasa proses penyahsulitan, kami menukar teks sifir $cipher$ kepada integer yang besar, dan kemudian menggunakan eksponen kunci persendirian $d$ dan modulus $n$ untuk melakukan pengiraan untuk mendapatkan mesej teks biasa yang dinyahsulit.

3. Contoh kod

Berikut ialah kod sampel lengkap, termasuk penjanaan pasangan kunci awam dan persendirian RSA serta proses penyulitan dan penyahsulitan.

function generatePrime($bits) {
    do {
        $num = gmp_strval(gmp_random_bits($bits));
    } while (!gmp_prob_prime($num));
    return gmp_init($num);
}

function extendedEuclidean($a, $b) {
    if (gmp_cmp($b, 0) === 0) {
        return ['x' => gmp_init(1), 'y' => gmp_init(0)];
    }
    $result = extendedEuclidean($b, gmp_mod($a, $b));
    return [
        'x' => $result['y'],
        'y' => gmp_sub($result['x'], gmp_mul(gmp_div_q($a, $b), $result['y']))
    ];
}

function rsaEncrypt($msg, $n, $e) {
    $msg = gmp_init($msg);
    $result = gmp_powm($msg, $e, $n);
    return gmp_strval($result);
}

function rsaDecrypt($cipher, $n, $d) {
    $cipher = gmp_init($cipher);
    $result = gmp_powm($cipher, $d, $n);
    return gmp_strval($result);
}

$bits = 1024; // 生成的素数位数
$p = generatePrime($bits);
$q = generatePrime($bits);

$n = gmp_mul($p, $q);
$phi_n = gmp_mul(gmp_sub($p, 1), gmp_sub($q, 1));

$e = gmp_init(65537); // 公钥指数(一般固定为65537)

$d = extendedEuclidean($e, $phi_n)['x'];

$msg = 'Hello, RSA!';
$cipher = rsaEncrypt($msg, $n, $e);
$decryptedMsg = rsaDecrypt($cipher, $n, $d);

echo "明文消息:" . $msg . "
";
echo "加密后的密文:" . $cipher . "
";
echo "解密后的明文消息:" . $decryptedMsg . "
";
Salin selepas log masuk

Kod di atas melaksanakan algoritma penyulitan dan penyahsulitan RSA untuk integer besar menggunakan PHP melalui perpustakaan GMP. Anda boleh mengubah suai parameter dan logik dalam kod mengikut keperluan khusus anda. Melalui pemahaman dan amalan, saya percaya semua orang boleh menguasai dan menggunakan algoritma kriptografi asas ini secara fleksibel.

Atas ialah kandungan terperinci Cara menggunakan PHP dan GMP untuk melaksanakan penyulitan RSA dan algoritma penyahsulitan untuk integer besar. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan