Maison  >  Article  >  développement back-end  >  Comment utiliser PHP et GMP pour exécuter des algorithmes de cryptage et de déchiffrement RSA pour les grands entiers

Comment utiliser PHP et GMP pour exécuter des algorithmes de cryptage et de déchiffrement RSA pour les grands entiers

WBOY
WBOYoriginal
2023-07-28 17:25:57782parcourir

Comment utiliser PHP et GMP pour exécuter l'algorithme de cryptage et de déchiffrement RSA pour les grands entiers

L'algorithme de cryptage RSA est un algorithme de cryptage asymétrique largement utilisé dans le domaine de la sécurité des données. Il met en œuvre le processus de chiffrement à clé publique et de déchiffrement à clé privée basé sur deux nombres premiers particulièrement grands et quelques opérations mathématiques simples. Dans le langage PHP, le calcul de grands entiers peut être réalisé grâce à la bibliothèque GMP (GNU Multiple Precision), et les fonctions de chiffrement et de déchiffrement peuvent être réalisées en combinant l'algorithme RSA. Cet article expliquera comment utiliser les bibliothèques PHP et GMP pour implémenter des algorithmes de chiffrement et de déchiffrement RSA pour les grands entiers, et donnera des exemples de code correspondants.

1. Générer des paires de clés publiques et privées RSA

Dans l'algorithme RSA, la clé publique et la clé privée sont générées à partir d'une paire de grands nombres premiers. Tout d'abord, nous devons générer deux grands nombres premiers $p$ et $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);

Ensuite, nous devons calculer $n$ et $phi(n)$, où $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));

Ensuite, nous choisissons un entier $e$ comme index de clé publique, satisfaisant $1

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

En utilisant l'algorithme euclidien étendu, nous pouvons calculer l'index de clé privée $d$, satisfaisant $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'];

Enfin, nous avons obtenu la clé publique RSA $(n, e)$ et la clé privée $(n, d)$.

2. Processus de cryptage et de décryptage

En utilisant la clé publique et la clé privée générées, nous pouvons effectuer le processus de cryptage et de décryptage 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);
}

Pendant le processus de cryptage, nous convertissons le message en texte brut en un grand entier $msg$, puis utilisons l'exposant de clé publique $e$ et le module $n$ pour calculer afin d'obtenir le texte chiffré $cipher$. Pendant le processus de décryptage, nous convertissons le texte chiffré $cipher$ en un grand entier, puis utilisons l'exposant de clé privée $d$ et le module $n$ pour effectuer des calculs afin d'obtenir le message en texte clair déchiffré.

3. Exemple de code

Ce qui suit est un exemple de code complet, comprenant la génération de paires de clés publiques et privées RSA et le processus de cryptage et de déchiffrement.

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 . "
";

Le code ci-dessus implémente l'algorithme de cryptage et de déchiffrement RSA pour les grands entiers en utilisant PHP via la bibliothèque GMP. Vous pouvez modifier les paramètres et la logique du code en fonction de vos besoins spécifiques. Grâce à la compréhension et à la pratique, je pense que tout le monde peut maîtriser et appliquer de manière flexible cet algorithme cryptographique de base.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn