안녕하세요
VC++ 로 제작된 암호화/복호화 DLL 을 델파이에서 호출하려는데
잘 되지 않아 문의 드립니다.
아시는 분은 답변 부탁드립니다.
VC++ 의 함수 원형은 다음과 같습니다.
1. 패킷 구조
:아래와 같이 4byte의 int형 data 사이즈 정보 후에 그 사이즈 만큼의 암호화된 data가 따라오는 구조입니다.
[encrypted data의 길이 : 4byte][encrypted data]
2. 암호화 복호화 방법
1) 암호화 방법 : EncDec.dll 의
extern "C" __declspec(dllexport) int EncryptPacket(BYTE *SrcBuf, BYTE *DstBuf, int SrcLen);
함수 사용
SrcBuf : 암호화 할 패킷 Data
DstBuf : 암호화된 결과를 리턴하는 버퍼 로 최소 (SrcLen + 64) 이상의 사이즈를 가져야한다.
SrcLen : SrcBuf 의 사이즈
리턴값 : 암호화된 결과 버퍼(DstBuf) 의 사이즈
2) 복호화 방법 : EncDec.dll 의
extern "C" __declspec(dllexport) void DecryptPacket(BYTE *SrcBuf, BYTE *DstBuf, int SrcLen)
SrcBuf : 암호화된 패킷 Data 즉, 1.번 EncryptPacket 에 의해 암호화된 Data부분을 의미함
DstBuf : 복호화된 패킷 Data , DstBuf의 사이즈는 SrcBuf와 같은 크기를 가지면 됩니다.
SrcLen : 암호화된 패킷 Data의 크기, 즉, 1.번 패킷 구조에 정의된 첫 4byte 를 의미함.
3. 암호화 또는 복호화할 패킷의 종류
1) 로그인 요청 패킷:
struct cmd_login{
short cmd;//1:로그인 커맨드를 의미
BYTE id[30];//사용자 id
BYTE pass[30];//사용자 password
cmd_login(){cmd=1;};
};
아래는 제가 델파이로 테스트 코딩한 부분입니다.
일단 문자열을 암호화 한 후 다시 복호화 하는 건데요...
<!--CodeS-->
function EncryptPacket(SrcBuf: PChar; var DstBuf: PChar; SrcLen: integer): Integer; cdecl; external 'EncDec.dll';
procedure DecryptPacket(SrcBuf: PChar; var DstBuf: PChar; SrcLen: integer); cdecl; external 'EncDec.dll';
type
Tcmd_login = packed record
cmd: SHORT; //1:로그인 커맨드를 의미
id: array[0..29] of Char; //사용자 id
pass: array[0..29] of Char; //사용자 password
cmd_login: SHORT; //{cmd=1;}
end;
pcmd_login = ^Tcmd_login;
procedure TfrmPrintServer.Button1Click(Sender: TObject);
var
sSrcData, sDstData: string;
sPSrcData: PChar;
sPDstData, sPSrcData2: PChar;
nSrcLen: integer;
nPacketLength, nEnPacket: integer;
pLoginData: pcmd_login;
begin
try
sSrcData := '테스트';
nPacketLength := Length(sSrcData);
sPSrcData := PChar(sSrcData);
New(sPDstData);
New(sPSrcData2);
nEnPacket := EncryptPacket(sPSrcData, sPDstData, nPacketLength);
DecryptPacket(sPDstData, sPSrcData2, nEnPacket); //<=== 요기서 Access Violation
sDstData := String(sPSrcData2);
ShowMessage(sDstData);
finally
Dispose(sPSrcData2);
Dispose(sPDstData);
end;
end;
<!--CodeE-->
이 부분이 테스트 되어야 실제 data인 struct 구조체를 주고 받을 수 있을 것 같은데요
struct 구조체는 record 타입으로 변경하면 된다고 하던데...
이 부분도 막막하기만 합니다만.
며칠을 헤메어도 아직 테스트에 대한 답도 얻지 못하고 있습니다.
항상 이런 부분에서는 초보인것 같습니다.
고수님들 답변 부탁드립니다.
그리고, 첨부파일로 해당 DLL 을 첨부했습니다. 부탁드립니다
sPSrcData : array [0..256] of Char;
이런형식으로 선언하시고요.. 배열 사이즈는 레코드 크기정도로 넉넉하게 주시고요.
지금 코드에서 에러가 나는건 사이즈에 관련된게 아닐까 싶네요.