C초짜가 한계에 부딪쳤네요 ㅠ.ㅠ php->c컨버팅 좀 도와 주세요.

mrbaen의 이미지

암복호화 함수 인데요.
php로 되어 있는거를 C로 컨버팅해야 하는데
일주일 넘게 씨름했는데 잘 안되요.ㅠ.ㅠ
C고수님 좀 도와 주세요.

----------------------------------------------------------------------
php source
----------------------------------------------------------------------

function bytexor($a,$b)
{
        $c="";
        for($i=0;$i<16;$i++)$c.=$a{$i}^$b{$i};
        return $c;
}
 
 
function decrypt_md5($msg,$key)
{
        $string="";
        $buffer="";
        $key2="";
 
        while($msg)
        {
                $key2=pack("H*",md5($key.$key2.$buffer));
                $buffer=bytexor(substr($msg,0,16),$key2);
                $string.=$buffer;
                $msg=substr($msg,16);
        }
        return($string);
}
 
function encrypt_md5($msg,$key)
{
        $string="";
        $buffer="";
        $key2="";
 
        while($msg)
        {
                $key2=pack("H*",md5($key.$key2.$buffer));
                $buffer=substr($msg,0,16);
                $string.=bytexor($buffer,$key2);
                $msg=substr($msg,16);
        }
        return($string);
}
 
// 사용 예
$message = "다양한 원본 메시지 東西南北 ABC abc 123 ※ ↔ ";
$key = "아..이정도면 매우 복잡한 키--1;";
 
$encrypted = encrypt_md5($message, $key);
$decrypted = decrypt_md5($encrypted, $key);
 
echo "Encrypted = $encrypted";
echo " <HR>";
echo "Decrypted = $decrypted";

select99의 이미지


일주일넘게 씨름한 소스는 어딧나요? 그걸보여줘야 문제를 잡아드리죠.

mrbaen의 이미지

일주일 넘게 씨름한 쏘스 입니다 ㅠ.ㅠ
초짜 라서 개념 없이 작업됬습니다.
이해하고 봐주세요.

/*
 
*/
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <time.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <sys/wait.h>
#include <unistd.h>
#include <netdb.h>
//#include "base64EnDecode.h" 
//#include "Crypt_EnDecode.h" 
#include <openssl/md5.h>
#include <sys/stat.h> 
#include <fcntl.h> 
 
#define MAXDATASIZE 2408 // max number of bytes we can get at once 
 
void recv_msg(int new_fd);
void set_read();
void send_exe(char *str);
unsigned char *Trim(const unsigned char *str);
void exit_error(char *str);
char *replaceAll(char *s, const char *olds, const char *news);
unsigned char *log_write(const unsigned char *str1 , const unsigned char *str2);
char *MD5_Encrypt(char *msg);
 
// 환경 설정
char *_set_server;
int _set_port;
char *_set_siteid;
char *_set_sitekey;
char *_set_dbtype;
char *_set_host;
char *_set_user;
char *_set_pass;
char *_set_db;
 
char *_in_msg;
int _in_type;
 
//int _su_chk;	//수신확인 체크 변수 3초에 한번
//int _se_chk;	//전송 체크 변수 1초에 한번
 
//메세지 출력
int _debug_msg;
/*
2 파라미티 에러입니다. [./neizsms [-m] parameter
*/
 
unsigned char *Trim(const unsigned char *str)
{
 
	if (str == NULL)
	{
		return;
	}
 
	unsigned int i=0;
	unsigned int blank=0;
	unsigned int leng = strlen(str); //문자열의 총길이를 구한다
	char* saveBlank;
	unsigned char *result = (unsigned char *)malloc(((strlen(str) + 3 - strlen(str) % 3) * 4 / 3 + 1) * sizeof(char)); 
	saveBlank = (char*)malloc(sizeof(int)*leng);
 
	for(i=0; i<leng; i++)
	{
		if(isspace(*(str+i))==0)
		{ //공백이 아니면 0을 반환
		//*(saveBlank+blank) = *(str+i); //공백이 아닌 문자를 배열에 순서대로 저장한다
			saveBlank[blank] = *(str+i);
			blank++; //문자의 개수 증가(배열 인자로 이용)
		}
	}//FOR
 
	//printf("\nFull Trim: '%s'\n" , saveBlank);
	result = saveBlank;
	//printf("'\n");
	return result;
	free(saveBlank);
 
}
 
