>  기사  >  백엔드 개발  >  PHP에서 비대칭 암호화를 구현하는 방법

PHP에서 비대칭 암호화를 구현하는 방법

藏色散人
藏色散人원래의
2020-08-06 11:16:323276검색

PHP에서 openssl을 사용하면 비대칭 암호화를 사용할 수 있습니다. 비대칭 암호화의 사용은 주로 공개 키 암호화 및 개인 키 복호화 또는 개인 키 암호화 및 공개 키 복호화를 사용하여 openssl의 공개 키와 개인 키에 의존합니다. , 암호화 알고리즘에는 암호화 및 복호화를 위해 두 개의 키가 필요합니다.

PHP에서 비대칭 암호화를 구현하는 방법

권장: "PHP 비디오 튜토리얼"

php는 openssl을 사용하여 비대칭 암호화를 구현합니다

먼저 비대칭 암호화가 무엇인지 설명하겠습니다.

대칭 암호화알고리즘 암호화 중 동일 비밀 키는 암호화 및 복호화에 사용되며 비대칭 암호화 알고리즘에는 암호화 및 복호화를 위해 두 개의 가 필요합니다. 이 두 비밀 키는 공개 키(공개 키, 공개 키라고도 함)와 개인 키(개인 키)입니다. 키(개인 키라고 함).




작업 프로세스

위 그림과 같이 A와 B 간에 비대칭 암호화를 사용하여 중요한 정보를 안전하게 전송합니다.


1. 당사자 B는 한 쌍의 키(공개 키와 개인 키)를 생성하고 공개 키를 다른 당사자에게 공개합니다. (상대가 신뢰하는 당사자임)

2. 공개키를 획득한 A측은 그 키를 이용하여 기밀정보를 암호화한 후 B측에 전송한다.

3. 그러면 B측은 자신이 저장한 또 다른 전용 키(개인 키)를 사용하여 암호화된 정보를 복호화합니다. 당사자 B는 해당 공개 키로 암호화된 정보를 해독하기 위해 개인 키(개인 키)만 사용할 수 있습니다.

전송 과정에서 공격자가 전송된 암호문을 가로채 B의 공개키를 획득하더라도 B의 개인키만이 암호문을 복호화할 수 있기 때문에 암호문을 해독할 수 없습니다.

마찬가지로 B가 A에게 암호화된 정보에 응답하려면 A는 먼저 암호화를 위해 A의 공개 키를 B에 게시해야 하며, A 자신은 해독을 위해 A의 개인 키를 저장합니다.




장점과 단점

대칭 암호화에 비해 비대칭 암호화는 보안이 더 좋습니다. 대칭 암호화에서는 양쪽이 동일한 비밀 키를 사용합니다. 한 쪽의 비밀 키가 유출되면 전체 통신이 중단됩니다. 손상됩니다. 비대칭 암호화는 암호화용과 복호화용으로 구성된 한 쌍의 비밀 키를 사용합니다. 공개 키는 공개되며 비밀 키는 대칭 암호화처럼 통신 전에 비밀 키를 동기화할 필요가 없습니다.

비대칭 암호화의 단점은 암호화와 복호화에 시간이 오래 걸리고 느리며, 소량의 데이터를 암호화하는 데만 적합하다는 것입니다.

비대칭 암호화에 사용되는 주요 알고리즘은 RSA, Elgamal, Backpack 알고리즘, Rabin, D-H, ECC(타원 곡선 암호화 알고리즘) 등입니다.

각 알고리즘마다 구현 메커니즘이 다릅니다. 해당 알고리즘의 자세한 정보를 참조하세요.

비대칭 암호화를 사용하는 것은 주로 openssl의 공개 키와 개인 키에 의존하며, 공개 키 암호화와 개인 키 복호화 또는 개인 키 암호화와 공개 키 복호화를 사용합니다.

1. openssl 및 php의 openssl 확장을 설치합니다.

2. 개인 키 생성: openssl genrsa는 rsa 개인 키 파일을 생성하는 데 사용됩니다.

openssl genrsa -out rsa_private_key.pem 1024

3 생성 중에 개인 키 길이와 비밀번호 보호를 지정할 수 있습니다. key: rsa 명령 RSA 키 처리, 형식 변환 및 정보 인쇄에 사용됩니다.

openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

4. 여기서는 개인 키 암호화 및 공개 키 암호 해독을 사용합니다.

<?php
/**
 * 使用私钥加密,公钥解密
 * 密钥文件的路径
 */
$privateKeyFilePath = &#39;rsa_private_key.pem&#39;;
/**
 * 公钥文件的路径
 */
$publicKeyFilePath = &#39;rsa_public_key.pem&#39;;
extension_loaded(&#39;openssl&#39;) or die(&#39;php需要openssl扩展支持&#39;);
(file_exists($privateKeyFilePath) && file_exists($publicKeyFilePath)) or die(&#39;密钥或者公钥的文件路径不正确&#39;);
/**
 * 生成Resource类型的密钥,如果密钥文件内容被破坏,openssl_pkey_get_private(获取私钥)函数返回false
 */
$privateKey = openssl_pkey_get_private(file_get_contents($privateKeyFilePath));
/**
 * 生成Resource类型的公钥,如果公钥文件内容被破坏,openssl_pkey_get_public(获取公钥)函数返回false
 */
$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));
($privateKey && $publicKey) or die(&#39;密钥或者公钥不可用&#39;);
/**
 * 原数据
 */
$originalData = &#39;啦啦啦&#39;;
/**
 * 加密以后的数据,
 */
$encryptData = &#39;&#39;;
//echo &#39;原数据为:&#39;, $originalData, PHP_EOL;
//openssl_private_encrypt — 使用私钥加密数据
//openssl_private_encrypt() 使用私钥 key 加密数据 data 并且将结果保存至变量 crypted中。
//加密后的数据可以通过openssl_public_decrypt()函数来解密。
if (openssl_private_encrypt($originalData, $encryptData, $privateKey)) {
    /**
     * 加密后 可以base64_encode后方便在网址中传输 或者打印  否则打印为乱码
     * PHP_EOL就是其中的一个,代表php的换行符,这个变量会根据平台而变,在windows下会是/r/n,在linux下是/n,在mac下是/r
     */
    echo &#39;加密成功,加密后数据(base64_encode后)为:&#39;, base64_encode($encryptData), PHP_EOL;
} else {
    die(&#39;加密失败&#39;);
}

5 이제 암호화가 완료되었으니 어떻게 해독해야 할까요? 시간? 개인 키 암호화와 공개 키 복호화이기 때문에

공개 키가 무엇인지 아는 한 생성된 암호문을 사용하여 복호화할 수 있습니다. (모든 사람의 이해를 돕기 위해 코드에 복호화 관련 지식을 주석으로 표시했습니다.)

/**
 * 解密以后的数据
 * openssl_public_decrypt使用公钥解密数据
 */
$publicKeyFilePath = &#39;rsa_public_key.pem&#39;;//生成的公钥文件
//openssl_pkey_get_public使用公钥解密
$publicKey = openssl_pkey_get_public(file_get_contents($publicKeyFilePath));
//print_r($publicKey);exit;
($publicKey) or die(&#39;密钥或者公钥不可用&#39;);
//下面是我即将进行解密的密文
$encryptData=&#39;ldFrMgl9qLWbPEQDt8DMCfzq4WAR2eEfZFmjyE8XUh/+SmkzoDhhOitIr++5muxj8klCqH0KCQqUV6RLRW34z5R5SbYCy82hdIMLjmPqx32LKg2e8iRuR7HreC6rW0CGxaeUlrSDz9M72c/GKjnQLlg66Tsjp0XtwT6PTPXH9ws=&#39;;
//因为我们加密后数据展示的是base64_encode后(上一行),
//所以我们应该还原为原来的密文,如果直接将原本的密文copy过来解密的话也许会导致部分的密文丢失,进一步解密失败;
$encryptData=base64_decode($encryptData);
$decryptData =&#39;&#39;;
if (openssl_public_decrypt($encryptData, $decryptData, $publicKey)) {
    echo &#39;解密成功,解密后数据为:&#39;, $decryptData, PHP_EOL;
} else {
    die(&#39;解密失败&#39;);
}

잘못된 내용이 있으면 지적해 주시고, 모두에게 도움이 되었으면 좋겠습니다.


위 내용은 PHP에서 비대칭 암호화를 구현하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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