Rumah > Artikel > pembangunan bahagian belakang > Cara menggunakan PHP dan GMP untuk melaksanakan penyulitan RSA dan algoritma penyahsulitan untuk integer besar
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);
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));
Kemudian, kami memilih integer $e$ sebagai indeks kunci awam, memuaskan $1 Menggunakan algoritma Euclidean lanjutan, kita boleh mengira indeks kunci persendirian $d$, memuaskan $dequiv e^{-1}pmod{phi(n)}$. 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. 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. 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!$e = gmp_init(65537); // 公钥指数(一般固定为65537)
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'];
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);
}
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 . "
";