OpenSSL 라이브러리 없이 PHP로만 구현된 간단한 암호화
간혹 PHP만 설치해서 사용하고 최대한 라이브러리 설치 하지 않게 사용하면서 간단하게 암호화할 필요가 있을 경우 사용 합니다. 가능하면 OpenSSL 라이브러리 사용하는 암호화 방식을 추천 합니다.
그리고 어떤 방식이든 대칭형 암호화에서 키는 가능하면 길게 만들고 여기선 md5 사용 했지만 sha512 같은것 사용하면 더 좋고 시간, 또는 일마다 같은 문자도 암호화 결과가 다르게 만드는것이 좋습니다.
그 부분은 개인의 상황에 맞게 별도의 메소드로 키를 생성하는 것을 만들면 좋습니다. 입력 받은 키에 부가적으로 더 넣어 줍니다.
이 간단한 암호화 방식은 암호화와 복호화 함수가 동일하게 작동합니다.
/**
* openssl 라이브러리 없이 PHP로만 구현된 간단한 암호화
* - 키의 길이는 구조상 256바이트 아래로 한다.
*
* @package
*/
class Encryptor {
private $key;
public function __construct($key, $id) {
$this->key = $this->genKey($key, $id);
}
/**
* 사용할때의 특징에 맞게 키를 복잡하게 만들어 준다.
* @param mixed $key
* @param mixed $id
* @return string
*/
private function genKey($key, $id) {
$ymd = date('Y-m-d');
$rand_key = 'ad;fj32p;45u8osadjfsa;fkjsa;lkfja;sldjkf';
return md5($key . $id . $rand_key);
}
private function initializeState() {
$state = array();
for ($i = 0; $i < 256; $i++) {
$state[$i] = $i;
}
$j = 0;
for ($i = 0; $i < 256; $i++) {
$j = ($j + $state[$i] + ord($this->key[$i % strlen($this->key)])) % 256;
$temp = $state[$i];
$state[$i] = $state[$j];
$state[$j] = $temp;
}
return $state;
}
public function encrypt($data, $type) {
$state = $this->initializeState();
$i = 0;
$j = 0;
$length = strlen($data);
$encrypted = '';
for ($y = 0; $y < $length; $y++) {
$i = ($i + 1) % 256;
$j = ($j + $state[$i]) % 256;
$temp = $state[$i];
$state[$i] = $state[$j];
$state[$j] = $temp;
$t = ($state[$i] + $state[$j]) % 256;
$keystream = $state[$t];
$encrypted .= chr(ord($data[$y]) ^ $keystream);
}
#
if ( $type == 'en' ) return base64_encode($encrypted);
else {
return $encrypted;
}
}
public function decrypt($data, $type) {
if ( $type == 'de' ) $data = base64_decode($data);
return $this->encrypt($data, $type);
}
}
// 사용 예시
$key = '암호화 키';
$encryptor = new Encryptor($key, 'userid');
$data = '암호화할 문자열';
$encrypted = $encryptor->encrypt($data, 'en');
echo "암호화된 문자열: " . $encrypted . "\n";
$decrypted = $encryptor->decrypt($encrypted, 'de');
echo "복호화된 문자열: " . $decrypted . "\n";