>백엔드 개발 >PHP 튜토리얼 >PHP 및 GMP를 사용하여 큰 정수에 대해 RSA 암호화 및 암호 해독 알고리즘을 수행하는 방법

PHP 및 GMP를 사용하여 큰 정수에 대해 RSA 암호화 및 암호 해독 알고리즘을 수행하는 방법

WBOY
WBOY원래의
2023-07-28 17:25:57891검색

PHP와 GMP를 사용하여 큰 정수에 대해 RSA 암호화 및 암호 해독 알고리즘을 수행하는 방법

RSA 암호화 알고리즘은 데이터 보안 분야에서 널리 사용되는 비대칭 암호화 알고리즘입니다. 특히 큰 두 개의 소수와 몇 가지 간단한 수학적 연산을 기반으로 공개 키 암호화 및 개인 키 암호 해독 프로세스를 구현합니다. PHP 언어에서는 GMP(GNU Multiple Precision) 라이브러리를 통해 큰 정수 계산이 가능하며 RSA 알고리즘을 결합하여 암호화 및 복호화 기능을 구현할 수 있습니다. 이 기사에서는 PHP 및 GMP 라이브러리를 사용하여 큰 정수에 대한 RSA 암호화 및 암호 해독 알고리즘을 구현하는 방법을 소개하고 해당 코드 예제를 제공합니다.

1. RSA 공개 키와 개인 키 쌍 생성

RSA 알고리즘에서는 공개 키와 개인 키가 모두 큰 소수 쌍에서 생성됩니다. 먼저 두 개의 큰 소수 $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));

그런 다음 공개 키 인덱스로 정수 $e$를 선택하여 $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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.