char *substr(char *txt, int sno , int eno)
{
	if (eno == 0) eno = strlen(txt) - sno;
	if (eno > (strlen(txt)-sno)) eno = strlen(txt) - sno;
 
	char buffer1[eno] ;
	int i;
 
	strcpy(buffer1 , "");
	for (i=sno; i<(sno + eno);i++ )
		sprintf(buffer1 , "%s%c" , buffer1 , txt[i]);
 
	unsigned char *result = (unsigned char *)malloc(strlen(buffer1) * sizeof(char)); 
	result = buffer1;
	return result;
 
}
 
static char x2b(char c)
{
	if(c>='0' && c<='9')
		return c-'0';
	else if (c>='A' && c<='F')
		return c-'A'+0xa;
	else if (c>='a' && c<='f')
		return c-'a'+0xa;
 
	return -1; // error
}
 
 
int bin2hex(char *buf, char *textbuf, int len, int type)
{
	char hexs[]="0123456789ABCDEF";
	int i;
	int j=0;
 
	for(i=0;i<len;i++)
	{
		textbuf[j++] = hexs[ (buf[i]>>4)&0x0f ];
		textbuf[j++] = hexs[ buf[i]&0x0f ];
		if(type==1 && (i+1 != len))
		{
			textbuf[j++] = ' ';	
		}
	}
	textbuf[j]=0;
}
 
 
 
int hex2bin(char *hexstring, char *buf, int maxbuf)
{
	char *pc=hexstring;
	int i=0;
	int	byte=-1; // -1 empty
 
	while(*pc!='\0' && i<maxbuf )
	{
		if( isxdigit(*pc) )
		{
			if(byte == -1)
			{
				byte = x2b(*pc);
			}
			else
			{
				buf[i] = byte<<4 | x2b(*pc);
				i++;
				byte = -1;
			}
		}
		else
		{
			if(byte != -1)
			{
				buf[i]= byte;
				i++;
				byte = -1;
			}
		}
		pc++;
	}
 
	return i;
}
 
void *bytexor(char *a, char *b)
{
	//printf("a:%s b:%s\n" , a , b);
	char buf[100]="";
	int i;
 
	strcpy(buf , "");
	for(i = 0; i < 16; i++)
	{
		buf[i] = a[i] ^ b[i];
		printf("cc:%d/i:%d/%d\n" ,strlen(buf),i,buf[i]);
//		buf = tmp;
	}
	//strcpy(tmp , substr(buf , 0,16));
	unsigned char *result = (unsigned char *)malloc(16 * sizeof(char));
	printf("strlen:%d\n" , strlen(buf));
	result = buf;
	return result;
}
 
void *Hpack(char *key)
{
	char _md5[100];
	char binbuf[17];
 
	strcpy(_md5 ,  MD5_Encrypt((char *)key));
	printf("2:/%s/\n" , _md5);
 
	hex2bin(_md5, binbuf, 16);
	printf("21:/%s/\n" , binbuf);
 
	unsigned char *result = (unsigned char *)malloc(16 * sizeof(char));
	//printf("tmp:%s\n" , tmp);
	result = binbuf;
	return result;
}
 
