IT/PHP

[PHP] 암호화 openssl aes-256-cbc

월공 2021. 3. 29. 14:57
728x90
300x250

c++ 단에서 openssl 를 이용하여 파일을 암호화한것을 php 단에서 복호화 해주는 작업을 맡았다

 

그냥 단순하게 암호화를 할때 key값만 있으면 되는줄 알았는데 아니었다.

AES-256-CBC 방식은 iv(Initialization vector) 라고 값이 별도로 또 첨부가 되는데 그냥 쉽게 제 2의 키 라고 이해하면 좋

을것 같다. (마치 salt 방식같은 그런 느낌 ..)

참고로 iv 는 16자리여야 한다 ~

 

복호화를 하는데 자꾸 안되서 왜그런가했더니 멍청하게 base64_decode 가 떡하니 써있는데 저거 하나 캐치못하고 삽질 겁나했다 어우 .. 정신좀 차리자 쪽팔리게 ..

//암호화된 파일 가져오기
$encrypted_code = file_get_contents("./enc/".$fileName);

//이름 바꿔주고 저장하기
$fileName_dec = str_replace ("enc", "dec", $fileName);
file_put_contents("./dec/".$fileName_dec, $decrypted_code);
openssl_encrypt ( string $data , string $cipher_algo , string $passphrase , int $options = 0 , string $iv = "" , string &$tag = null , string $aad = "" , int $tag_length = 16 ) : string|false

openssl_decrypt ( string $data , string $cipher_algo , string $passphrase , int $options = 0 , string $iv = "" , string $tag = "" , string $aad = "" ) : string|false

$data = 파일 혹은 텍스트 등등 데이터

$cipher_algo = 암호화 타입(?) 구분 ex) aes-256-cbc

$options = OPENSSL_RAW_DATA(1 or true) OPENSSL_ZERO_PADDING(0 or false)

$iv = 제 2의 키 (cbc 사용할때 첫번째 암호화 블록)

나머지는 사용안했음

$key = "키 값 선언";


function my_encrypt($data, $key) {
	$encryption_key = base64_decode($key);
	//$iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
	$iv = "1234567891234567";
	$encrypted = openssl_encrypt($data, 'aes-256-cbc', $encryption_key, 0, $iv);
	return base64_encode($encrypted . '::' . $iv);
}

function my_decrypt($data, $key) {
	$encryption_key = base64_decode($key);
	list($encrypted_data, $iv) = explode('::', base64_decode($data), 2);
	$iv = "1234567891234567";
	return openssl_decrypt($encrypted_data, 'aes-256-cbc', $encryption_key, 0, $iv);
}

//암호화
$encrypted_code = my_encrypt($code, $key); //Encrypt the code.

//복호화
$decrypted_code = my_decrypt($encrypted_code, $key);//Decrypt the encrypted code.

 

www.php.net/manual/en/function.openssl-decrypt.php

728x90
300x250