ホームページ >バックエンド開発 >PHPチュートリアル >PHP と GMP を使用して大きな整数の RSA 暗号化および復号化アルゴリズムを実行する方法

PHP と GMP を使用して大きな整数の RSA 暗号化および復号化アルゴリズムを実行する方法

WBOY
WBOYオリジナル
2023-07-28 17:25:57896ブラウズ

PHP と GMP を使用して大きな整数の RSA 暗号化および復号化アルゴリズムを実行する方法

#RSA 暗号化アルゴリズムは、データ セキュリティの分野で広く使用されている非対称暗号化アルゴリズムです。これは、2 つの特に大きな素数といくつかの単純な数学演算に基づいて、公開キー暗号化と秘密キー復号化のプロセスを実装します。 PHP言語では、GMP(GNU Multiple Precision)ライブラリにより大きな整数の計算を実現でき、RSAアルゴリズムを組み合わせることで暗号化・復号化機能を実現できます。この記事では、PHP および GMP ライブラリを使用して大きな整数の RSA 暗号化および復号化アルゴリズムを実装する方法を紹介し、対応するコード例を示します。

1. RSA 公開キーと秘密キーのペアの生成

RSA アルゴリズムでは、公開キーと秘密キーの両方が大きな素数のペアから生成されます。まず、2 つの大きな素数 $p$ と $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);

次に、$n$ と $phi(n)$ を計算する必要があります。ここで、$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));

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

拡張ユークリッド アルゴリズムを使用すると、$dequiv e^{-1}pmod{phi(n)}$ を満たす秘密鍵インデックス $d$ を計算できます。

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'];

ついに、RSA 公開鍵 $(n, e)$ と秘密鍵 $(n, d)$ を取得しました。

2. 暗号化と復号化のプロセス

生成された公開キーと秘密キーを使用して、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);
}

暗号化プロセス中に、平文メッセージを大きな整数 $msg$ に変換し、公開鍵指数 $e$ と法 $n$ を使用して計算し、暗号文 $cipher$ を取得します。 。復号化プロセスでは、暗号文 $cipher$ を大きな整数に変換し、秘密鍵指数 $d$ と法 $n$ を使用して計算を実行し、復号化された平文メッセージを取得します。

3. サンプル コード

以下は、RSA 公開キーと秘密キーのペアの生成、暗号化と復号化のプロセスを含む完全なサンプル コードです。

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

上記のコードは、GMP ライブラリを通じて PHP を使用して、大きな整数に対する RSA 暗号化および復号化アルゴリズムを実装します。特定のニーズに応じて、コード内のパラメーターとロジックを変更できます。理解して実践することで、誰もがこの基本的な暗号アルゴリズムを習得し、柔軟に適用できるようになると思います。

以上がPHP と GMP を使用して大きな整数の RSA 暗号化および復号化アルゴリズムを実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。