개발 꿀팁/PHP

phprsa 암호화 복호화 예제

Jammie 2022. 7. 18. 17:00
반응형

php 서비스 측에서 클라이언트 측과 상호 작용하여 오픈 API를 제공할 때, 일반적으로 민감한 부분 phi 데이터 전송에 대한 데이터 암호화가 필요하며, 이때 rsa 비대칭 암호화는 유용하게 사용될 수 있다. 다음은 일례로 php를 사용하여 데이터의 암호화와 복호화를 실현하는 방법을 설명한다.


1. 암호화 복호화의 첫 단계는 공개키, 개인키 쌍을 생성하는 것으로, 개인키 암호화의 내용은 공개키를 통해 복호화할 수 있다(역시 가능).
오픈 소스 RSA 키 생성 도구 openssl(일반적으로 Linux 시스템은 자체 프로그램을 가지고 있음)을 다운로드하여 별도의 폴더로 압축을 풀고 bin 디렉터리로 이동하여 다음 명령을 실행합니다.
openssl genrsa-outrsa_private_key.pem 1024
openssl pkcs8-topk8- inform PEM- in rsa_private_key.pem-outform PEM-nocrypt-out private_key.pem
openssl rsa-inrsa_private_key.pem-pubout-out rsa_public_key.pem
첫 번째 명령은 RSA 개인 키 파일 rsa_private_key.pem을 생성하고, 두 번째 명령은 RSA 개인 키를 pkcs8 형식으로 변환하며, 세 번째 명령은 RSA 공용 키 rsa_public_key.pem을 생성합니다.
이상에서 개인키를 통해 대응하는 공개키를 생성할 수 있음을 알 수 있으므로, 개인키 private_key.pem을 서버측에서 사용하고, 공개키를 Android나 ios등의 프런트 엔드에 발급한다.

2, php에서 생성된 공개키, 개인키로 암호화 및 복호화하여 직접 코드를 입력한다.

<?php
$private_key = '-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC3//sR2tXw0wrC2DySx8vNGlqt3Y7ldU9+LBLI6e1KS5lfc5jl
TGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2klBd6h4wrbbHA2XE1sq21ykja/
Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o2n1vP1D+tD3amHsK7QIDAQAB
AoGBAKH14bMitESqD4PYwODWmy7rrrvyFPEnJJTECLjvKB7IkrVxVDkp1XiJnGKH
2h5syHQ5qslPSGYJ1M/XkDnGINwaLVHVD3BoKKgKg1bZn7ao5pXT+herqxaVwWs6
ga63yVSIC8jcODxiuvxJnUMQRLaqoF6aUb/2VWc2T5MDmxLhAkEA3pwGpvXgLiWL
3h7QLYZLrLrbFRuRN4CYl4UYaAKokkAvZly04Glle8ycgOc2DzL4eiL4l/+x/gaq
deJU/cHLRQJBANOZY0mEoVkwhU4bScSdnfM6usQowYBEwHYYh/OTv1a3SqcCE1f+
qbAclCqeNiHajCcDmgYJ53LfIgyv0wCS54kCQAXaPkaHclRkQlAdqUV5IWYyJ25f
oiq+Y8SgCCs73qixrU1YpJy9yKA/meG9smsl4Oh9IOIGI+zUygh9YdSmEq0CQQC2
4G3IP2G3lNDRdZIm5NZ7PfnmyRabxk/UgVUWdk47IwTZHFkdhxKfC8QepUhBsAHL
QjifGXY4eJKUBm3FpDGJAkAFwUxYssiJjvrHwnHFbg0rFkvvY63OSmnRxiL4X6EY
yI9lblCsyfpl25l7l5zmJrAHn45zAiOoBrWqpM5edu7c
-----END RSA PRIVATE KEY-----';
 
$public_key = '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC3//sR2tXw0wrC2DySx8vNGlqt
3Y7ldU9+LBLI6e1KS5lfc5jlTGF7KBTSkCHBM3ouEHWqp1ZJ85iJe59aF5gIB2kl
Bd6h4wrbbHA2XE1sq21ykja/Gqx7/IRia3zQfxGv/qEkyGOx+XALVoOlZqDwh76o
2n1vP1D+tD3amHsK7QIDAQAB
-----END PUBLIC KEY-----';
 
//echo $private_key;
$pi_key =  openssl_pkey_get_private($private_key);//이 함수는 개인 키를 사용할 수 있는지 여부를 판단하는 데 사용할 수 있습니다. 리소스 id Resource id를 반환할 수 있습니다
$pu_key = openssl_pkey_get_public($public_key);//이 함수는 공개키를 사용할 수 있는지 여부를 판단하는 데 사용할 수 있다
print_r($pi_key);echo "\n";
print_r($pu_key);echo "\n";
 
 
$data = "aassssasssddd";//원시 데이터
$encrypted = ""; 
$decrypted = ""; 
 
echo "source data:",$data,"\n";
 
echo "private key encrypt:\n";
 
openssl_private_encrypt($data,$encrypted,$pi_key);//개인 키 암호화
$encrypted = base64_encode($encrypted);//암호화된 콘텐츠는 일반적으로 특수문자를 포함하고 있어 부호 변환이 필요하며, 네트워크 간에 url을 통해 전송할 때는 base64 부호화가 url 안전한지 주의한다
echo $encrypted,"\n";
 
echo "public key decrypt:\n";
 
openssl_public_decrypt(base64_decode($encrypted),$decrypted,$pu_key);//비밀키로 암호화된 내용은 공개키를 통해 복호화할 수 있다
echo $decrypted,"\n";
 
echo "---------------------------------------\n";
echo "public key encrypt:\n";
 
openssl_public_encrypt($data,$encrypted,$pu_key);//공개 키 암호화
$encrypted = base64_encode($encrypted);
echo $encrypted,"\n";
 
echo "private key decrypt:\n";
openssl_private_decrypt(base64_decode($encrypted),$decrypted,$pi_key);//비밀 키 암호 해독
echo $decrypted,"\n";

 

반응형