char *encrypt_md5(char *msg , char *key)
{
	char key1[100];
	char key2[17];
	char buffer[17];
	char tmp[200];
	char tmp1[16];
	char buf[17];
	char string[200];
	char msg1[strlen(msg)];
 
	strcpy(msg1 , msg);
 
	strcpy(key2 , "");
	strcpy(buffer , "");
	strcpy(tmp , "");
	strcpy(tmp1 , "");
	strcpy(string , "");
	char tmp2[1];
	strcpy(tmp , "	");
	//tmp[0] = "	";
printf("/%s/\n\n" , tmp);
printf("/%d/\n\n" , tmp[1]);
	while(strlen(msg1)>0)
	{
/*
                $key2=pack("H*",md5($key.$key2.$buffer));
                $buffer=substr($msg,0,16);
                $string.=bytexor($buffer,$key2);
                $msg=substr($msg,16);
*/
 
 
		strcpy(key1 , "");
		sprintf(key1 , "%s%s%s" , key,key2,buffer);
		printf("1:/%s/\n" , key1);
 
		strcpy(key2 , Hpack((char *)key1));
		printf("key2:/%s/\n" , key2);
 
		strcpy( buffer, substr(msg1, 0,16));
		printf("buffer:%s\n" , buffer);
 
		strcpy(buf , bytexor(buffer , key2));
		//strcpy(buf , substr(buf,0,16));
 
		printf("bytexor:/%d/%s/\n" , strlen(buf),buf);
 
		sprintf(tmp1 , "%s%s" , string , buf);
		strcpy(string , tmp1);
		//printf("str:/%s/\n" , tmp1);
		printf("string:/%s/\n" , string);
 
		strcpy( msg1, substr(msg1, 16,0));
		printf("msg:%s/\n" , msg);
printf("\n\n");
		//key2 = pack("H*",md5($key.$key2.$buffer));
		//echo "/$key2\n";
		//$buffer=substr($msg,0,16);
		//$string.=bytexor($buffer,$key2);
		//$msg=substr($msg,16);
//		exit(0);
	}
 
	unsigned char *result = (unsigned char *)malloc(strlen(string) * sizeof(char)); 
	result = string;
	return result;
 
}
char *decrypt_md5(char *msg , char *key)
{
	char key2[16];
	char buffer[17];
	char tmp[200];
	char tmp1[16];
	char _md5[100];
	char binbuf[100];
	char buf[16];
	char string[200];
	char msg1[strlen(msg)];
 
	strcpy(msg1 , msg);
 
	strcpy(key2 , "");
	strcpy(buffer , "");
	strcpy(tmp , "");
	strcpy(tmp1 , "");
	strcpy(string , "");
 
	while(strlen(msg1)>0)
	{
/*
                $key2=pack("H*",md5($key.$key2.$buffer));
                $buffer=substr($msg,0,16);
                $string.=bytexor($buffer,$key2);
                $msg=substr($msg,16);
 
 
                $key2=pack("H*",md5($key.$key2.$buffer));
                $buffer=bytexor(substr($msg,0,16),$key2);
                $string.=$buffer;
                $msg=substr($msg,16);
*/
 
		strcpy(tmp , "");
		sprintf(tmp , "%s%s%s" , key,key2,buffer);
		//printf("1:/%s/\n" , tmp);
 
 
		strcpy(_md5 ,  MD5_Encrypt((char *)tmp));
		//printf("2:/%s/\n" , _md5);
 
		hex2bin(_md5, binbuf, 16);
 
		strcpy(key2 , binbuf);
		//printf("key2:/%s/\n" , key2);
 
		strcpy( tmp1, substr(msg1, 0,16));
		//printf("buffer:%s\n" , buffer);
 
		strcpy(buf , bytexor(tmp1 , key2));
		//printf("bytexor:%s\n" , buf);
 
		strcpy(buffer , buf);
		sprintf(tmp1 , "%s%s" , string , buf);
		strcpy(string , tmp1);
		//printf("str:/%s/\n" , tmp1);
		//printf("string:/%s/\n" , string);
 
		strcpy( msg1, substr(msg1, 16,0));
//		printf("msg:%s/\n" , msg);
//printf("\n\n");
		//key2 = pack("H*",md5($key.$key2.$buffer));
		//echo "/$key2\n";
		//$buffer=substr($msg,0,16);
		//$string.=bytexor($buffer,$key2);
		//$msg=substr($msg,16);
//		exit(0);
	}
 
	unsigned char *result = (unsigned char *)malloc(strlen(string) * sizeof(char)); 
	result = string;
	return result;
 
}
int main(int argc, char *argv[]) 
{
 
 
 
// 사용 예
//$message = "☆━2008년*♡*┐┃설날부턴 ° ː│。°더많이°│ː 。사랑할께~┃└*♡* *‥─━★";
//$key = "985786";
 
	char msg[] ="☆━2008년*♡*┐┃설날부턴 ° ː│。°더많이°│ː 。사랑할께~┃└*♡* *‥─━★";
	char *key ;
	key =  "985786";
 
	char *md_ret;
	char *md_ret1;
 
	printf("msg = /%s/\n" , msg);
 
	md_ret = encrypt_md5((char *)msg , (char *)key);
 
	printf("Encrypted = /%s/\n" , md_ret);
 
	md_ret1 = decrypt_md5((char *)md_ret , (char *)key);
 
	//printf("Decrypted = /%s/\n" , md_ret1);
/*
$encrypted = encrypt_md5($message, $key);
//$decrypted = decrypt_md5($encrypted, $key);
 
echo "Encrypted = $encrypted";
echo " \n";
echo "Decrypted = $decrypted";
echo " \n";
*/
 
 
 
}
char *MD5_Encrypt(char *msg)
{
	char lsBuff[strlen(msg)];
	unsigned char lucpMD5[16];
	unsigned char ret[16];
	unsigned long lulLen = strlen(msg);
	int li;
	unsigned char *result = (unsigned char *)malloc(16 * sizeof(char)); 
 
	strcpy (lsBuff,msg);
 
	MD5_CTX lmdContext;
 
	MD5_Init(&lmdContext);
	MD5_Update(&lmdContext,lsBuff,lulLen);
	MD5_Final(lucpMD5, &lmdContext);
 
	strcpy(ret , "");
	for(li=0;li<16;li++)
	{
		//printf("%02x",lucpMD5[li]);
		sprintf(ret , "%s%02x" , ret , lucpMD5[li]);
		//printf("aa%d:%s\n" , li,ret);
	}
	result = ret;
	//printf("result:%s\n",result);
	return result;
}
/*
char *encrypt_md5($msg,$key)
{
        $string="";
        $buffer="";
        $key2="";
 
        while($msg)
        {
				echo $key.$key2.$buffer;
                $key2=pack("H*",md5($key.$key2.$buffer));
				echo "/$key2\n";
                $buffer=substr($msg,0,16);
                $string.=bytexor($buffer,$key2);
                $msg=substr($msg,16);
        }
        return($string);
}
*/
char *replaceAll(char *s, const char *olds, const char *news)
{
	char *result, *sr;
	size_t i, count = 0;
	size_t oldlen = strlen(olds); if (oldlen < 1) return s;
	size_t newlen = strlen(news);
 
	if (newlen != oldlen)
	{
		for (i = 0; s[i] != '\0';)
		{
			if (memcmp(&s[i], olds, oldlen) == 0)
			{
				count++;
				i += oldlen;
			}
			else
			{
				i++;
			}
		}
	}
	else
	{
		i = strlen(s);
	}
 
 
	result = (char *) malloc(i + 1 + count * (newlen - oldlen));
	if (result == NULL) return NULL;
 
 
	sr = result;
	while (*s)
	{
		if (memcmp(s, olds, oldlen) == 0)
		{
			memcpy(sr, news, newlen);
			sr += newlen;
			s  += oldlen;
		}
		else
		{
			*sr++ = *s++;
		}
	}
	*sr = '\0';
 
	return result;
}
mrbaen의 이미지

탭간격 을 없어져서 보기 힘들것 같아요.

Hyun의 이미지

<code> 등으로 소스를 감싸주시면 좋겠네요...

mrbaen의 이미지

어떤 코드를 넣으면 소스가 정리돼서 보이나요?
 이걸로는 감쌌는데 별 효과가 없는듯해요

jsj3579의 이미지

☆━2008년*♡*┐┃설날부턴 ° ː│。°더많이°│ː 。사랑할께~┃└*♡* *

아놔

mrbaen의 이미지

ㅡㅡ;;;

select99의 이미지

흠.. 일단..

PHP 는 간단한데.. C소스는 왜이렇게 길죠?

C로 한다고 해서 별로 길어질 이유는 없어보이는데.

컨버팅하셨는데.. 대응되는함수만 만드시면 될꺼 같은데.. 다른것들도 나오는거 같고..

구현하신고도좀..뭔가 정리가 안된느낌이네요..

일단 생각부터 정리하시고.. 대응되는 함수로 만드시기바랍니다.

하나 예로 보면 Trim 함수.. 왜이렇게 긴지..ㅡㅡ;;
이거 그냥 스트링 스페이스 잘라내는 함수 아닌가요? 보통트림이면 그런기능인데..
뭘할려는건지 모르겠지만..
마지막에 포인터도 잃어버리고..ㅡㅡ;; 이 자체부터 오류네요..

