아래는 델마당(http://delmadang.com) 강좌, 팁 정보 게시판에 박후선 님이 올린 델파이를 이용한 암호화/복호화 소스이다.
unit UEncrypt; interface function Encrypt(const S: String; Key: Word): String; function Decrypt(const S: String; Key: Word): String; implementation uses SysUtils; const C1 = 74102; C2 = 12337; HexaChar : array [0..15] of Char = ( '0', '1', '2', '3', '4', '5', '6', '7', '8', '9','A', 'B', 'C', 'D', 'E', 'F' ); // Byte로 구성된 데이터를 Hexadecimal 문자열로 변환 function ValueToHex(const S : String): String; var I : Integer; begin SetLength(Result, Length(S)*2); // 문자열 크기를 설정 for I := 0 to Length(S)-1 do begin Result[(I*2)+1] := HexaChar[Integer(S[I+1]) shr 4]; Result[(I*2)+2] := HexaChar[Integer(S[I+1]) and $0f]; end; end; // Hexadecimal로 구성된 문자열을 Byte 데이터로 변환 function HexToValue(const S : String) : String; var I : Integer; begin SetLength(Result, Length(S) div 2); for I := 0 to (Length(S) div 2) - 1 do begin Result[I+1] := Char(StrToInt('$'+Copy(S,(I*2)+1, 2))); end; end; // 암호걸기 function Encrypt(const S: String; Key: Word): String; var I: byte; FirstResult : String; begin SetLength(FirstResult, Length(S)); // 문자열의 크기를 설정 for I := 1 to Length(S) do begin FirstResult[I] := char(byte(S[I]) xor (Key shr 8)); Key := (byte(FirstResult[I]) + Key) * C1 + C2; end; Result := ValueToHex(FirstResult); end; // 암호풀기 function Decrypt(const S: String; Key: Word): String; var I: byte; FirstResult : String; begin FirstResult := HexToValue(S); SetLength( Result, Length(FirstResult) ); for I := 1 to Length(FirstResult) do begin Result[I] := char(byte(FirstResult[I]) xor (Key shr 8)); Key := (byte(FirstResult[I]) + Key) * C1 + C2; end; end; end.
위의 소스를 PHP로 변환해 보았다.
Integer Overflow까지 감안해서 암호화/복호화가 이루어졌는데, PHP의 경우 INT형 범위를 초과하게 되면 자동으로 Float 형으로 변환이 되어 버리기 때문에 강제 타입 캐스팅 (int)을 통해 원하는 결과를 얻을 수 있었다.
아래는 그 소스.
<?PHP /* Date : 2008년 2월 27일 Author : 김광철 (k2club@hanmail.net) 사용 예] $pid = new ENCDEC(); $pid->Encrypt(4936); => 231F3051D40B78DB37FB0000004936 $pid->Decrypt($fid); => 0000004936 */ class ENCDEC { FUNCTION ENCDEC() { // Class Initialization } FUNCTION ASCII2HEX($ASCII) { $len = strlen($ASCII); for ($i=0; $i<$len; $i++) $result.=sprintf("%02X",ord(substr($ASCII,$i,1))); return $result; } FUNCTION HEX2ASCII($HEX) { $len = strlen($HEX); for ($i=0; $i<$len; $i+=2) $result.=sprintf("%s", chr(hexdec(substr($HEX,$i,2)))); return $result; } FUNCTION Make_HexaString($prg_id) { $FirstResult = '0'; $Key = $prg_id; $S = sprintf("%010d", $prg_id); for($i = 0; $i <= strlen($S)-1; $i++) { $FirstResult[$i] = CHR(ORD($S[$i]) ^ ($Key>>8)); $Key = (int)ORD($FirstResult[$i]) + (int)$Key; $Key = (int)($Key * 74102); $Key = (int)($Key + 12337); } return $FirstResult; } FUNCTION Encrypt($prg_id) { if($prg_id == 0) return ''; return $this->ASCII2HEX($this->Make_HexaString($prg_id)).sprintf("%010d", $prg_id); } FUNCTION Make_AsciiString($fid_id) { $Result = '0'; $str = substr($fid_id, 0, strlen($fid_id) - 10); $Key = (int)substr($fid_id, strlen($fid_id) - 10); $FirstResult = $this->HEX2ASCII($str); for($i=0; $i <= strlen($FirstResult)-1; $i++) { $Result[$i] = CHR(ORD($FirstResult[$i]) ^ ($Key>>8)); $Key = (int)ORD($FirstResult[$i]) + (int)$Key; $Key = (int)($Key * 74102); $Key = (int)($Key + 12337); } return $Result; } FUNCTION Decrypt($fid_id) { if($fid_id == '') return ''; return $this->Make_AsciiString($fid_id); } } // http://BASE_URL?prg_id=Value $pid = new ENCDEC(); $fid = $pid->Encrypt($_GET[prg_id]); echo $fid."<BR><BR>"; echo $pid->Decrypt($fid); ?>