1. Теперь за форумную активность начисляются биткоины и другие криптоденьги. Подробнее.
    Скрыть объявление
  2. Появилась архивная версия форума arhiv.xaker.name, где собраны темы с 2007 по 2012 год.
    Скрыть объявление

[c++] base64 Encode/Decode

Тема в разделе "C/C++", создана пользователем Mr.Burns, 13 фев 2012.

  1. Mr.Burns
    Mr.Burns местная мразь Продвинутый
    Симпатии:
    65
    Код:
    #include <windows.h>
    
    static char charBase64[] = {
    	'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P',
    	'Q','R','S','T','U','V','W','X','Y','Z','a','b','c','d','e','f',
    	'g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v',
    	'w','x','y','z','0','1','2','3','4','5','6','7','8','9','+','/' };
    
    
    
    static int indexBase64[] = {
    	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
    	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
    	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,62, -1,-1,-1,63,
    	52,53,54,55, 56,57,58,59, 60,61,-1,-1, -1,-1,-1,-1,
    	-1, 0, 1, 2,  3, 4, 5, 6,  7, 8, 9,10, 11,12,13,14,
    	15,16,17,18, 19,20,21,22, 23,24,25,-1, -1,-1,-1,-1,
    	-1,26,27,28, 29,30,31,32, 33,34,35,36, 37,38,39,40,
    	41,42,43,44, 45,46,47,48, 49,50,51,-1, -1,-1,-1,-1,
    	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
    	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
    	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
    	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
    	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
    	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
    	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1,
    	-1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1, -1,-1,-1,-1 };
    
    
    ULONG Base64Encode (LPSTR lpszInputString, LPSTR lpOutputBuffer, SIZE_T nMaxLength)
    {
    	char chr[3], enc[4];
    
    	int outpos = 0;
    
    	for( int i=0; i<lstrlenA(lpszInputString); i+=3 )
    	{
    		if( outpos+4 >= nMaxLength )
    			break;
    
    		chr[0] = lpszInputString;
    		chr[1] = lpszInputString[i+1];
    		chr[2] = lpszInputString[i+2];
    
    		enc[0] = chr[0] >> 2;
    		enc[1] = ((chr[0] & 0x03) << 4) | (chr[1] >> 4);
    		enc[2] = ((chr[1] & 0x0F) << 2) | (chr[2] >> 6);
    		enc[3] = chr[2] & 0x3F;
    
    		lpOutputBuffer[outpos++] = charBase64[enc[0]];
    		lpOutputBuffer[outpos++] = charBase64[enc[1]];
    
    		if( i+1 >= lstrlenA(lpszInputString) )
    		{
    			lpOutputBuffer[outpos++] = '=';
    			lpOutputBuffer[outpos++] = '=';
    		}
    		else if( i+2 >= lstrlenA(lpszInputString) )
    		{
    			lpOutputBuffer[outpos++] = charBase64[enc[2]];
    			lpOutputBuffer[outpos++] = '=';
    		}
    		else
    		{
    			lpOutputBuffer[outpos++] = charBase64[enc[2]];
    			lpOutputBuffer[outpos++] = charBase64[enc[3]];
    		}
    	}
    
    	lpOutputBuffer[outpos] = 0;
    	return outpos;
    }
    
    
    ULONG Base64Decode (LPTSTR lpszInputString, LPTSTR lpOutputBuffer, SIZE_T nMaxLength)
    {
    	char chr[3], enc[4];
    
    	int outpos = 0;
    
    	for( int i=0; i<lstrlen(lpszInputString); i+=4 )
    	{
    		if( outpos+3 >= nMaxLength )
    			break;
    
    		enc[0] = indexBase64[lpszInputString];
    		enc[1] = indexBase64[lpszInputString[i+1]];
    		enc[2] = indexBase64[lpszInputString[i+2]];
    		enc[3] = indexBase64[lpszInputString[i+3]];
    
    		if( enc[0] == -1 || enc[1] == -1 )
    			break;
    
    		chr[0] = (enc[0] << 2) | (enc[1] >> 4);
    		chr[1] = ((enc[1] & 15) << 4) | (enc[2] >> 2);
    		chr[2] = ((enc[2] & 3) << 6) | enc[3];
    
    		lpOutputBuffer[outpos++] = chr[0];
    
    		if( enc[2] != -1 )
    		{
    			lpOutputBuffer[outpos++] = chr[1];
    		}
    
    		if( enc[3] != -1 )
    		{
    			lpOutputBuffer[outpos++] = chr[2];
    		}
    	}
    
    	lpOutputBuffer[outpos] = 0;
    	return outpos;
    }


    использование
    Код:
    void _WinMainCRTStartup()
    {
    	char buffEncode[50];
    	char buffDecode[50];
    
    	Base64Encode("password",buffEncode,sizeof(buffEncode));
    	MessageBox(0,buffEncode,0,0);
    
    	Base64Decode(buffEncode,buffDecode,sizeof(buffDecode));
    	MessageBox(0,buffDecode,0,0);
    
    	ExitProcess(0);
    }
     
    13 фев 2012
  2. Dr. MefistO
    Dr. MefistO Крывіч Глобальный модератор
    Симпатии:
    123
    Подскажи, как написать кодер/декодер Base64, где использован свой алфавит.
     
    13 фев 2012
  3. Mr.Burns
    Mr.Burns местная мразь Продвинутый
    Симпатии:
    65
    не подскажу, т.к. не силён в криптографии.
    код - копипаст, что очевидно.
     
    13 фев 2012

Поделиться этой страницей

Загрузка...