일단 함수하나부터 만들어서 재대로 동작하는지 해보시기 바랍니다.
그리고 보통 구현되어 있거나 일반적으로 구현하는방법(기존소스)를좀 참고 하심이 좋을듯하네요.

참고로 트림이라면 매우 간단하게 됩니다. 메모리 할당도 필요 없고요..

mrbaen의 이미지

초짜의 한계죠
사실 개념만 알고 있고 포인터니 하는거 정확하게 어떻게 돌아가는지 잘 몰르는 상태에서 작업을 하다보니
점점 개판이 되가네용

select99의 이미지

Trim그냥 생각나는데로 적어봅니다.

void Trim( char *str )
{
char *s;
for( s = str +strlen(str) -1; s >= str; s-- )
if( *s = ' ' ) *s = 0;
else break;
}
안돌려봤지만 뭐 이정도 하면 돌지 않을까 싶네요..

mrbaen의 이미지

제가 구현해논거는 문자열의 양쪽 공백을 없애는 함수입니다.
여기저기 소스 구해서 만들은겁니다.

select99의 이미지

전 rtrim 이군요..
trim 이라도 별반차이는 없겠죠..

for( s = str; *s; s++ ) if( *s != ' ' )break;
memmove( str, s, strlen(str) - (s - str) +1);

두줄정도 추가하면 되지 않을까 싶군요..

keedi의 이미지

php 코드를 보니까 꼭 perl 코드 같네요.
perl 코드를 가끔씩 c로 변환하고는 하는데,
그때 이런식으로 처리하곤 합니다.

배열에 대응하기 위한 간단한 리스트를 만드시거나 있는거 사용하시고,
함수의 인자 및 리턴 타입만 잘 고려하셔서 pack, substr 함수 구현하시면 되겠네요.
일반적인 pack이나 substr 만드려면 고민해야겠지만,
지금 내가 이 프로그램에서 사용할 기능을 한정한 pack이나 substr을 만드는 건 뭐.. :-)

어렵게 생각하지 마시고 일단,
php 코드와 똑같이 1대1 대응하는 식으로 작성하시면 쉽습니다.
최적화는 일단 신경쓰지 마시구요. :-)

---------------------------
Smashing Watermelons~!!
Whatever Nevermind~!!

Keedi Kim

----
use perl;

Keedi Kim

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.