//--------------------------------------------------------------------------- #pragma hdrstop #include "Crypt.h" //--------------------------------------------------------------------------- #pragma package(smart_init) //--------------------------------------------------------------------------- TCrypt *Crypt; // sprintf ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© DWORD °ªÀ» BYTEÇü ¹è¿­¿¡ ´ãÀ» ¶§¿Í // BYTEÇü ¹è¿­À» AnsiString::sprintf ÇÔ¼ö¸¦ »ç¿ëÇÏ¿© AnsiString¿¡ ´ãÀ» ¶§ ¹è¿­ÀÇ ¼ø¼­°¡ ´Ù¸§À» À¯ÀÇÇÑ´Ù //--------------------------------------------------------------------------- __fastcall TCrypt::TCrypt() { // »ý¼ºÀÚ nCodeLen = 0; // ¾Ïȣȭ, º¹È£È­ ÄÚµåÀÇ ¹®ÀÚ¿­ ±æÀÌ nOddLen = 0; // nCodeLen / 2 // Ȧ¼ö¹øÂ° ÄÚµåÀÇ ¹®ÀÚ¿­ ±æÀÌ nRetLen = 0; // nCodeLen + 2 // ¸®ÅÏ ÄÚµå¿ëÀ¸·Î '\0'À» ºÙÀÏ ¹®ÀÚ¿­ ±æÀÌ nHexLen = 0; // nCodeLen*4 // ºñÆ®¸¦ µÚÁýÀ»¶§ »ç¿ë } //--------------------------------------------------------------------------- __fastcall TCrypt::~TCrypt() { // ¼Ò¸êÀÚ } //--------------------------------------------------------------------------- AnsiString __fastcall TCrypt::OldEnCode(AnsiString strCode, int nKey) { // ¾Ïȣȭ // ¾Ïȣȭ ¹æ¹ý : // ½ºÅ¸Àϸ®½ºÆ®°¡ ¼³Ä¡µÈ Çϵåµð½ºÅ© µå¶óÀ̺êÀÇ ½Ã¸®¾ó¹øÈ£¸¦ AnsiStringÀ¸·Î ¹Þ´Â´Ù // AnsiStringÀ¸·Î ¹ÞÀº °ªÀ» Hex°ªÀ¸·Î º¯È¯ÇÑ´Ù // ù ¹øÂ° ÀÛ¾÷ : Hex °ªÀ¸·Î ÇÑÀÚ¸® ¸¶´Ù ¦¼öÀÏ °æ¿ì Not¿¬»êÀ» ÇÑ´Ù // µÎ ¹øÂ° ÀÛ¾÷ : ù ¹ø¤Š ƒ„À» Hex °ªÀ¸·Î ÇÑÀÚ¸® ¸¶´Ù Ȧ¼öÀÏ °æ¿ì °Å²Ù·Î ¹è¿­ÇÑ´Ù // ¼¼ ¹øÂ° ÀÛ¾÷ : µÎ ¹øÂ° °ªÀÇ ºñÆ®¸¦ µÚÁý´Â´Ù (Áï, ù¹øÂ° ºñÆ®¿Í ¸¶Áö¸· ºñÆ®¸¦ swap) // ÀÌ °ªÀÇ Hex°ªÀÌ °á°úÄÚµåÀÌ´Ù // ¿¹) D04A9883 ÀÏ °æ¿ì ºñƮȭÇϸé // 1101 0000 0100 1010 1001 1000 1000 0011 // ¨çȦ ¨è¦ ¨éȦ ¨ê¦ ¨ëȦ ¨ì¦ ¨íȦ ¨î¦ // D 0 4 A 9 8 8 3 // // 1101 1111 0101 0101 1001 0111 1000 1100 - ù ¹øÂ° ÀÛ¾÷ // ¨çȦ ¨è¦ ¨éȦ ¨ê¦ ¨ëȦ ¨ì¦ ¨íȦ ¨î¦ // D F 4 5 9 7 8 C // // 1000 1111 1001 0101 0100 0111 1101 1100 - µÎ ¹øÂ° ÀÛ¾÷ // ¨íȦ ¨è¦ ¨ëȦ ¨ê¦ ¨éȦ ¨ì¦ ¨çȦ ¨î¦ // 8 F 9 5 4 7 D C // // 0011 1011 1110 0010 1010 1001 1111 0001 - ¼¼ ¹øÂ° ÀÛ¾÷ // ¨íȦ ¨è¦ ¨ëȦ ¨ê¦ ¨éȦ ¨ì¦ ¨çȦ ¨î¦ // 3 B E 2 A 9 F 1 DWORD dwHexCode; DWORD dwEnCode; BYTE *cCode; BYTE *cTempCode; BYTE *cOddCode; BYTE *cHexCode; BYTE *cEnCode; BYTE *cReturnCode; AnsiString strReturnCode = ""; int nPointPosition; // ÃʱâÈ­ strCode = strCode.UpperCase(); // ¹ÞÀº ¹®ÀÚ¿­À» ÀüºÎ ´ë¹®ÀÚ·Î.. nPointPosition = strCode.Pos("."); strCode = strCode.Delete(nPointPosition, 1); nCodeLen = strCode.Length(); // ¾Ïȣȭ, º¹È£È­ ÄÚµåÀÇ ¹®ÀÚ¿­ ±æÀÌ nOddLen = nCodeLen / 2; // nCodeLen / 2 // Ȧ¼ö¹øÂ° ÄÚµåÀÇ ¹®ÀÚ¿­ ±æÀÌ nRetLen = nCodeLen + 1; // nCodeLen + 1 // ¸®ÅÏ ÄÚµå¿ëÀ¸·Î '\0'À» ºÙÀÏ ¹®ÀÚ¿­ ±æÀÌ nHexLen = nCodeLen * 4; // nCodeLen*4 // ºñÆ®¸¦ µÚÁýÀ»¶§ »ç¿ë cCode = new BYTE[nCodeLen]; cTempCode = new BYTE[nCodeLen]; cOddCode = new BYTE[nCodeLen]; cHexCode = new BYTE[nCodeLen]; cEnCode = new BYTE[nCodeLen]; cReturnCode = new BYTE[nRetLen]; memset(cCode, 0, sizeof(BYTE)*nCodeLen); memset(cTempCode, 0, sizeof(BYTE)*nCodeLen); memset(cOddCode, 0, sizeof(BYTE)*nCodeLen); memset(cHexCode, 0, sizeof(BYTE)*nCodeLen); memset(cEnCode, 0, sizeof(BYTE)*nCodeLen); memset(cReturnCode, 0, sizeof(BYTE)*nRetLen); strncpy(cTempCode, strCode.c_str(), nCodeLen); // ÀÏ´Ü º¹»ç for (int i = 0; i < nCodeLen; i++) { // ¹®ÀÚ¸¦ HEX °ªÀ¸·Î ¹Ù²Û´Ù if ('A' <= cTempCode[i] && cTempCode[i] <= 'F') { cCode[nCodeLen-i-1] = cTempCode[i] - 'A' + 0xA; } else if ('0' <= cTempCode[i] && cTempCode[i] <= '9') { cCode[nCodeLen-i-1] = cTempCode[i] - '0' - 0x00; // º¸±â ÁÁÀ¸¶ó°í 0x00 Ãß°¡ } else { return strReturnCode; } } for (int i = 0, j = 0; i < nCodeLen; i++) { if (i%2) { // Ȧ¼öÀÏ ¶§.. (ù ¹øÂ° ÀÛ¾÷À» À§ÇÑ ÀÛ¾÷) cHexCode[i] = cCode[i]; cOddCode[j] = cCode[i]; j++; } else { // ¦¼öÀÏ ¶§.. (µÎ ¹øÂ° ÀÛ¾÷) cHexCode[i] = (~cCode[i] & 0x0F); } } for (int i = 0, j = nOddLen - 1; i < nCodeLen; i++) { if (i%2) { // Ȧ¼öÀÏ ¶§.. (ù ¹øÂ° ÀÛ¾÷) cHexCode[i] = cOddCode[j]; j--; } } dwHexCode = 0; // BYTEÇü ¹è¿­ÀÇ °ªÀ» DWORD¿¡ ´ã´Â´Ù for (int i = 1; i <= nCodeLen; i++) { dwHexCode += (cHexCode[nCodeLen-i] & 0x0F); if (i < nCodeLen) dwHexCode = ((dwHexCode << 4) & 0xFFFFFFF0); } dwEnCode = 0; for (int i = 0; i < nHexLen; i++) { // ¼¼ ¹øÂ° ÀÛ¾÷ dwEnCode += (dwHexCode >> i) & 1; if (i < nHexLen-1) dwEnCode = (dwEnCode << 1); } //---------------------------------------------------------------------- key if (nKey){ int nTempKey, nQuotient, nRemainder; // ¸ò°ú ³ª¸ÓÁö int nIntKey, nOrderKey[3] = {0, 0, 0}; DWORD dwMask, dwMask1, dwMask2, dwMask3, dwMask4; // nKey¿Í »ó°ü°ü°è¿¡ ÀÇÇØ ³ª¿À´Â DWORD °ª (³× ¹øÂ° ÀÛ¾÷ ¿ë) nIntKey = nKey; nQuotient = 1; for (int i = 0, nTempKey = nKey; (nQuotient > 0 && i < 3); i++) { nQuotient = nTempKey / 10; nRemainder = nTempKey % 10; if (nQuotient > 0 || nRemainder > 0){ nTempKey = nQuotient; //if (nRemainder == 0) nRemainder = 1; //1216 nOrderKey[i] = nRemainder; } } // nKey°¡ ¼¼ ÀÚ¸®°¡ ¾Æ´Ñ °æ¿ì ÀÌÀü ÀÚ¸®ÀÇ nOrderKey·Î ä¿öÁØ´Ù for (int i = 1; i < 3; i++){ if (nOrderKey[i] == 0) nOrderKey[i] = nOrderKey[i - 1]; } //1216 /* nIntKey = dKey; nKey1 = dKey; nKey2 = dKey; // Á¤¼ö ù¹øÂ° ÀÚ¸® (0ÀÏ °æ¿ì´Â ¹Ýµå½Ã ÇÇÇØ¾ßÇÑ´Ù) nKey3 = dKey; // ¼Ò¼öÁ¡ ÀÌÇÏ Ã¹Â°ÀÚ¸® (0ÀÏ °æ¿ì´Â ¹Ýµå½Ã ÇÇÇØ¾ßÇÑ´Ù) nIntKey = ((int)((dKey * 10) + 0.5)); // Á¤¼ö ºÎºÐ if (nIntKey == 0) nIntKey = 10; nKey1 = ((int)((dKey * 10) + 0.5)); // Á¤¼ö µÑ¤Š ÀÚ¸® if (0 >= nKey1 && nKey1 <= 100) { nKey1 = 10; } else if (10 <= nKey1 && nKey1 < 100) { nKey1 /= 10; } nKey2 = ((int)((dKey * 10) + 0.5)) % 10; // Á¤¼ö ù¹øÂ° ÀÚ¸® (0ÀÏ °æ¿ì´Â ¹Ýµå½Ã ÇÇÇØ¾ßÇÑ´Ù) if (nKey2 == 0) nKey2 = 10; nKey3 = (int)(dKey); // ¼Ò¼öÁ¡ ÀÌÇÏ Ã¹Â°ÀÚ¸® (0ÀÏ °æ¿ì´Â ¹Ýµå½Ã ÇÇÇØ¾ßÇÑ´Ù) if (nKey3 == 0) nKey3 = 10; */ dwMask = 0; dwMask1 = 0; dwMask2 = 0; dwMask3 = 0; dwMask4 = 0; for (int i = 0; i < nHexLen; i++) { // ¸¶½ºÅ©¸¦ ¸¸µç´Ù if (!(i % (nOrderKey[0] + 1))) dwMask1 += 1; if (i < nHexLen-1) dwMask1 = (dwMask1 << 1); if (!(i % (nOrderKey[1] + 1))) dwMask2 += 1; if (i < nHexLen-1) dwMask2 = (dwMask2 << 1); if (!(i % (nOrderKey[2] + 1))) dwMask3 += 1; if (i < nHexLen-1) dwMask3 = (dwMask3 << 1); if (!(i == nIntKey)) dwMask4 += 1; if (i < nHexLen-1) dwMask4 = (dwMask4 << 1); } dwMask = (nIntKey << nOrderKey[0]) | (nIntKey >> nOrderKey[1]) | (nIntKey ^ nOrderKey[2]) + ((dwMask1 | dwMask2 | dwMask3 | dwMask4) << nIntKey) + nIntKey; DWORD temp = 0; for (int i = 0; i < nCodeLen; i++){ temp = temp << 4; temp += 0x0F; } dwMask = dwMask & temp; dwEnCode ^= dwMask; } //------------------------------- BYTE *cTempCode2; cTempCode2 = new BYTE[nRetLen]; BYTE ctemp; unsigned long iEnCode = 0, nShift = 1; iEnCode = dwEnCode; nShift = 1 << (nCodeLen - 1)*4; memset(cTempCode2, '\0', sizeof(BYTE)*nRetLen); for (int j = nCodeLen - 1 ; j >= 0; j--){ ctemp = iEnCode / nShift; iEnCode -= ctemp * nShift ; nShift >>= 4; if (10 <= ctemp && ctemp <= 15){ ctemp = ctemp - 0x0A + 'A'; } else { ctemp = ctemp - 0x00 + '0'; } cTempCode2[nCodeLen - 1 - j] = ctemp; } if (nCodeLen >= 8) cTempCode2[8] = '\0'; else cTempCode2[nCodeLen] = '\0'; //sprintf(cReturnCode, "%X", dwEnCode); // DWORDÇüÀ» ´Ù½Ã BYTEÇü ¹è¿­¿¡ ´ã´Â´Ù strReturnCode = strReturnCode.sprintf(cTempCode2); // ¹®ÀÚ¿­À» AnsiString¿¡ ´ã´Â´Ù if (cCode) { delete [] cCode; cCode = NULL; } if (cTempCode) { delete [] cTempCode; cTempCode = NULL; } if (cOddCode) { delete [] cOddCode; cOddCode = NULL; } if (cHexCode) { delete [] cHexCode; cHexCode = NULL; } if (cEnCode) { delete [] cEnCode; cEnCode = NULL; } if (cReturnCode) { delete [] cReturnCode; cReturnCode = NULL; } if (cTempCode2) { delete [] cTempCode2; cTempCode2 = NULL; } if (nPointPosition > 0) { strReturnCode.Insert(".", nPointPosition); } return strReturnCode; // AnsiStringÇüÀ¸·Î Return } //--------------------------------------------------------------------------- AnsiString __fastcall TCrypt::OldDeCode(AnsiString strCode, int nKey) { // º¹È£È­ (¾ÏȣȭÀÇ ¿ª¼ø) // º¹È£È­ ¹æ¹ý : // ½ºÅ¸Àϸ®½ºÆ®°¡ ¼³Ä¡µÈ Çϵåµð½ºÅ© µå¶óÀ̺êÀÇ ¾ÏȣȭµÈ ½Ã¸®¾ó¹øÈ£¸¦ AnsiStringÀ¸·Î ¹Þ´Â´Ù // AnsiStringÀ¸·Î ¹ÞÀº °ªÀ» Hex°ªÀ¸·Î º¯È¯ÇÑ´Ù // ù ¹øÂ° ÀÛ¾÷ : ù ¹øÂ° °ªÀÇ ºñÆ®¸¦ µÚÁý´Â´Ù (Áï, ù¹øÂ° ºñÆ®¿Í ¸¶Áö¸· ºñÆ®¸¦ swap) // µÎ ¹øÂ° ÀÛ¾÷ : µÎ ¹ø¤Š ƒ„À» Hex °ªÀ¸·Î ÇÑÀÚ¸® ¸¶´Ù Ȧ¼öÀÏ °æ¿ì °Å²Ù·Î ¹è¿­ÇÑ´Ù // ¼¼ ¹øÂ° ÀÛ¾÷ : Hex °ªÀ¸·Î ÇÑÀÚ¸® ¸¶´Ù ¦¼öÀÏ °æ¿ì Not¿¬»êÀ» ÇÑ´Ù // ³× ¹øÂ° ÀÛ¾÷ : Hex °ªÀ¸·Î ÇÑÀÚ¸® ¸¶´Ù ¦¼öÀÏ °æ¿ì Not¿¬»êÀ» ÇÑ´Ù // ¾ÏȣȭÀÇ ¿ª¼ø!! DWORD dwCode; DWORD dwHexCode; DWORD dwDeCode; BYTE *cCode; BYTE *cTempCode; BYTE *cOddCode; BYTE *cHexCode; BYTE *cDeCode; BYTE *cReturnCode; int nCount; // DWORD¿¡¼­ 4Bit¾¿ ²÷¾î¼­ ¹®ÀÚ¿­¿¡ ´ãÀ»¶§ »ç¿ë AnsiString strReturnCode = ""; int nPointPosition; // ÃʱâÈ­ strCode = strCode.UpperCase(); // ¹ÞÀº ¹®ÀÚ¿­À» ÀüºÎ ´ë¹®ÀÚ·Î.. nPointPosition = strCode.Pos("."); strCode = strCode.Delete(nPointPosition, 1); nCodeLen = strCode.Length(); // ¾Ïȣȭ, º¹È£È­ ÄÚµåÀÇ ¹®ÀÚ¿­ ±æÀÌ nOddLen = nCodeLen / 2; // nCodeLen / 2 // Ȧ¼ö¹øÂ° ÄÚµåÀÇ ¹®ÀÚ¿­ ±æÀÌ nRetLen = nCodeLen + 1; // nCodeLen + 1 // ¸®ÅÏ ÄÚµå¿ëÀ¸·Î '\0'À» ºÙÀÏ ¹®ÀÚ¿­ ±æÀÌ nHexLen = nCodeLen * 4; // nCodeLen*4 // ºñÆ®¸¦ µÚÁýÀ»¶§ »ç¿ë cCode = new BYTE[nCodeLen]; cTempCode = new BYTE[nCodeLen]; cOddCode = new BYTE[nOddLen]; cHexCode = new BYTE[nCodeLen]; cDeCode = new BYTE[nCodeLen]; cReturnCode = new BYTE[nRetLen]; memset(cCode, 0, sizeof(BYTE)*nCodeLen); memset(cTempCode, 0, sizeof(BYTE)*nCodeLen); memset(cOddCode, 0, sizeof(BYTE)*nOddLen); memset(cHexCode, 0, sizeof(BYTE)*nCodeLen); memset(cDeCode, 0, sizeof(BYTE)*nCodeLen); memset(cReturnCode, 0, sizeof(BYTE)*nRetLen); strncpy(cTempCode, strCode.c_str(), nCodeLen); // ÀÏ´Ü º¹»ç for (int i = 0; i < nCodeLen; i++) { // ¹®ÀÚ¸¦ HEX °ªÀ¸·Î ¹Ù²Û´Ù if ('A' <= cTempCode[i] && cTempCode[i] <= 'F') { cHexCode[nCodeLen-i-1] = cTempCode[i] - 'A' + 0xA; } else if ('0' <= cTempCode[i] && cTempCode[i] <= '9') { cHexCode[nCodeLen-i-1] = cTempCode[i] - '0' + 0x00; // º¸±â ÁÁÀ¸¶ó°í 0x00 Ãß°¡ } else { return ""; } } dwHexCode = 0; // BYTEÇü ¹è¿­ÀÇ °ªÀ» DWORD¿¡ ´ã´Â´Ù for (int i = 1; i <= nCodeLen; i++) { dwHexCode += (cHexCode[nCodeLen-i] & 0x0F); if (i < nCodeLen) dwHexCode = ((dwHexCode << 4) & 0xFFFFFFF0); } //------------------ key if (nKey){ int nTempKey, nQuotient, nRemainder; // ¸ò°ú ³ª¸ÓÁö int nIntKey, nOrderKey[3] = {0, 0, 0}; DWORD dwMask, dwMask1, dwMask2, dwMask3, dwMask4; // nKey¿Í »ó°ü°ü°è¿¡ ÀÇÇØ ³ª¿À´Â DWORD °ª (³× ¹øÂ° ÀÛ¾÷ ¿ë) nIntKey = nKey; nQuotient = 1; for (int i = 0, nTempKey = nKey; (nQuotient > 0 && i < 3); i++) { nQuotient = nTempKey / 10; nRemainder = nTempKey % 10; if (nQuotient > 0 || nRemainder > 0){ nTempKey = nQuotient; // if (nRemainder == 0) nRemainder = 1; nOrderKey[i] = nRemainder; } } // for (int i = 1; i < 3; i++){ // if (nOrderKey[i] == 0) nOrderKey[i] = nOrderKey[i - 1]; // } /* nIntKey = ((int)((dKey * 10) + 0.5)); // Á¤¼ö ºÎºÐ if (nIntKey == 0) nIntKey = 10; nKey1 = ((int)((dKey * 10) + 0.5)); // Á¤¼ö µÑ¤Š ÀÚ¸® if (0 >= nKey1 && nKey1 <= 100) { nKey1 = 10; } else if (10 <= nKey1 && nKey1 < 100) { nKey1 /= 10; } nKey2 = ((int)((dKey * 10) + 0.5)) % 10; // Á¤¼ö ù¹øÂ° ÀÚ¸® (0ÀÏ °æ¿ì´Â ¹Ýµå½Ã ÇÇÇØ¾ßÇÑ´Ù) if (nKey2 == 0) nKey2 = 10; nKey3 = (int)(dKey); // ¼Ò¼öÁ¡ ÀÌÇÏ Ã¹Â°ÀÚ¸® (0ÀÏ °æ¿ì´Â ¹Ýµå½Ã ÇÇÇØ¾ßÇÑ´Ù) if (nKey3 == 0) nKey3 = 10; */ dwMask = 0; dwMask1 = 0; dwMask2 = 0; dwMask3 = 0; dwMask4 = 0; for (int i = 0; i < nHexLen; i++) { // ¸¶½ºÅ©¸¦ ¸¸µç´Ù if (!(i % (nOrderKey[0] + 1))) dwMask1 += 1; if (i < nHexLen-1) dwMask1 = (dwMask1 << 1); if (!(i % (nOrderKey[1] + 1))) dwMask2 += 1; if (i < nHexLen-1) dwMask2 = (dwMask2 << 1); if (!(i % (nOrderKey[2] + 1))) dwMask3 += 1; if (i < nHexLen-1) dwMask3 = (dwMask3 << 1); if (!(i == nIntKey)) dwMask4 += 1; if (i < nHexLen-1) dwMask4 = (dwMask4 << 1); } dwMask = (nIntKey << nOrderKey[0]) | (nIntKey >> nOrderKey[1]) | (nIntKey ^ nOrderKey[2]) + ((dwMask1 | dwMask2 | dwMask3 | dwMask4) << nIntKey) + nIntKey; DWORD temp = 0; for (int i = 0; i < nCodeLen; i++){ temp = temp << 4; temp += 0x0F; } dwMask = dwMask & temp; dwHexCode ^= dwMask; } //------------------------------- dwDeCode = 0; // ù ¹øÂ° ÀÛ¾÷ for (int i = 0; i < nHexLen; i++) { dwDeCode += (dwHexCode >> i) & 1; if (i> nCount*4) & 0x0F; i++; nCount++; } for (int i = 0, j = 0; i < nCodeLen; i++) { if (i%2) { // Ȧ¼öÀÏ ¶§.. (µÎ ¹øÂ° ÀÛ¾÷À» À§ÇÑ ÀÛ¾÷) cDeCode[i] = cCode[i]; cOddCode[j] = cCode[i]; j++; } else { // ¦¼öÀÏ ¶§.. (¼¼ ¹øÂ° ÀÛ¾÷) cDeCode[i] = (~cCode[i] & 0x0F); } } for (int i = 0, j = nOddLen - 1; i < nCodeLen; i++) { if (i%2) { // Ȧ¼öÀÏ ¶§.. (µÎ ¹øÂ° ÀÛ¾÷) cDeCode[i] = cOddCode[j]; j--; } } for (int i = 0; i < nCodeLen; i++) { if (0x00 <= cDeCode[i] && cDeCode[i] <= 0x09) { cReturnCode[nCodeLen-i-1] = cDeCode[i] + '0' - 0x00; // º¸±â ÁÁÀ¸¶ó°í 0x00 Ãß°¡ } else if (0x0A <= cDeCode[i] && cDeCode[i] <= 0x0F) { cReturnCode[nCodeLen-i-1] = cDeCode[i] + 'A' - 0x0A; } else { return strReturnCode; } } cReturnCode[nCodeLen] = '\0'; // Á¾·á ¹®ÀÚ¿­ Ãß°¡ strReturnCode = strReturnCode.sprintf(cReturnCode); // ¹®ÀÚ¿­À» AnsiString¿¡ ´ã´Â´Ù strReturnCode = strReturnCode.UpperCase(); // ´ë¹®ÀÚ·Î.. if (cCode) { delete [] cCode; cCode = NULL; } if (cTempCode) { delete [] cTempCode; cTempCode = NULL; } if (cOddCode) { delete [] cOddCode; cOddCode = NULL; } if (cHexCode) { delete [] cHexCode; cHexCode = NULL; } if (cDeCode) { delete [] cDeCode; cDeCode = NULL; } if (cReturnCode) { delete [] cReturnCode; cReturnCode = NULL;} if (nPointPosition > 0) { strReturnCode.Insert(".", nPointPosition); } return strReturnCode; // AnsiStringÇüÀ¸·Î Return } //--------------------------------------------------------------------------- AnsiString __fastcall TCrypt::EnCode(AnsiString strCode, double dKey1, unsigned int nKey2) { // ¾Ïȣȭ // ¾Ïȣȭ ¹æ¹ý : // ½ºÅ¸Àϸ®½ºÆ®°¡ ¼³Ä¡µÈ Çϵåµð½ºÅ© µå¶óÀ̺êÀÇ ½Ã¸®¾ó¹øÈ£¸¦ AnsiStringÀ¸·Î ¹Þ´Â´Ù // AnsiStringÀ¸·Î ¹ÞÀº °ªÀ» Hex°ªÀ¸·Î º¯È¯ÇÑ´Ù // ù ¹øÂ° ÀÛ¾÷ : Hex °ªÀ¸·Î ÇÑÀÚ¸® ¸¶´Ù ¦¼öÀÏ °æ¿ì Not¿¬»êÀ» ÇÑ´Ù // µÎ ¹øÂ° ÀÛ¾÷ : ù ¹ø¤Š ƒ„À» Hex °ªÀ¸·Î ÇÑÀÚ¸® ¸¶´Ù Ȧ¼öÀÏ °æ¿ì °Å²Ù·Î ¹è¿­ÇÑ´Ù // ¼¼ ¹øÂ° ÀÛ¾÷ : µÎ ¹øÂ° °ªÀÇ ºñÆ®¸¦ µÚÁý´Â´Ù (Áï, ù¹øÂ° ºñÆ®¿Í ¸¶Áö¸· ºñÆ®¸¦ swap) // ÀÌ °ªÀÇ Hex°ªÀÌ °á°úÄÚµåÀÌ´Ù // ¿¹) D04A9883 ÀÏ °æ¿ì ºñƮȭÇϸé // 1101 0000 0100 1010 1001 1000 1000 0011 // ¨çȦ ¨è¦ ¨éȦ ¨ê¦ ¨ëȦ ¨ì¦ ¨íȦ ¨î¦ // D 0 4 A 9 8 8 3 // // 1101 1111 0101 0101 1001 0111 1000 1100 - ù ¹øÂ° ÀÛ¾÷ // ¨çȦ ¨è¦ ¨éȦ ¨ê¦ ¨ëȦ ¨ì¦ ¨íȦ ¨î¦ // D F 4 5 9 7 8 C // // 1000 1111 1001 0101 0100 0111 1101 1100 - µÎ ¹øÂ° ÀÛ¾÷ // ¨íȦ ¨è¦ ¨ëȦ ¨ê¦ ¨éȦ ¨ì¦ ¨çȦ ¨î¦ // 8 F 9 5 4 7 D C // // 0011 1011 1110 0010 1010 1001 1111 0001 - ¼¼ ¹øÂ° ÀÛ¾÷ // ¨íȦ ¨è¦ ¨ëȦ ¨ê¦ ¨éȦ ¨ì¦ ¨çȦ ¨î¦ // 3 B E 2 A 9 F 1 BYTE *cCode; BYTE *cOddCode; BYTE *cEnCode; BYTE *cReturnCode; AnsiString strAddZero, strReturnCode = ""; // ÃʱâÈ­ if (dKey1 == 0.0 && nKey2 == 0) { nCodeLen = strCode.Length(); // ¾Ïȣȭ, º¹È£È­ ÄÚµåÀÇ ¹®ÀÚ¿­ ±æÀÌ } else { nCodeLen = 8; strAddZero = AnsiString::StringOfChar('0', 8-strCode.Length()); strCode = strAddZero + strCode; } nOddLen = nCodeLen / 2; // nCodeLen / 2 // Ȧ¼ö¹øÂ° ÄÚµåÀÇ ¹®ÀÚ¿­ ±æÀÌ nRetLen = nCodeLen + 1; // nCodeLen + 1 // ¸®ÅÏ ÄÚµå¿ëÀ¸·Î '\0'À» ºÙÀÏ ¹®ÀÚ¿­ ±æÀÌ nHexLen = nCodeLen * 4; // nCodeLen*4 // ºñÆ®¸¦ µÚÁýÀ»¶§ »ç¿ë cCode = new BYTE[nCodeLen]; cOddCode = new BYTE[nCodeLen]; cEnCode = new BYTE[nCodeLen]; cReturnCode = new BYTE[nRetLen]; memset(cCode, 0, sizeof(BYTE)*nCodeLen); memset(cOddCode, 0, sizeof(BYTE)*nCodeLen); memset(cEnCode, 0, sizeof(BYTE)*nCodeLen); memset(cReturnCode, 0, sizeof(BYTE)*nRetLen); strncpy(cCode, strCode.c_str(), nCodeLen); // ÀÏ´Ü º¹»ç for (int i = 0, j = 0; i < nCodeLen; i++) { if (i%2) { // Ȧ¼öÀÏ ¶§.. (ù ¹øÂ° ÀÛ¾÷À» À§ÇÑ ÀÛ¾÷) cEnCode[i] = cCode[i]; cOddCode[j] = cCode[i]; j++; } else { // ¦¼öÀÏ ¶§.. (µÎ ¹øÂ° ÀÛ¾÷) cEnCode[i] = (~cCode[i] & 0xFF); } } for (int i = 0, j = nOddLen - 1; i < nCodeLen; i++) { if (i%2) { // Ȧ¼öÀÏ ¶§.. (ù ¹øÂ° ÀÛ¾÷) cEnCode[i] = cOddCode[j]; j--; } } //---------------------------------------------------------------------- key if (dKey1 > 0.0 && nKey2 > 0) { int nTempKey, nQuotient, nRemainder; // ¸ò°ú ³ª¸ÓÁö int nIntKey, nOrderKey[4] = {0, 0, 0, 0}; nIntKey = ((dKey1 + 0.005) * 100) + nKey2; nQuotient = 1; for (int i = 0, nTempKey = nIntKey; (nQuotient > 0 && i < 4); i++) { nQuotient = nTempKey / 10; nRemainder = nTempKey % 10; if (nQuotient > 0 || nRemainder > 0){ nTempKey = nQuotient; nOrderKey[i] = nRemainder; } } cEnCode[0] = BitShift(cEnCode[0], nOrderKey[0], true); cEnCode[1] = BitShift(cEnCode[1], nOrderKey[1], true); cEnCode[2] = BitShift(cEnCode[2], nOrderKey[2], true); cEnCode[3] = BitShift(cEnCode[3], nOrderKey[3], true); cEnCode[4] = BitShift(cEnCode[4], nOrderKey[3], true); cEnCode[5] = BitShift(cEnCode[5], nOrderKey[2], true); cEnCode[6] = BitShift(cEnCode[6], nOrderKey[1], true); cEnCode[7] = BitShift(cEnCode[7], nOrderKey[0], true); } else if (dKey1 > 0.0) { int nTempKey, nQuotient, nRemainder; // ¸ò°ú ³ª¸ÓÁö int nIntKey, nOrderKey[3] = {0, 0, 0}; nIntKey = (dKey1 + 0.005) * 100 + nKey2; nQuotient = 1; for (int i = 0, nTempKey = nIntKey; (nQuotient > 0 && i < 3); i++) { nQuotient = nTempKey / 10; nRemainder = nTempKey % 10; if (nQuotient > 0 || nRemainder > 0){ nTempKey = nQuotient; nOrderKey[i] = nRemainder; } } cEnCode[0] = BitShift(cEnCode[0], nOrderKey[0], true); cEnCode[1] = BitShift(cEnCode[1], nOrderKey[1], true); cEnCode[2] = BitShift(cEnCode[2], nOrderKey[2], true); cEnCode[3] = BitShift(cEnCode[3], nOrderKey[2], true); cEnCode[4] = BitShift(cEnCode[4], nOrderKey[1], true); cEnCode[5] = BitShift(cEnCode[5], nOrderKey[0], true); cEnCode[6] = BitShift(cEnCode[6], nOrderKey[1], true); cEnCode[7] = BitShift(cEnCode[7], nOrderKey[2], true); } else if (nKey2 > 0) { /* cEnCode[0] = BitShift(cEnCode[0], nKey2, true); cEnCode[1] = BitShift(cEnCode[1], nKey2, true); cEnCode[2] = BitShift(cEnCode[2], nKey2, true); cEnCode[3] = BitShift(cEnCode[3], nKey2, true); cEnCode[4] = BitShift(cEnCode[4], nKey2, true); cEnCode[5] = BitShift(cEnCode[5], nKey2, true); cEnCode[6] = BitShift(cEnCode[6], nKey2, true); cEnCode[7] = BitShift(cEnCode[7], nKey2, true); */ ByteShift(cEnCode, nKey2, true); } if (dKey1 > 0.0 || nKey2 > 0) { strReturnCode = "00000000"; } else { strAddZero = AnsiString::StringOfChar(' ', strCode.Length()); strReturnCode = strAddZero; } for (int i = 0; i < nCodeLen; i++) { strReturnCode.c_str()[i] = cEnCode[i]; } if (cCode) { delete [] cCode; cCode = NULL; } if (cOddCode) { delete [] cOddCode; cOddCode = NULL; } if (cEnCode) { delete [] cEnCode; cEnCode = NULL; } if (cReturnCode) { delete [] cReturnCode; cReturnCode = NULL; } return strReturnCode; // AnsiStringÇüÀ¸·Î Return } //--------------------------------------------------------------------------- AnsiString __fastcall TCrypt::DeCode(AnsiString strCode, double dKey1, unsigned int nKey2) { // º¹È£È­ (¾ÏȣȭÀÇ ¿ª¼ø) // º¹È£È­ ¹æ¹ý : // ½ºÅ¸Àϸ®½ºÆ®°¡ ¼³Ä¡µÈ Çϵåµð½ºÅ© µå¶óÀ̺êÀÇ ¾ÏȣȭµÈ ½Ã¸®¾ó¹øÈ£¸¦ AnsiStringÀ¸·Î ¹Þ´Â´Ù // AnsiStringÀ¸·Î ¹ÞÀº °ªÀ» Hex°ªÀ¸·Î º¯È¯ÇÑ´Ù // ù ¹øÂ° ÀÛ¾÷ : ù ¹øÂ° °ªÀÇ ºñÆ®¸¦ µÚÁý´Â´Ù (Áï, ù¹øÂ° ºñÆ®¿Í ¸¶Áö¸· ºñÆ®¸¦ swap) // µÎ ¹øÂ° ÀÛ¾÷ : µÎ ¹ø¤Š ƒ„À» Hex °ªÀ¸·Î ÇÑÀÚ¸® ¸¶´Ù Ȧ¼öÀÏ °æ¿ì °Å²Ù·Î ¹è¿­ÇÑ´Ù // ¼¼ ¹øÂ° ÀÛ¾÷ : Hex °ªÀ¸·Î ÇÑÀÚ¸® ¸¶´Ù ¦¼öÀÏ °æ¿ì Not¿¬»êÀ» ÇÑ´Ù // ³× ¹øÂ° ÀÛ¾÷ : Hex °ªÀ¸·Î ÇÑÀÚ¸® ¸¶´Ù ¦¼öÀÏ °æ¿ì Not¿¬»êÀ» ÇÑ´Ù // ¾ÏȣȭÀÇ ¿ª¼ø!! BYTE *cCode; BYTE *cOddCode; BYTE *cDeCode; BYTE *cReturnCode; int nCount; // DWORD¿¡¼­ 4Bit¾¿ ²÷¾î¼­ ¹®ÀÚ¿­¿¡ ´ãÀ»¶§ »ç¿ë AnsiString strReturnCode = ""; int nPointPosition; // ÃʱâÈ­ if (dKey1 == 0.0 && nKey2 == 0) { nCodeLen = strCode.Length(); // ¾Ïȣȭ, º¹È£È­ ÄÚµåÀÇ ¹®ÀÚ¿­ ±æÀÌ } else { nCodeLen = 8; } nCodeLen = strCode.Length(); // ¾Ïȣȭ, º¹È£È­ ÄÚµåÀÇ ¹®ÀÚ¿­ ±æÀÌ nOddLen = nCodeLen / 2; // nCodeLen / 2 // Ȧ¼ö¹øÂ° ÄÚµåÀÇ ¹®ÀÚ¿­ ±æÀÌ nRetLen = nCodeLen + 1; // nCodeLen + 1 // ¸®ÅÏ ÄÚµå¿ëÀ¸·Î '\0'À» ºÙÀÏ ¹®ÀÚ¿­ ±æÀÌ nHexLen = nCodeLen * 4; // nCodeLen*4 // ºñÆ®¸¦ µÚÁýÀ»¶§ »ç¿ë cCode = new BYTE[nCodeLen]; cOddCode = new BYTE[nOddLen]; cDeCode = new BYTE[nCodeLen]; cReturnCode = new BYTE[nRetLen]; memset(cCode, 0, sizeof(BYTE)*nCodeLen); memset(cOddCode, 0, sizeof(BYTE)*nOddLen); memset(cDeCode, 0, sizeof(BYTE)*nCodeLen); memset(cReturnCode, 0x20, sizeof(BYTE)*nRetLen); // °ø¹é strncpy(cCode, strCode.c_str(), nCodeLen); // ÀÏ´Ü º¹»ç //---------------------------------------------------------------------- key if (dKey1 > 0.0 && nKey2 > 0) { int nTempKey, nQuotient, nRemainder; // ¸ò°ú ³ª¸ÓÁö int nIntKey, nOrderKey[4] = {0, 0, 0, 0}; nIntKey = ((dKey1 + 0.005) * 100) + nKey2; nQuotient = 1; for (int i = 0, nTempKey = nIntKey; (nQuotient > 0 && i < 4); i++) { nQuotient = nTempKey / 10; nRemainder = nTempKey % 10; if (nQuotient > 0 || nRemainder > 0){ nTempKey = nQuotient; nOrderKey[i] = nRemainder; } } cCode[0] = BitShift(cCode[0], nOrderKey[0], false); cCode[1] = BitShift(cCode[1], nOrderKey[1], false); cCode[2] = BitShift(cCode[2], nOrderKey[2], false); cCode[3] = BitShift(cCode[3], nOrderKey[3], false); cCode[4] = BitShift(cCode[4], nOrderKey[3], false); cCode[5] = BitShift(cCode[5], nOrderKey[2], false); cCode[6] = BitShift(cCode[6], nOrderKey[1], false); cCode[7] = BitShift(cCode[7], nOrderKey[0], false); } else if (dKey1 > 0.0) { int nTempKey, nQuotient, nRemainder; // ¸ò°ú ³ª¸ÓÁö int nIntKey, nOrderKey[3] = {0, 0, 0}; nIntKey = (dKey1 + 0.005) * 100; nQuotient = 1; for (int i = 0, nTempKey = nIntKey; (nQuotient > 0 && i < 3); i++) { nQuotient = nTempKey / 10; nRemainder = nTempKey % 10; if (nQuotient > 0 || nRemainder > 0){ nTempKey = nQuotient; nOrderKey[i] = nRemainder; } } cCode[0] = BitShift(cCode[0], nOrderKey[0], false); cCode[1] = BitShift(cCode[1], nOrderKey[1], false); cCode[2] = BitShift(cCode[2], nOrderKey[2], false); cCode[3] = BitShift(cCode[3], nOrderKey[2], false); cCode[4] = BitShift(cCode[4], nOrderKey[1], false); cCode[5] = BitShift(cCode[5], nOrderKey[0], false); cCode[6] = BitShift(cCode[6], nOrderKey[1], false); cCode[7] = BitShift(cCode[7], nOrderKey[2], false); } else if (nKey2 > 0) { /* cCode[0] = BitShift(cCode[0], nKey2, false); cCode[1] = BitShift(cCode[1], nKey2, false); cCode[2] = BitShift(cCode[2], nKey2, false); cCode[3] = BitShift(cCode[3], nKey2, false); cCode[4] = BitShift(cCode[4], nKey2, false); cCode[5] = BitShift(cCode[5], nKey2, false); cCode[6] = BitShift(cCode[6], nKey2, false); cCode[7] = BitShift(cCode[7], nKey2, false); */ ByteShift(cCode, nKey2, false); } for (int i = 0, j = 0; i < nCodeLen; i++) { if (i%2) { // Ȧ¼öÀÏ ¶§.. (µÎ ¹øÂ° ÀÛ¾÷À» À§ÇÑ ÀÛ¾÷) cDeCode[i] = cCode[i]; cOddCode[j] = cCode[i]; j++; } else { // ¦¼öÀÏ ¶§.. (¼¼ ¹øÂ° ÀÛ¾÷) cDeCode[i] = (BYTE)(~cCode[i] & 0xFF); } } for (int i = 0, j = nOddLen - 1; i < nCodeLen; i++) { if (i%2) { // Ȧ¼öÀÏ ¶§.. (µÎ ¹øÂ° ÀÛ¾÷) cDeCode[i] = cOddCode[j]; j--; } } // '\0' ¾Æ´Ñ ¼ø°£ºÎÅÍ ÀԷµȴÙ. bool bInput = false; for (int i = 0; i < nCodeLen; i++) { if (!bInput && cDeCode[i] != '\0') bInput = true; if (bInput) cReturnCode[i] = cDeCode[i]; } cReturnCode[nCodeLen] = '\0'; // Á¾·á ¹®ÀÚ¿­ Ãß°¡ strReturnCode = strReturnCode.sprintf(cReturnCode); // ¹®ÀÚ¿­À» AnsiString¿¡ ´ã´Â´Ù strReturnCode = strReturnCode.Trim(); if (cCode) { delete [] cCode; cCode = NULL; } if (cOddCode) { delete [] cOddCode; cOddCode = NULL; } if (cDeCode) { delete [] cDeCode; cDeCode = NULL; } if (cReturnCode) { delete [] cReturnCode; cReturnCode = NULL;} return strReturnCode; // AnsiStringÇüÀ¸·Î Return } //--------------------------------------------------------------------------- BYTE __fastcall TCrypt::BitShift(BYTE cData, int nShiftCount, bool bLeft) { bool bByte[8], bShiftByte[8]; int nRealShiftCnt; BYTE cReturn; memset(bByte, false, sizeof(bByte)); for (int i = 0; i < 8; i++) { if (((cData >> 7-i) & 1) == 1) { bByte[i] = true; } } nRealShiftCnt = nShiftCount % 8; if (bLeft) { // EnCode ½Ã¿¡ <- ÂÊÀ¸·Î ºñÆ®°¡ Left ShiftÇÑ´Ù for (int i = 0; i < 8; i++) { bShiftByte[(8+i-nRealShiftCnt)%8] = bByte[i]; } } else { // DeCode½Ã¿¡ -> ÂÊÀ¸·Î ºñÆ®°¡ Right ShiftÇÑ´Ù for (int i = 0; i < 8; i++) { bShiftByte[(i+nRealShiftCnt)%8] = bByte[i]; } } cReturn = 0; for (int i = 0; i < 8; i++) { cReturn = cReturn << 1; if (bShiftByte[i]) { cReturn += 1; } else { cReturn += 0; } } return cReturn; } //--------------------------------------------------------------------------- void __fastcall TCrypt::ByteShift(BYTE *cData, unsigned int nShiftCount, bool bLeft) { bool bByte[64]; bool bShiftByte[64]; int nRealShiftCnt; BYTE ShiftByte[8], cReturn[8]; memset(bByte, false, sizeof(bByte)); for (int i = 0; i < 64; i++){ if (((cData[i/8] >> 7-(i%8)) & 1) == 1) { bByte[i] = true; } } nRealShiftCnt = nShiftCount % 64; if (bLeft) { // EnCode ½Ã¿¡ <- ÂÊÀ¸·Î byte°¡ Left ShiftÇÑ´Ù for (int i = 0; i < 64; i++) { bShiftByte[(64+i-nRealShiftCnt)%64] = bByte[i]; } } else { // DeCode½Ã¿¡ -> ÂÊÀ¸·Î byte°¡ Right ShiftÇÑ´Ù for (int i = 0; i < 64; i++) { bShiftByte[(i+nRealShiftCnt)%64] = bByte[i]; } } memset(cData, 0, 8); for (int i = 0; i < 64; i++) { cData[i/8] = cData[i/8] << 1; if (bShiftByte[i]) { cData[i/8] += 1; } else { cData[i/8] += 0; } } /* for (int i = 0; i < 8; i++) { cData[i] = cData[i] << 8; if (bShiftByte[i]) { cData[i] += 1; } else { cData[i] += 0; } } */ } //---------------------------------------------------------------------------