char형으로 보내는데 예외처리가 발생합니다.
글쓴이: l595659 / 작성시간: 화, 2022/08/16 - 6:41오후
현재 암호화 작업을 하고있고, TCP서버에서 보낼 때는 암호화가 제대로 되는데 UDP에서 예외처리가 나옵니다.
UDP는 맨처음에 들어갈 때 "접속했습니다" 라고 먼저 던져주는데 그 순간에 암호화 하면서 오류가 나오더라구요
배열의 크기도 같게 해봤는데 똑같이 예외처리 오류가 나옵니다.
Encryption 함수에서 나오고 있구요
strEncordeData[i] = m_socket_comm.encrypt[i];
이 순간에 나옵니다.
CreateClntSocket(AF_INET, SOCK_DGRAM, IPPROTO_UDP); // 소켓 주소 구조체 초기화 (상대 시스템 주소 정보) ClntSockAddr(AF_INET); //Data Communication char Text[BUF_SIZE] = "접속했습니다"; udpclnt.UdpSendMsg(Text);
void UDPClnt::UdpSendMsg(char* connect) { Encryption(connect); send_size = sendto(m_socket_comm.clnt_sock, connect, strlen(connect), 0, (SOCKADDR*)&m_socket_comm.clnt_sockAddr, sizeof(m_socket_comm.clnt_sockAddr)); }
char Encryption(char strEncordeData[]) { m_socket_comm.keycount = 0; int length = strlen(strEncordeData); int j = 0; for (int i = 0; i < length; i++) { m_socket_comm.encrypt[i] = strEncordeData[i] ^ m_socket_comm.key[m_socket_comm.keycount++]; strEncordeData[i] = m_socket_comm.encrypt[i]; if (i == strlen(m_socket_comm.key)) { m_socket_comm.keycount = 0; } } memset(m_socket_comm.encrypt, 0, BUF_SIZE); return *strEncordeData; }
Forums:
char Text[BUF_SIZE] = "접속했습니다
char Text[BUF_SIZE] = "접속했습니다";
를
char Text[256];
memset(Text, 0x0, 256);
strcpy(Text, "접속했습니다");
로 고치고 해보세요.
char Text[BUF_SIZE] = "접속했습니다";
에서 Text는 read-only 영역에 생성되기 때문에 Encryption() 함수에서처럼 write할 수 없습니다.
Quote:char Text[BUF_SIZE] =
아주 정상적인 문자 배열의 문자열 리터럴 초기화 문법입니다. 아무 문제없습니다.
read-only가 되는 건
char *Text = "접속했습니다";
겠죠.아. 그러네요. ^^;;
아. 그러네요. ^^;;
그리고 "접속했습니다"라고 한글로 써야 하나요? 한글 사용은 꼭 필요한 경우가 아니면 자제하는게 향후 디버그에 좋아 보이네요.
굳이 한글로 쓸 필요는 없습니다
굳이 한글로 쓸 필요는 없고 그냥 편해서 사용했습니다 이것도 수정해볼게요
문제가 될 만한 부분이 여럿 보입니다... 예컨대
문제가 될 만한 부분이 여럿 보입니다... 예컨대
1)
sendto
함수를 호출할 때 암호화된connect
에strlen
을 호출하면 안 됩니다.암호화되기 전엔 정상적인 null-terminated 문자열이었더라도 암호화 후에는 그렇지 않을 수 있기 때문이죠.
어쩌다 평문 바이트에 대응하는 키 바이트가 동일하다면 어떻게 되겠습니까?
2) 함수 Encryption 안의 조건문
if (i == strlen(m_socket_comm.key))
i
는 계속 증가하므로 이 조건문은 단 한 번만 걸리게 됩니다.즉
m_socket_comm
를 "두 바퀴 이상" 돌려셔 쓸 수는 없다는 겁니다.m_socket_comm.keycount
이 다시는 0으로 돌아오지 않고 계속 증가해서m_socket_comm.key
를 벗어나게 될 겁니다.위 두 가지 문제 중 어느 것도 UDP-specific하진 않습니다. 왜 TCP에서는 됐었는데 UDP에서는 안 되는 거냐고 물으면 할 말이 없군요.
원래 메모리 접근이 안전하지 않은 프로그램이란 게 때론 운 좋아서 잘 돌 수도 있는 거라고는 합니다만.
오타 정정
즉
m_socket_comm
를 "두 바퀴 이상" 돌려셔 쓸 수는 없다는 겁니다.=> 즉
m_socket_comm.key
를 "두 바퀴 이상" 돌려셔 쓸 수는 없다는 겁니다.비트연산 하는 암호화라서 썼는데 문제가 있나보네요
암호화를 간단하게 비트연산하는 암호라서 문자열이 같을 것 같아서 사용한건데 안되나보네요
길이를 가져와서 그만큼 돌려야하는데 방법이 생각이 안나네요....
또, 두바퀴를 돌리려면 어떻게 해야할까요... keycount는 i랑 같아질 수는 없는데...
key[(key_count++) % key_len]
key[(key_count++) % key_len]
댓글 달기